PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Python Selenium | find_elements_by_class_name mit for schleife abarbeiten



0u1law
05.08.2020, 21:51
hey leute,

ich besuche mit python selenium und chrome eine website und kann mit find_elements_by_class_name eine liste der klassen erstellen, wenn ich es folgendermassen mache kann ich drauf klicken:


benutzer1 = driver.find_elements_by_class_name('name')
benutzer1[0].click()


oder mit benutzer[1].click() funktioniert es auch es wird halt das 2 element angeklickt

und wenn ich es wie folgt mache:


for i in benutzer1:
-----benutzer1.click()

kommt folgende fehler meldung:


AttributeError: 'list' object has no attribute 'click'



ausserdem möchte ich nur die ersten 20 klassen anklicken entsprechend eine aktion durchführen wie kann ich dass mit einer for...range schleife hier einbauen ?

Barny
06.08.2020, 14:13
Hiho!

Schau dir bitte nochmal die Benutzung von "foreach"-Schleifen an. In deinem Fall wäre es nicht



for i in benutzer1:
benutzer1.click()


sondern



for i in benutzer1:
i.click()


Der von dir beschriebene Fehler ist daher logisch: Du versucht die Methode "click()" nicht von einem Element der Liste aufzurufen, sondern versucht die Methode "click()" auf das Listenobjekt auszuführen. Das kann nicht funktionieren, da das Listenobjekt keine Methode hat die "click()" heißt. ;)

Viele Grüße,

Barny

0u1law
06.08.2020, 17:09
Hey danke erstmal für deine hilfe! und ich hab es entsprechend probiert aber jetzt bekomme ich folgende fehlermeldung:



Message: stale element reference: element is not attached to the page document



hab auch versucht das dann auf einem neuen fenster zu öffnen aber vergeblich
hier der code


benutzer1 = driver.find_elements_by_class_name('name')


for a in benutzer1:
driver.execute_script("window.open('');")
driver.switch_to.window(driver.window_handles[1])
a.click()
driver.close()


bekomme aber besagte fehlermeldung was kann ich da machen ? dachte daran jedesmal wenn ich auf der gewollten seite war kann ich dann eins zurück und die elemente neu laden aber wie mache ich das dann dass ich nicht jedesmal benutzer[0] ansteuere ? sowas wie ein counter oder ?

novedad
06.08.2020, 18:40
wie war das mit den code-tags?

Barny
11.08.2020, 12:03
Du wirst so keine Hilfe finden. Bitte beschreibe was du tun möchtest und poste dazu deinen vollständigen Code. Mit den paar Codefetzen kann man nicht wirklich was anfangen.
Bitte achte auch auf die Code-Tags. Ich habe diese soeben in deinem Beitrag wieder ergänzen müssen.

Viele Grüße,

Barny

Dailox
12.08.2020, 00:22
Hey danke erstmal für deine hilfe! und ich hab es entsprechend probiert aber jetzt bekomme ich folgende fehlermeldung:



Message: stale element reference: element is not attached to the page document



hab auch versucht das dann auf einem neuen fenster zu öffnen aber vergeblich
hier der code


benutzer1 = driver.find_elements_by_class_name('name')


for a in benutzer1:
driver.execute_script("window.open('');")
driver.switch_to.window(driver.window_handles[1])
a.click()
driver.close()


bekomme aber besagte fehlermeldung was kann ich da machen ? dachte daran jedesmal wenn ich auf der gewollten seite war kann ich dann eins zurück und die elemente neu laden aber wie mache ich das dann dass ich nicht jedesmal benutzer[0] ansteuere ? sowas wie ein counter oder ?

Normalerweise bedeutet das, dass du Elemente benutzen möchtest, die noch nicht vollständig geladen worden sind oder per Javascript noch geändert wurden. Im Regelfall kann man das verhindern, wenn du einfach auf das Element wartest:



from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

benutzer1 = driver.find_elements_by_class_name("name")
#Die 10 steht für die Sekunden bis zum Timeout.
wait = WebDriverWait(driver, 10)

wait.until(EC.staleness_of(benutzer1))

benutzer1 = wait.until(EC.presence_of_all_elements_located((By .CLASS_NAME, "name")))

benutzer1.send_keys("Jetzt kann man was damit machen")


Mehr dazu erfährst du in der Dokumentation: https://selenium-python.readthedocs.io/waits.html


So müsste das theoretisch funktionieren, aber ist schwer zu sagen, wenn du kein Code postest.