Python im Browser Buttons drücken, per Console?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Du kannst mit Selenium den Browser automatisieren. Dabei kann der Browser auch ausgeblendet werden (headless mode). Ressourcen, damit der Browser läuft, sind dennoch notwendig.

Eine andere Option ist lediglich das Abfeuern von HTTP-Requests an ein bestimmtes Ziel (s. requests-Bibliothek), welches der jeweilige Button möglicherweise selbst ansteuert. Einen Buttonklick kannst du so nicht simulieren.

troloxi 
Fragesteller
 05.03.2022, 21:46

Vielleicht kenns FreeBitcoin, jedenfalls kann man da jede Stunde paar Bitcoins claimen, ich will dort ein just for fun skript bauen.

Nur, ich komme mit dem Bot nicht auf Login weil ich mich ja zuerst anmelden muss. Ich finde keinen xPath oder weiß nicht wie ich anders auf das "Login" klicken kann

Hast du ne Idee?

0
regex9  06.03.2022, 01:28
@troloxi

Den Button selbst erreichst du über seine ID (signup_button).

button = driver.find_element_by_id("signup_button")

Es kann sein, dass du vorher noch die Banner (Cookiepopup, etc.) wegklicken musst, je nachdem, wie das Timing ist. Ohne Accountdaten kommst du allerdings durchaus nicht am Login vorbei. Richte dir also einen Account ein und trage deine Daten dann via Selenium in die Eingabefelder. Die haben praktischerweise auch allesamt eine ID (signup_form_email, signup_form_password, referrer_in_form).

mail_field = driver.find_element_by_id("signup_form_email")
mail_field.send_keys("your mail address ...")
# etc. ...

Das reCaptcha-Feld wiederum könnte knifflig werden, evt. kommst du auch gar nicht daran vorbei. Tipps dafür findest du jedenfalls hier. Einen Versuch ist es sicherlich wert.

0
troloxi 
Fragesteller
 06.03.2022, 02:18
@regex9

Nein Nein, du hast es falsch verstanden :)

Er soll ja kein Account registrieren sondern sich mit einem bestehenden Anmelden, dafür muss er oben auf Login klicken, nur wenn man oben Login klickt, bekommt man kein extra Link also müsste man zuerst auf die ganz normale Seite und dann muss er oben bei der Seite "Login" drücken und dann kann er die Sachen eingeben, dort gibt es auch kein Captcha :D

0
regex9  06.03.2022, 02:47
@troloxi

Ach stimmt, ich habe das Registrierungsformular als Loginformular gewertet.

Der Login-Link liegt in einem Listenelement mit der Klasse login_menu_button. Daraus kann man sich einen CSS-Selektor basteln.

login_link = driver.find_element_by_css_selector(".login_menu_button > a")
login_link.click()

Danach wartet man bis die einzelnen Felder sichtbar / klickbar sind (siehe Waits).

wait = WebDriverWait(driver, 5)
wait.until(EC.presence_of_element_located((By.ID, "login_form_btc_address"))).send_keys("mail address ...")
# etc. ...
0
troloxi 
Fragesteller
 07.03.2022, 19:28
@regex9

danke!

In diesem Beispiel habe ich einen Button auf den man drücken muss, nur dieser hate keinen festen a tag oder so, es ist einfach nur Text ohne Tag. Wie kann ich hier drauf drücken?

<div class="play_without_captcha_button center" id="play_without_captchas_button" style="display: block;"> 
<span class="fa-stack fa-lg"> <i class="fa fa-square-o fa-stack-2x"></i> 
<i class="fa fa-rocket fa-stack-1x"></i> </span> 
PLAY WITHOUT CAPTCHA 
</div>

Also ich möchte bei dem Button auf Play without Captcha drücken :D

0
regex9  08.03.2022, 00:00
@troloxi

Da kannst du ebenso die click-Methode nutzen.

0
troloxi 
Fragesteller
 08.03.2022, 05:12
@regex9

ich habe

Without_Captcha = driver.find_element_by_css_selector(".play_without_captchas_button > span")
Without_Captcha.click()

was habe ich hier falsch gemacht?

0
regex9  08.03.2022, 05:59
@troloxi

Der Klassenname unterscheidet sich zu dem von oben (play_without_captchas_button).

0
troloxi 
Fragesteller
 08.03.2022, 18:00
@regex9

Achso, ich muss den Klassennamen dort eingeben? Ich dachte die ID vom Div :D

Also dann so?

Without_Captcha = driver.find_element_by_css_selector(".play_without_captcha_button center > span")
Without_Captcha.click()
0
troloxi 
Fragesteller
 08.03.2022, 18:53
@troloxi

Das wirds aber auch nicht sein weil ich immer diesen Error bekomme

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".play_without_captcha_button center > span"}
0
regex9  09.03.2022, 04:19
@troloxi

Ein Klassenselektor wird mit einem führenden Punkt gekennzeichnet, ein ID-Selektor mit einer Raute.

.play_without_captcha_button
#play_without_captchas_button

Welchen von beiden du wählst, ist in deinem Fall vermutlich egal. Ein ID-Selektor ist eindeutig, kommt in einem Dokument also nur einmal vor (es sei denn, es handelt sich um ein invalides Dokument). Ein Klassenselektor kann auf mehrere verschiedene Elemente zutreffen. Die find_element_by_css_selector-Methode wählt den ersten Fund.

Dein Selektor ist falsch, da du die zweite Klasse (center) nicht korrekt in den Selektor einbindest.

Mit diesem Selektor

.play_without_captcha_button.center > span

würdest du das erste span-Element suchen, welches ein direktes Kindelement eines Element ist, welchem die zwei Klassen play_without_captcha_button und center zugeordnet wurden.

0
troloxi 
Fragesteller
 09.03.2022, 05:19
@regex9

Ich habs jetzt nochmal mit

Without_Captcha = driver.find_element_by_css_selector("#play_without_captchas_button")
Without_Captcha.click()

und

Without_Captcha = driver.find_element_by_css_selector("#play_without_captchas_button > span")
Without_Captcha.click()

probiert, beides funktioniert irgendwie nicht

0
regex9  09.03.2022, 08:50
@troloxi
(...) beides funktioniert irgendwie nicht

Das heißt?

0
troloxi 
Fragesteller
 10.03.2022, 22:53
@regex9
Das heißt?

Das heißt ich bin völlig verzweifelt weil ich schon alles probiert habe :D

0
troloxi 
Fragesteller
 10.03.2022, 23:59
@troloxi

Ich habs wirklich probiert, mit allem, aber ich kriegs einfach nicht heraus, kannst du mir vielleicht helfen?

0
regex9  11.03.2022, 08:55
@troloxi

Wenn das Element nicht gefunden werden kann, existiert es zum Zeitpunkt der Suche womöglich noch nicht (und du musst eine kleine Wartezeit einbauen) oder liegt generell nicht in dem Dokument (bspw. aber in einem iFrame).

Spiele die einzelnen Schritte also noch einmal im Browser durch und schau je Zustand im Webinspektor nach: Gibt es das Element? Wo genau liegt es?

Über die Browserkonsole kannst du die Queries leicht testen:

document.querySelector("css selector ...");
0

Direkt Buttons drücken wüsste ich jetzt nicht - du kannst aber, wenn die Webseite eine API hat, den API Endpunkt aufrufen der eigentlich durch den Button aufgerufen wird per Python aufrufen