Hallo zusammen,
das Thema ist nicht neu, ich habe aber leider weder bei Tante Google noch hier bisher die Lösung für mein Problem gefunden.
Ich möchte unter Linux (Debian) aus einem Python-Script heraus einen Browser inklusive URL aufrufen (ob Firefox oder Chrome ist an der Stelle egal) und an die dahinterliegende Webseite dann Daten schicken, die in ein Formular eingetragen werden - es können auch einfach nur Tastendrücke sein. Ich habe auch leider die Einschränkung, dass ich Module nutzen muss, die bereits im Debian Repository vorhanden sind.
Alternativ ginge es auch, den Browser und die Webseite separat zu öffnen und "nur" den Fokus auf die Webseite zu legen und dann die Daten oder auch nur einzelne Keyboard-Events abzusenden. Ich muss auf der Arbeit immer sehr ähnliche Inhalte in unterschiedliche Webformulare eingeben, und das ist schon so ein brain-damaging Job, das würde ich gerne zumindest teilweise automatisieren.
Aktuell habe ich diesen Ansatz hier:
[...]
fillform = subprocess.Popen([browser,url_pdr], stdin=subprocess.PIPE)
>> An der Stelle geht der Browser meiner Wahl brav auf, auch mit der ausgewählten URL
time.sleep(7)
>> Damit die Seite in Ruhe komplett laden kann
fillform.communicate(input=b'tescht')
>> An dieser Stelle würde ich erwarten, dass (sofern der Fokus in einem Formularfeld ist), irgendwas passiert. Mein Ansatz war, so lange tabs zu schicken bis ich im Eingabefeld lande und da dann die Daten abzuladen, aber augenscheinlich passiert da nichts.
Zum Testen habe ich es anstatt im Browser mit dem Editor versucht:
fillform = subprocess.Popen(['xed'], stdin=subprocess.PIPE, shell=True)
aber auch hier passiert nach dem time.sleep nichts bzw. nichts Offensichtliches - auch nicht wenn ich nur einen Buchstaben sende. Der Editor geht brav auf und man sieht, dass im sleep-intervall der cursor ruht, aber danach geschieht nichts weiter.
Alternativ habe ich Folgendes versucht:
fillform.stdin.write('b"tescht")
fillform.stdin.write("tescht".encode())
Ich bekomme keine Fehlermeldungen, aber es passiert auch nichts.
Kann mich jemand in die richtige Richtung schubbsen?
Da ich die Anwendung meiner Wahl öffnen kann und ich ja diverse Möglichkeiten habe, Daten oder auch einfach Keyboard-Events abzusenden vermute ich, dass ich irgendwie den Fokus auf die Anwendung bekommen oder behalten muss - wobei ich vermutet hätte, dass das mit dem Code oben schon der Fall ist - und danach das Event übermittle.
Ein anderer Ansatzpunkt war mittels pynput Keyboard-Events zu generieren, a la
keyboard.press('a') bzw. keyboard.release('a'), aber da habe ich den Fokus nicht aus dem Terminal raus zum Browser hinbekommen.
Mit "requests" habe ich es auch versucht, das wäre ja wohl am einfachsten gewesen, aber das wird anscheinend seitens der Webseiten unterbunden.
Ich kann mir vorstellen, dass manche Versuche von den Webseiten nicht akzptiert werden, die werden sich vermutlich teilweise gegen Automaten wehren - aber ich gehe jetzt schon davon aus, dass ich es zumindest so hinbekommen können müsste, dass ich tabs und Text in Form einzelner Keyboard-Events da abladen kann. Mehr will ich gar nicht.
Bin für jeden Hinweis dankbar.
Webformulare vorausfüllen - wie?
- noisefloor
- User
- Beiträge: 4185
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
... und willkommen im Forum
Du kannst Webseiten automatisiert laden / auslesen / Aktionen ausführen über das Selenium Modul. Damit hast du ein headless Browser Engine, die per Python Skript steuerbar ist. Für Selenium findest du reichlich Doku im Netz. Alternativ geht ggf. auch Python AutoGUI.
Gruß, noisefloor
... und willkommen im Forum

Dein Ansatz funktioniert so nicht - was letztendlich auch gut ist. Externe Programm mit `subprocess` öffnen geht natürlich und mit dem Prozess interagieren geht auch. ABER: du kannst halt nicht erwarten, dass du an den Prozess (wie einen Browser oder einen Editor) einfach was schickst und das automagisch im Anzeigfenster / -feld erscheint. Wenn man ein Programm fernsteuern will, muss es eine entsprechende API haben. Haben die meisten GUI Programme aber nicht - weil die eben auf interaktive Interaktion via GUI ausgelegt sind.Ich möchte unter Linux (Debian) aus einem Python-Script heraus einen Browser inklusive URL aufrufen (ob Firefox oder Chrome ist an der Stelle egal) und an die dahinterliegende Webseite dann Daten schicken, die in ein Formular eingetragen werden
Du kannst Webseiten automatisiert laden / auslesen / Aktionen ausführen über das Selenium Modul. Damit hast du ein headless Browser Engine, die per Python Skript steuerbar ist. Für Selenium findest du reichlich Doku im Netz. Alternativ geht ggf. auch Python AutoGUI.
Das ist auch etwas zu simpel gedacht. Die kannst mit dem `requests` Modul schon Formulardaten an eine URL schicken, die Formulardaten per `POST` Request erwartet. Da musst du aber vorher auf der Webseite mit dem Formular nachschauen, ob das wirklich so ist. Vielleicht überträge die Webseite die Formulardaten ja auch per JavaScript zum Server oder da ist irgendein Framework wie Angular oder React oder so mit am Werk.Mit "requests" habe ich es auch versucht, das wäre ja wohl am einfachsten gewesen, aber das wird anscheinend seitens der Webseiten unterbunden.
Das ist: schlecht. Warum kannst du denn nicht pip aus den Debian Quellen installieren und dann via pip externe Python-Module - was der Standardweg wäre.Ich habe auch leider die Einschränkung, dass ich Module nutzen muss, die bereits im Debian Repository vorhanden sind.
Gruß, noisefloor
Hallo noisefloor,
vielen Dank für deine schnelle Antwort. Ich bin leider nicht so der Programmierer wie man gemerkt haben wird, wir skripten eher bei Bedarf was quick and dirty zusammen, haben aber andere Hauptaufgaben. Daher sind mir da viele Dinge nicht so bewusst. Dein Beitrag war da hilfreich.
Das mit selenium klingt gut, danke. Hatte ich bei Google auch schon teilweise gesehen. Allerdings wurde das subprocess-Thema teilweise in manchen Blogs so "verkauft", als wäre das hier die schnellste Lösung, daher hatte ich mich hierauf konzentriert.
Das mit den Modulen aus dem Debian Repository ist eine externe Vorgabe, da habe ich wenig Einfluss drauf. Aber selenium scheint dabei zu sein. Ich versuche mal mein Glück...
Dank dir!
vielen Dank für deine schnelle Antwort. Ich bin leider nicht so der Programmierer wie man gemerkt haben wird, wir skripten eher bei Bedarf was quick and dirty zusammen, haben aber andere Hauptaufgaben. Daher sind mir da viele Dinge nicht so bewusst. Dein Beitrag war da hilfreich.
Das mit selenium klingt gut, danke. Hatte ich bei Google auch schon teilweise gesehen. Allerdings wurde das subprocess-Thema teilweise in manchen Blogs so "verkauft", als wäre das hier die schnellste Lösung, daher hatte ich mich hierauf konzentriert.
Das mit den Modulen aus dem Debian Repository ist eine externe Vorgabe, da habe ich wenig Einfluss drauf. Aber selenium scheint dabei zu sein. Ich versuche mal mein Glück...
Dank dir!