Selenium ist ein führendes Framework zur Simulation von Benutzerinteraktionen in einem Webbrowser. Es ist ein Eckpfeiler bei Softwaretests und Datenextraktion. Obwohl wir in einem früheren Artikel einen Selenium-Python-Leitfaden für Anfänger ausführlich beschrieben haben, liegt unser Fokus hier auf einer Kernfunktionalität: dem Scrollen.
Dieser Artikel bietet ein einfaches Python-Tutorial zu verschiedenen Scroll-Techniken und ihrer praktischen Umsetzung. Wir werden verschiedene Methoden untersuchen, vom einfachen Scrollen bis hin zu komplexeren Szenarien, um sicherzustellen, dass Sie verstehen, wie Sie die Scroll-Funktionen von Selenium effektiv nutzen können.
Inhaltsverzeichnis
Verwenden von JavaScript Executor
Die einfachste und am häufigsten verwendete Methode zum Scrollen ist die Ausführung von JavaScript-Code in Chromedriver, der die erforderliche Funktionalität implementiert. JavaScript ermöglicht drei Haupttypen des Scrollens, wobei horizontale und vertikale Unterschiede außer Acht gelassen werden:
- Scrollen zu einer bestimmten PositionDazu gehört auch das Scrollen zum Anfang oder Ende der Seite.
- Zu einem bestimmten Element scrollen. Wenn wir das genaue Scrollziel nicht kennen, aber das Zielelement kennen, können wir Webseiten problemlos zu diesem Element scrollen.
- Scrollen zu bestimmten KoordinatenDies ist nützlich, wenn Sie von der aktuellen Position aus eine bestimmte Anzahl Pixel scrollen müssen.
Schauen wir uns praktische Beispiele an und schreiben einfachen Code, um diese Scroll-Typen zu implementieren. Für alle Beispiele in diesem Artikel verwenden wir die folgende Vorlage:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
url = "https://demo.opencart.com/"
chrome_options = Options()
driver = webdriver.Chrome(options=chrome_options)
driver.get(url)
# Here will be code
driver.quit()
Nur der Teil nach dem Navigieren zur Seite wird sich ändern. Hier haben wir die erforderlichen Module aus der Selenium-Bibliothek vorgeladen. Im Folgenden stellen wir nur Scroll-Beispiele bereit, sodass Sie diese Vorlage zum Ausführen verwenden können.
Zu einem bestimmten Element scrollen
Da das Scrollen zu einer bestimmten Position oder nach Koordinaten ähnliche Methoden erfordert, werden wir diese später gemeinsam behandeln. Konzentrieren wir uns zunächst auf das Scrollen zu einem bestimmten Element. Dazu benötigen wir eine Möglichkeit, dieses Element zu identifizieren. CSS-Selektoren, XPath oder andere Methoden können verwendet werden.
Versuchen wir, mit JavaScript zu einem Element mit einer bestimmten ID zu scrollen. Da jedes Element nur eine eindeutige ID haben kann, ist dies eine zuverlässige Möglichkeit, es zu identifizieren. Allerdings haben nur einige Elemente IDs, sodass dieser Ansatz nur manchmal praktikabel ist. Also suchen wir zuerst das gewünschte Element und scrollen dann dorthin:
element = driver.find_element(By.ID, "carousel-banner-1")
driver.execute_script("arguments(0).scrollIntoView(true);", element)
Dieser Code ist grundsätzlich auf jedes Element anwendbar. Die By-Methode unterstützt verschiedene Möglichkeiten, bestimmte Elemente zu finden. Der Code lässt sich so an verschiedene Szenarien anpassen, indem einfach die Suchmethode und die zur Identifizierung des Zielelements verwendeten Daten geändert werden.
Scrollen zu einer bestimmten Position
Wenn wir zu einer bestimmten Position auf einer Webseite scrollen möchten, verwenden wir normalerweise die window.scrollTo(x, y)
Funktion. Dabei stellen x und y die absoluten Koordinaten auf der Seite dar. Um horizontal zu scrollen, passen Sie den x-Wert an, und um vertikal zu scrollen, ändern Sie den y-Wert.
Da vertikales Scrollen häufiger vorkommt, konzentrieren wir uns auf das Scrollen nach oben und unten. Dieses Skript scrollt die Seite ganz nach unten, indem es die Y-Koordinate auf die Gesamthöhe des Dokumenttexts setzt:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
Um wieder nach oben zu scrollen, setzen wir sowohl x als auch y auf 0 und platzieren die obere linke Ecke des Ansichtsfensters am Ursprung des Dokuments:
driver.execute_script("window.scrollTo(0, 0);")
Wenn Sie die genaue Höhe kennen, zu der Sie scrollen möchten, können Sie den Y-Wert manuell festlegen. Denken Sie jedoch daran, dass diese Koordinaten absolut sind und nicht von Ihrer aktuellen Scrollposition abhängen.
Scrollen nach Koordinaten
Das Scrollen nach Koordinaten ist dem Scrollen zu einer bestimmten Position sehr ähnlich. Der Hauptunterschied besteht darin, dass bei einer Position absolute Werte verwendet werden, während beim Scrollen nach Koordinaten die Änderung relativ zur aktuellen Position angegeben wird. Dies wird mithilfe des window.scrollBy(x, y)
Funktion.
Da diese Funktion eine Positionsänderung relativ zur aktuellen Position durchführt, kann der Wert sowohl positiv als auch negativ eingestellt werden. Beim Scrollen nach rechts und unten sind die Werte positiv, beim Scrollen nach oben oder links negativ.
Um beispielsweise 500 Pixel nach unten zu scrollen, können Sie den folgenden Code verwenden:
driver.execute_script("window.scrollBy(0, 500);")
So scrollen Sie 500 Pixel nach oben:
driver.execute_script("window.scrollBy(0, -500);")
So scrollen Sie nach rechts:
driver.execute_script("window.scrollBy(500, 0);")
So scrollen Sie nach links:
driver.execute_script("window.scrollBy(-500, 0);")
Durch diagonales Scrollen können Sie die x- und y-Werte gleichzeitig verändern.
Verwenden der Aktionsklasse
Selenium bietet außerdem einen speziellen Satz von Funktionen namens „Actions“, die eine umfassende Emulation echter Benutzerinteraktionen auf einer Webseite ermöglichen. Zu diesen Aktionen gehören Mausbewegungen, Tastendrücke und Scrollen.
Um diese Funktionen zu verwenden, müssen wir ein ActionChains-Objekt erstellen:
actions = ActionChains(driver)
Wir verwenden dieses Objekt in beiden Beispielen und definieren es daher im Voraus, um Wiederholungen zu vermeiden.
Verwenden von Aktionsketten zum Scrollen zu einem Element
Lassen Sie uns das JavaScript-Beispiel mit Seleniums Action Chains replizieren. Suchen Sie das gewünschte Element mit By.ID
scrollen Sie zu diesem Element und gehen Sie wie folgt vor:
element = driver.find_element(By.ID, 'carousel-banner-1')
actions.move_to_element(element).perform()
Damit erzielen Sie dasselbe Ergebnis wie mit unserer vorherigen JavaScript-Lösung. Die Stärke von Aktionsketten liegt jedoch in ihrer Fähigkeit, mehrere Aktionen miteinander zu verketten. Sie können beispielsweise in einer einzigen Sequenz ein Element suchen, darauf klicken und Text eingeben.
actions.move_to_element(element).click().perform()
Dies ist besonders nützlich für die Automatisierung von Interaktionen mit Dropdowns, Menüs und Formularen. Durch die Verkettung von Aktionen vereinfacht Action Chains komplexe Automatisierungsaufgaben im Vergleich zur Verwendung reiner JavaScript-Ausführung. Dies macht es zu einem unschätzbar wertvollen Werkzeug für größere Projekte.
Scrollen mithilfe von Tastaturtasten in Aktionsketten
Eine weitere Scroll-Option besteht darin, Tastaturtasten innerhalb von Aktionsketten zu verwenden. Dies ähnelt dem normalen Scrollen über die Tastatur (das wir als Nächstes besprechen), kann jedoch beim Kombinieren von Aktionen praktischer sein.
Um nach oben oder unten zu scrollen, können Sie diesen Code verwenden:
actions.send_keys(Keys.PAGE_DOWN).perform()
actions.send_keys(Keys.PAGE_UP).perform()
Wenn Sie keine zusätzlichen Aktionen benötigen und einen einfacheren Ansatz ohne Aktionsketten bevorzugen, finden Sie im nächsten Abschnitt ein einfaches Beispiel für das Scrollen per Tastatur.
Um mit Tastaturtasten zu interagieren, müssen wir zuerst das Zielelement identifizieren. Beim Scrollen interagieren wir mit dem gesamten sichtbaren Teil der Seite, der normalerweise im Body-Tag enthalten ist.
body = driver.find_element(By.TAG_NAME, "body")
Sobald wir das Body-Element haben, können wir Tastenanschläge simulieren. Um beispielsweise zum Anfang der Seite zu scrollen, können wir Folgendes verwenden:
body.send_keys(Keys.HOME)
Und um auf der Seite nach unten zu scrollen:
body.send_keys(Keys.END)
Wie Sie sehen, ähnelt dieser Ansatz der Verwendung von ActionChains, ist aber etwas einfacher.
Wenn ein Web-Element Stile hat, die Scrollen ermöglichen (wie overflow: auto
oder overflow: scroll
), können Sie Selenium und JavaScript verwenden, um innerhalb dieses Elements zu scrollen.
Nehmen wir an, wir haben ein Element mit der ID 'scrollbar'
auf unserer Seite, die wir scrollen möchten. Zuerst müssen wir dieses Element finden:
scrollable_element = driver.find_element(By.ID, 'scrollbar')
Dann können wir nach unten scrollen:
driver.execute_script("arguments(0).scrollTop = arguments(0).scrollHeight;", scrollable_element)
Oder scrollen Sie nach oben:
driver.execute_script("arguments(0).scrollTop = 0;", scrollable_element)
Beachten Sie, dass Sie die gesamte Seite und bestimmte Elemente darin scrollen können.
Tipps und Tricks
Manchmal treten beim Web Scraping spezielle Fragen oder Probleme auf. Mit den in diesem Artikel beschriebenen Fähigkeiten können Sie diese Schwierigkeiten jedoch mithilfe kleiner Tricks überwinden.
Unendliches Scrollen
Infinite Scrolling ist eine gängige Technik, um Inhalte dynamisch zu laden, während ein Benutzer auf einer Seite nach unten scrollt. Dadurch entsteht ein scheinbar endloser Inhalts-Feed, wie man ihn oft auf Social Media- und Nachrichten-Websites sieht.
Um Infinite Scroll mit Selenium zu implementieren, können wir den folgenden Algorithmus verwenden:
- Erstellen einer Schleife. Diese Schleife scrollt die Seite kontinuierlich nach unten.
- Nach neuen Inhalten suchen. Nach jedem Scrollen überprüfen Sie die Seite, um zu sehen, ob neuer Inhalt geladen wurde.
- Wiederholen. Wenn neuer Inhalt gefunden wird, wird die Schleife fortgesetzt, andernfalls wird sie möglicherweise beendet.
Das fertige Beispiel könnte so aussehen:
while (True):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
Um die Schleife endlich zu machen, können Sie einen Zähler oder eine bedingte Anweisung einführen, um die Schleife zu beenden, wenn eine bestimmte Bedingung erfüllt ist. Sie könnten beispielsweise das Scrollen nach einer bestimmten Anzahl von Iterationen oder wenn Sie auf ein bestimmtes Element auf der Seite stoßen, beenden.
Scrollgenauigkeit
Eine weitere häufige Aufgabe ist das Scrollen zur genauen Mitte eines bestimmten Elements. Wir können die vorherigen Beispiele ändern, indem wir die Methode scrollIntoView mit den Optionen „Verhalten“ und „Block“ verwenden:
driver.execute_script("arguments(0).scrollIntoView({ behavior: 'smooth', block: 'center' });", element)
Obwohl diese Aufgabe seltener vorkommt, kann ihre Lösung in bestimmten Szenarien von entscheidender Bedeutung sein.
Popups und Overlays
Popups sind eine häufige Herausforderung beim Erstellen von Web Scrapern oder Automatisieren von Aufgaben mit Selenium. Sie behindern oft das Scrollen und behindern Ihren Automatisierungsprozess erheblich.
Um dieses Problem zu beheben, führen wir eine einfache Technik ein: Vor dem Scrollen können wir versuchen, alle Popups zu schließen.
try:
popup_close_button = driver.find_element(By.ID, 'popup_id')
popup_close_button.click()
except:
print("Pop-up not found.")
Dieser Codeblock versucht, ein Element mit der ID „popup_id“ zu finden und klickt dann darauf, um das Popup zu schließen. Der Try-Except-Block stellt sicher, dass das Skript nicht abstürzt, wenn das Popup oder die Schaltfläche zum Schließen nicht gefunden wird.
Rahmen und verschachtelte Elemente
Um mit Elementen innerhalb eines Iframes zu interagieren, müssen Sie zuerst den Kontext in den Iframe wechseln. Sobald Sie sich darin befinden, können Sie dieselben Prinzipien anwenden, die wir für scrollende Elemente mit Überlauf besprochen haben. Lassen Sie uns ein Beispiel aufschlüsseln.
Suchen Sie zunächst das Iframe mit der angegebenen ID und richten Sie den Fokus des Treibers darauf:
iframe = driver.find_element(By.ID, 'iframe_id')
driver.switch_to.frame(iframe)
Nachdem Sie zum Iframe gewechselt sind, können Sie das spezifische Element suchen, mit dem Sie interagieren möchten, und darin scrollen:
nested_element = driver.find_element(By.ID, 'nested_element_id')
driver.execute_script("arguments(0).scrollIntoView(true);", nested_element)
Um schließlich die Interaktion mit Elementen im Hauptdokument fortzusetzen, wechseln Sie zurück zum Standardinhalt:
driver.switch_to.default_content()
Mit diesen Schritten können Sie Daten effektiv aus Containern extrahieren, die Inhalte aus externen Quellen enthalten. Dies ist besonders nützlich für die Automatisierung von Webseitenaufgaben, die Iframes zum Einbetten von Inhalten von Drittanbietern verwenden.
Fazit und Erkenntnisse
In diesem Artikel wurden verschiedene Methoden zur Implementierung des Scrollens in Selenium mit Python untersucht. Wir haben wichtige Techniken behandelt, wie die Verwendung von JavaScript Executor zum Scrollen zu bestimmten Elementen und Positionen und die Navigation nach Koordinaten. Die Aktionsketten wurden aufgrund ihrer Fähigkeiten zum Erreichen eines reibungslosen Scrollens und zur Handhabung komplexer Szenarien wie Scrollen mithilfe von Tastaturtasten und zur Handhabung von Tastenereignissen hervorgehoben.
Wir haben auch fortgeschrittene Themen besprochen, darunter den Umgang mit überlaufenden Elementen, unendlichem Scrollen und die Gewährleistung der Scrollgenauigkeit. Außerdem wurden Lösungen für allgemeine Herausforderungen wie die Verwaltung von Popups, Overlays und das Scrollen innerhalb von Frames und verschachtelten Elementen bereitgestellt.
Wenn Sie diese Techniken verstehen und anwenden, können Sie dynamische Webseiten effektiv scrapen, automatisieren und testen und so robuste und zuverlässige Skripte sicherstellen.