2 Wege Kommunikation zwischen Python/selenium Code und von Diesem in Seite eingefügten Javascript Code?

berndoa

Top Contributor
Hallo,
ich weiß dass das hier primär ein Java Forum ist.
Aber vielleicht kann mir trotzdem Jemand helfen, in einem Pythojn Forum kriege ich shclicht gar keine Antworten :-/

Worum gehts:
Ich baue mir einen Roulette Bot (jap, das Selbe hatte ich shcon mal in java gemacht. Und nin, ich will keine GUO bauen oder sowas.
Das Onlinecasino hat seinen eigenen Roulettetisch.

Jedenfalls, allgemein gesprochen, mahce ich mit Pyhton+Selenium den browser auf, navigiere zur Wunschseite.
Und "injecte" da mit
Python:
webdriver.executescript("//Hier könnte ihr Javascript Code stehen")
einen gewissen Javascript Code in die Seite, der Javascript Code wird also Teil der Seite/Dom und halt ausgeführt, so als würde ich ihn in der Developer Console ausführen.

Javascript Code selbst sorgt dafür dass das Standardverhalten dahingehend überschrieben wird dass Network Request und Responses getrackt werden.
Und Javascript mir also bspw. immer die Requests in die Konsole druckt.


Nun will ich aber dass die Infos, die der Javascript Code da so "abfängt", dem Python/Selenium Code zur Verfügung steht.
Weil, so mein Verständnis, Webseite+Javascript sind ja eine Sache.
Oder Python/Selenium sind auf der anderen Seite.

un der Eine hat lider nicht Zugriff auf die Sachen des Anderen.

Frage nun, wie kann ich Infos bzw generell Strings, Json Daten, etc. zwischen den Beidne hin und herschicken?

Also konkret bspw. der Javascript Code eine Network Request abfängt, deren Daten in einen hübschen String packt (bereits implementiert)
und an den python code übermittelt.
Und der Python Code, ähnlich wie einem eventlistener, reagiert dann auf die Eintreffenden Daten und verwertet Diese.
Je nahc Ergebnis dieser Verwertung shccikt python dann wieder eine Anweisung an den Javascript code zurück.


Kurzum, ich brauche eine Kommunikationsmöglichkeit in beide Richtungen, wo ich auch eine Art "Listener" habe.

Geht sowas irgendwie?

Chatgpt meinte, da nutzt man normal websockets.
Die es aber ohne eigenen server nicht gibt.
Und mir auch zu "ovekrill" vorkommen da ja python/selenium, javascirpt und Co. sprichwörltich Alles auf meinem Notebook hier laufen und dem gleichen Skript entspringen.
Warum also so tun, als würdne hier 2 separate Server an verschiednen Ärs.. der Welt miteinander übers Internet kommunizieren?

Chatgpt hat aber auch keine andere gute Lösung.
Und Google findet mir direkt zu dem Thema nichts wirklich gutes oder ich suche nicht nahc den richtigen Stichworten.
Offenbar qurde dieses Problem noch nicht oft gefragt oder die Lösung ist so selsbtverständlich dass nur ich sie nicht kenne.

Kann mir Jemand einen guten Tipp geben? :)
 

Marinek

Bekanntes Mitglied
Also ich musste hier mehrfach lesen. Üblicherweise haben deine Beiträge nicht so viel Probleme mit richtigen Buchstaben / Wort, daher würde ich mal prüfen, was da bei dir schief läuft.

How ever: Was du versuchst zu lösen ist zunächst ein Interprozess Kommunikations Problem.

Du hast mehrere Prozesse: Selenium Webdriver, der JS Script was macht und dann möchtest du das mit python verarbeiten.

Kenne mich mit Selenium Webdriver nicht so aus. Habe ich noch nie benutzt. Daher gehe ich bei deiner Frage davon aus, dass man keine python scripte darin verwendne kann und der webdriver per se auch keine Rückgaben hat.

Dann ist das nächste naheliegende mit dem Java Script ein Ajax call zu machen, der dann einen Prozess ansprechen kann, der auf http://localhost läuft. Dieser Prozess könnte also durch eine python Anwendung ermöglicht werden.

Chat GPT sagt dazu:


Code:
from selenium import webdriver

# Webdriver initialisieren
driver = webdriver.Chrome()  # Du musst den richtigen Treiber verwenden (z.B. Chrome, Firefox)

# Webseite laden
driver.get("https://deine-webseite.com")

# JavaScript-Code mit AJAX ausführen
js_code = """
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost/deine-endpoint", true);
xhr.onreadystatechange = function () {
  if (xhr.readyState == 4 && xhr.status == 200) {
    console.log(xhr.responseText);
  }
};
xhr.send();
"""

driver.execute_script(js_code)

# Webdriver beenden
driver.quit()

Da das Beispiel auch Rückgabewerte des Python-Servers verarbeiten kann, müsste man also relativ einfach auch den Rückhgabewert hinbekommen.

Gib mal bescheid, ob das hilft.
 

berndoa

Top Contributor
Öh, Selenium ist im Prinzip nur billiger Python Code bzw. eine dort benutzte Bibliothek.

Ist einfach ne Python Datei, die ausgeführt wird.

Konkret sieht mein Code so aus:
Python:
import os
import time
from selenium import webdriver
import threading

# Specify the path to the ChromeDriver executable using a raw string (r-string)
chrome_driver_path = r'C:\Users\...\chromedriver.exe'

# Set the PATH environment variable to the directory containing the ChromeDriver executable
os.environ['PATH'] += os.pathsep + chrome_driver_path

# Set up the Chrome WebDriver with the specified executable path
options = webdriver.ChromeOptions()
options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"  # Path to Chrome executable
options.add_argument('--disable-extensions')  # Optional: Disable extensions if desired
options.add_argument('--enable-logging')  # Enables logging of console messages
options.add_argument('--enable-features=UnloadBrowsingContext')


driver = webdriver.Chrome(options=options)





# Inject the JavaScript code to capture request and response data and save it to a growing text file
js_code = """
    (function (xhr) {
        var XHR = XMLHttpRequest.prototype;
        var open = XHR.open;
        var send = XHR.send;
        var setRequestHeader = XHR.setRequestHeader;

        XHR.open = function (method, url) {
            this._method = method;
            this._url = url;
            this._requestHeaders = {};
            this._startTime = (new Date()).toISOString();

            return open.apply(this, arguments);
        };

        XHR.setRequestHeader = function (header, value) {
            this._requestHeaders[header] = value;
            return setRequestHeader.apply(this, arguments);
        };

        XHR.send = function (postData) {
            var that = this;

            this.addEventListener('load', function () {
                var endTime = (new Date()).toISOString();

                var myUrl = that._url ? that._url.toLowerCase() : that._url;
                if (myUrl) {
                    var requestData = {
                        method: that._method,
                        url: myUrl,
                        headers: that._requestHeaders
                    };

                    var responseHeaders = that.getAllResponseHeaders();
                    var responseBody = that.response;

                    var responseData = {
                        url: myUrl,
                        statusCode: that.status,
                        responseHeaders: responseHeaders,
                        responseBody: responseBody
                    };


                }
            });

            return send.apply(this, arguments);
        };
    })(XMLHttpRequest);
"""



# Go to roulette table site
driver.get(r"https://netent-static.casinomodule.com/games/frenchroulette3_mobile_html/game/frenchroulette3_mobile_html.xhtml?staticServer=https%3A%2F%2Fnetent-static.casinomodule.com%2F&targetElement=netentgame&flashParams.bgcolor=000000&gameId=frenchroulette3_not_mobile&mobileParams.lobbyURL=https%253A%252F%252Fgames.netent.com%252Ftable-games%252Ffrench-roulette%252F&server=https%3A%2F%2Fnetent-game.casinomodule.com%2F&lang=en&sessId=DEMO-3376043969-EUR&operatorId=default")


# Inject the JavaScript code and pass the Python function to the page
driver.execute_script(js_code)

driver.quit()

Der Javascript Part, gespeichert in der js_code Variable, sieht zwar lang aus, aber überschreibt nur das Standardverhalten wie der Browser mit Netzwerk Requests und so umgeht. Frag mich nicht wie oder warum es funktioniert aber es funktioniert :)

Bspw. kann ich damit einstellen dass ein grünes Quadrat gemalt wird wenn eine Request mit dem Wort "Gurke" reinkommt.
Die Request wird danach natürlich trotzdem ausgeführt, nur halt so Man in the MIddle mässig mitgelesen.
Und die Infos aus den "abgefangenen" Requests würde ich halt gerne im eigentlichen Python Code als String variable oder sowas verwenden können.
Weil wenn nur der Javascript Codes diese infos hat, kann es das maximal in der Konsole drucken aber mehr auch nicht.
Selbst nur was in einer lokalen Datei schreiben geht shcon nicht wegen irgendwelchen
"Sicherheitsrisiken uwuwu BS", wegen der Javascript im browser so gut wie gar nix darf was über die Webseitendarstellung hinausgeht.


Mein Python Code und die in die Webseite reingeschcikten Javascript Teile müssen einfach miteinander kommunizieren können.

Oder auch, damit bspw. javascript mit passenden Listenern die Position von Klicks auf ein bestimmtes DOM Element abfangen kann und ich das im Python Code dann wiederum verwenden kann.
Ich muss einfach zwischen webseite/javascript und Python Code Daten hin und her austauschen können.
 
Zuletzt bearbeitet:

berndoa

Top Contributor

Scheinbar kann man da aber auch nur ein biischen busy waiting betreiben und die Webseite auf DOM Veränderungen hin testen.

Direkt mit von Javascript gefundenen Werten kann man wohl nicht interagieren
 

mihe7

Top Contributor
Direkt mit von Javascript gefundenen Werten kann man wohl nicht interagieren
Hier:
Also konkret bspw. der Javascript Code eine Network Request abfängt, deren Daten in einen hübschen String packt (bereits implementiert)
und an den python code übermittelt.
Und der Python Code, ähnlich wie einem eventlistener, reagiert dann auf die Eintreffenden Daten und verwertet Diese.
Je nahc Ergebnis dieser Verwertung shccikt python dann wieder eine Anweisung an den Javascript code zurück.

Du könntest z. B. die Logmeldungen per BiDi-API abfangen, außerdem kannst Du dann auch per execute_script Werte an/von JavaScript senden/empfangen.
 

Ähnliche Java Themen

Neue Themen


Oben