1. Grundlagen der Elementsuche auf einer Seite
Verwendung von Methoden zur Elementsuche
Wenn du Selenium in echten Projekten verwendest, besteht eine der ersten Aufgaben darin, Elemente auf der Seite zu finden. Das lässt sich mit der Suche nach einem Fahrstuhlknopf in einem Hotel vergleichen: Du musst wissen, wo er sich befindet, um ihn zu drücken und in den gewünschten Stock zu fahren.
Selenium stellt mehrere Methoden zur Verfügung, um Elemente zu finden. Je nach Vorlieben kannst du find_element_by_id, find_element_by_name, find_element_by_xpath, find_element_by_css_selector usw. verwenden. Lass uns das Gelernte auffrischen und ein einfaches Beispiel schreiben:
from selenium import webdriver
# Erstellen eines Browser-Instanz (hier verwenden wir Chrome)
driver = webdriver.Chrome()
# Öffne die Seite
driver.get('http://example.com')
# Suche nach einem Element mit ID
element_by_id = driver.find_element_by_id('main')
# Suche nach einem Element mit Name
element_by_name = driver.find_element_by_name('username')
# Suche nach einem Element mit XPath
element_by_xpath = driver.find_element_by_xpath('//div[@class="content"]')
# Suche nach einem Element mit CSS-Selektor
element_by_css = driver.find_element_by_css_selector('div.content')
Unterschiede zwischen find_element und find_elements
Wenn du mehrere Elemente erfassen möchtest (zum Beispiel alle Buttons mit der Klasse btn), benötigst du die Methode find_elements. Der Unterschied zwischen find_element und find_elements ist, dass die erste Methode ein einzelnes Element zurückgibt, während die zweite eine Liste von Elementen zurückgibt.
# Suche nach einem einzelnen Element
single_element = driver.find_element_by_class_name('btn')
# Suche nach mehreren Elementen
multiple_elements = driver.find_elements_by_class_name('btn')
# Iteration durch die gefundenen Elemente
for element in multiple_elements:
print(element.text)
Wie du siehst, ist find_elements ideal für den Umgang mit Sammlungen von Elementen, die mehrfach auf der Seite vorhanden sein können. Jede find_element_xxx-Methode hat ihr find_elements_xxx-Pendant, das eine Liste von Elementen zurückgibt.
2. Interaktive Interaktionen mit Elementen
Interaktionen mit Buttons, Links und Eingabefeldern
Jetzt, wo du dich daran erinnert hast, wie man Elemente findet, ist es an der Zeit, sich daran zu erinnern, wie man mit ihnen interagiert! Es ist wie das Spielen mit LEGO: Man muss die Teile richtig zusammenfügen, damit das gewünschte Ergebnis entsteht.
Die Interaktion mit Elementen kann mit den Methoden erfolgen, die Selenium bereitstellt. Schauen wir uns das noch einmal an:
# Klick auf einen Button
button = driver.find_element_by_id('submit')
button.click()
# Texteingabe in ein Eingabefeld
input_field = driver.find_element_by_name('q')
input_field.send_keys('Python selenium tutorial')
# Abrufen des Textes eines Elements
header = driver.find_element_by_tag_name('h1')
print(header.text)
Verarbeitung von Ereignissen und Aktionen mit dynamischen Elementen
Wenn es um die Arbeit mit dynamischen Elementen geht, wie z.B. Buttons, die erst nach einer bestimmten Aktion erscheinen, ist es wichtig, Verzögerungen und Wartezeiten zu berücksichtigen. Selenium bietet Möglichkeiten, auf das Laden solcher Elemente zu warten. Eine davon ist die Verwendung der Klasse WebDriverWait in Kombination mit expected_conditions.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Wartezeit von 10 Sekunden auf das Erscheinen eines Buttons
button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'submit'))
)
button.click()
Hinweis. Um nicht jedes Mal expected_conditions schreiben zu müssen, haben wir es beim Import in EC umbenannt.
Die Verwendung von Wartezeiten macht dein Skript zuverlässiger und verhindert, dass es aufgrund von Verzögerungen oder langsamen Seitenladungen abstürzt. Und in der Praxis kommt das ziemlich oft vor – fast immer :)
3. Was könnte schiefgehen?
Alles. Alles könnte schiefgehen. Du bist bereit, mit den Elementen zu interagieren, aber dann – bam – geht etwas schief. Lass uns einige typische Fehler besprechen, die dir auf diesem Weg begegnen könnten.
Erstens: NoSuchElementException – das ist eine Fehlermeldung, die du ziemlich häufig sehen wirst, besonders wenn das Element, das du suchst, nicht auf der Seite existiert. Sie wird ausgelöst, wenn du versuchst, ein nicht vorhandenes Element zu finden. Um solche Situationen zu vermeiden, kannst du die Methode try-except verwenden, um Ausnahmen zu behandeln:
from selenium.common.exceptions import NoSuchElementException
try:
element = driver.find_element_by_id('non_existent_id')
except NoSuchElementException:
print("Ups, scheint so, als ob das Element nicht gefunden wurde!")
Es können auch Probleme mit dynamischen Elementen und Ladezeiten auftreten. In diesem Fall warte auf das Laden von Elementen mit WebDriverWait, wie wir es zuvor besprochen haben.
GO TO FULL VERSION