selenium find_elements_by_class_name?

2 Antworten

Also ich hätte das Problem so gelöst:

from selenium import webdriver
import time

def main():
    driver = webdriver.Chrome(executable_path=r'selenium_webdriver\chromedriver.exe')
    driver.maximize_window()
    driver.get("https://www.tiktok.com/")
    driver.maximize_window()
    login(driver)
    driver.quit()

def login(driver):
    driver.find_element_by_xpath('//button[normalize-space()="Anmelden"]').click()
    time.sleep(10)

main()

Ich würde nicht nach der Klasse suchen, sondern nach dem Text, welches auf dem Button drauf steht. Dieser Weg finde ich immer einfacher und es gibt meistens keine Komplikationen.

Ich hoffe ich konnte dir helfen und wenn du noch Fragen hast, dann stell sie einfach

LG

Woher ich das weiß:eigene Erfahrung
Lenny774 
Fragesteller
 10.07.2022, 12:01

Ich habe diese nun ausprobiert, aber es klappt nicht. Es werden folgende Fehler angezeigt:

D:\Python Programme\Morpheus_tutorials\main.py:5: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  driver = webdriver.Chrome(executable_path=r'chromedriver.exe')
Traceback (most recent call last):
  File "D:\Python Programme\Morpheus_tutorials\main.py", line 16, in <module>
    main()
  File "D:\Python Programme\Morpheus_tutorials\main.py", line 9, in main
    login(driver)
  File "D:\Python Programme\Morpheus_tutorials\main.py", line 13, in login
    driver.find_element_by_xpath('//button[normalize-space()="Anmelden"]').click()
AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'
1
Lenny774 
Fragesteller
 10.07.2022, 12:04

Außerdem klappt xpath... auch nicht, weil ich komischer weise die optionen nicht habe.

Ich verwende Windows 10 Pro

Unter geht das nur unter Linux?

1

Hier steht, dass find_element[s]_by_... ab Version 4.3.0 entfernt wurden und man stattdessen driver.find_element[s] benutzen sollte.

Woher ich das weiß:Recherche
Lenny774 
Fragesteller
 10.07.2022, 11:17

Danke.

Aber wenn ich nun webDriver.find_element("...")

hin schreibe, dann kommt diese fehler meldung:

selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid locator
  (Session info: chrome=103.0.5060.114)
Stacktrace:
Backtrace: ....
0
sonderdings  10.07.2022, 11:23
@Lenny774

Was schreibste denn rein in den Locator?

So wie ich das gesehen habe, braucht die Methode (in der Form in der Stackoverflow-Antwort) zwei Argumente:

driver.find_element("name", "q")

Der Mensch dort hat nach nem Ersatz für find_element_by_name('q') gesucht. Du suchst nach find_elements_by_class_name, insofern würde ich da einfach mal raten, dass du statt name einfach class ausprobieren solltest und statt dem q dein "e13"-Zeugsl. Und natürlich das "s" nicht vergessen, find_elements.

1
sonderdings  10.07.2022, 11:33
@Lenny774
funktioniert leider nicht?

Und weiter? Dass ich mit der Aussage wenig anfangen kann, sollte klar sein, oder? :-D

0
wunschname0302  10.07.2022, 11:37
@Lenny774

Hast Du es mal so ausprobiert?

from selenium.webdriver.common.by import By

webDriver.find_elements(By.CLASS_NAME, "e13wiwn62.tiktok-1mm63h3-Button-StyledLoginButton.ehk74z00")
0
Lenny774 
Fragesteller
 10.07.2022, 11:55
@wunschname0302

Jetzt sieht der Fehler schonmal anders aus:

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

Also ich wollte ja dann unter diesem find_elemnts... das er dann auf die class(wen man das so sagt) drauf klickt, indem fall auf die anmeldung von tiktok
LG

0
wunschname0302  10.07.2022, 12:01
@Lenny774

Denke mal, dann musst Du Dir das Element noch aus dem Rückgabeobjekt herausfischen - falls welche gefunden werden. Oder gleich find_element verwenden, wenn der Klassenname eindeutig nur das gewünschte Element bezeichnet.

0
sonderdings  10.07.2022, 15:23
@Lenny774
AttributeError: 'list' object has no attribute 'click'

Klar -- wenn du nach Klassen suchst, können auch mehrere Elemente rauskommen. Das "s" in der Methode zeigt an, dass eine Liste rauskommt und kein einzelnes Objekt. Schau doch einfach mal, wie viele Elemente drin sind in der Liste. Du kannst auch versuchen, einfach immer auf das erste Element zuzugreifen. Oder, wie wunschname0302 sagt, das "s" weglassen -- das sähe ich aber als ziemlich unschön an.

0