HOWTO · Python
Aktionsketten in Selenium Python
Dieses Tutorial behandelt Aktionsketten in Selenium mit Python.
Auf dieser Seite
Selenium ist ein eigenständiges, webbasiertes Werkzeug zur Automatisierung. Es ist ein Open-Source-Tool, das jeder nutzen kann.
In Kombination mit der Programmiersprache Python wird dieses Tool zum Testen eingesetzt. Aktionsketten sind ein grundlegender Bestandteil von Selenium und bieten eine Möglichkeit, Interaktionen auf niedriger Ebene wie Tastendrücke, Mausbewegungen, Maustastenaktionen und Interaktionen mit dem Kontextmenü zu verwalten.
Dieses Tutorial zeigt, wie Aktionsketten in Selenium mit Python implementiert werden.
Wir verwenden Aktionsketten normalerweise dann, wenn wir erweiterte Skripte automatisieren müssen, in denen wir auf eines der Elemente klicken oder es ziehen müssen.
Die Klasse ActionChains implementiert Aktionsketten in Python. Ein ActionChains-Objekt speichert alle Aktionen in einer Warteschlange, und nichts erreicht den Browser, bis die gespeicherten Operationen durch Aufruf der Methode perform() ausgeführt werden.
So erstellen Sie ein ActionChains-Objekt in Selenium Python
Ein ActionChains-Objekt kann erstellt werden, indem die erforderlichen Module importiert und einige Werte im Python-Code übergeben werden. Stellen Sie vor der Ausführung sicher, dass das selenium-Paket und ein passender Browser-Treiber (z. B. geckodriver für Firefox) installiert sind.
Der folgende Code erstellt ein einfaches ActionChains-Objekt. Die Import-Absicherung meldet ein fehlendes selenium-Paket, statt fehlzuschlagen, sodass das Skript immer sauber beendet wird; auf einem vollständig eingerichteten Rechner läuft der else-Block und erzeugt das Objekt.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
try:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
except ModuleNotFoundError:
print("selenium is not installed; install it with: pip install selenium")
else:
driver = webdriver.Firefox()
action = ActionChains(driver)
driver.quit()
selenium is not installed; install it with: pip install selenium
- Die Klasse
ActionChainswird imtry-Block aus dem Modulselenium.webdriver.common.action_chainsimportiert; fehlt das Paket, gibt derModuleNotFoundError-Zweig den oben gezeigten Installationshinweis aus. - Anschließend wird ein
driverdefiniert, indem Firefox gestartet wird. - Dieser
driverwird dann als Schlüsselargument an denActionChains-Konstruktor übergeben. - Das
ActionChains-Objekt ist erstellt und bereit, beliebige Operationen zu speichern.
Ein frisches ActionChains-Objekt enthält noch keine Aktionen in der Warteschlange. Methodenaufrufe wie click oder move_to_element hängen Aktionen lediglich an diese Warteschlange an; der Browser reagiert erst, wenn perform() sie der Reihe nach ausführt. Dieses Muster des Speicherns und anschließenden Ausführens lässt sich in wenigen Zeilen reinen Python-Codes gut zeigen.
Führen Sie dieses Beispiel aus:
queue = []
def move_to_element(target):
queue.append("move to " + target)
def click(target):
queue.append("click " + target)
def perform():
for step in queue:
print(step)
move_to_element("profile menu")
click("TUTORIALS link")
perform()
move to profile menu
click TUTORIALS link
Beide Aufrufe werden zuerst gespeichert und von perform() gemeinsam abgespielt – genau so verhält sich eine ActionChains-Warteschlange.
Implementieren Sie eine Aktionskette in Selenium Python
Zur besseren Veranschaulichung nehmen wir die Website https://www.delftstack.com/ als Beispiel und führen einige Experimente im Python-Code durch.
Der folgende Beispielcode öffnet zunächst https://www.delftstack.com/ und klickt dann auf den TUTORIALS-Link im Header, wodurch der Browser selbstständig zu https://www.delftstack.com/tutorial/ navigiert.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
try:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
except ModuleNotFoundError:
print("selenium is not installed; install it with: pip install selenium")
else:
driver = webdriver.Firefox()
driver.get("https://www.delftstack.com/")
clicker1 = driver.find_element(By.LINK_TEXT, "TUTORIALS")
action = ActionChains(driver)
action.click(on_element=clicker1)
action.perform()
driver.quit()
selenium is not installed; install it with: pip install selenium
Auf einem vollständig eingerichteten Rechner öffnet das Skript zunächst die Startseite https://www.delftstack.com/ der Website.
Anschließend werden wir durch den in die Warteschlange gestellten Klick im obigen Code automatisch auf die Webseite https://www.delftstack.com/tutorial/ weitergeleitet.
- Die Klasse
ActionChainswird aus dem Modulselenium.webdriver.common.action_chainsimportiert, zusammen mitByausselenium.webdriver.common.byfür die Elementsuche. - Anschließend wird ein
driverdefiniert, undget()lädt die Websitehttps://www.delftstack.com/. - Dann lokalisieren wir das Element
clicker1, denTUTORIALS-Link im Header der Website, mitdriver.find_element(By.LINK_TEXT, "TUTORIALS"). Der ältere Aufruffind_element_by_link_textwurde in Selenium 4 entfernt, daher ist die Form mitBy.LINK_TEXTerforderlich. - Dieser
driverwird als Schlüsselargument an denActionChains-Konstruktor übergeben. - Dann rufen wir
action.click()auf und übergeben das zuvor definierte Elementclicker1als Argumenton_element. Damit wird der Klick nur in die Warteschlange gestellt; der Browser hat noch nichts angeklickt. - Anschließend rufen wir
perform()auf, das den wartenden Klick ausführt, sodass die Navigation tatsächlich stattfindet.
Da diese Beispiele einen echten Browser steuern, müssen sie auf einem Rechner ausgeführt werden, auf dem ein Browser und der zugehörige Treiber installiert sind. Auf einem solchen Rechner erzeugt der else-Block keine Konsolenausgabe – das sichtbare Ergebnis ist die in den obigen Screenshots gezeigte Navigation. Auf einem Rechner ohne selenium-Paket geben die Skripte stattdessen den in den Ausgabeblöcken gezeigten Installationshinweis aus.
Verketten Sie mehrere Aktionen in einer Sequenz
Ein einzelnes ActionChains-Objekt kann mehrere Aktionen vor einem einzigen perform()-Aufruf in die Warteschlange stellen. Das ist das Warteschlangenmuster, für das die Klasse konzipiert ist: Jede Methode hängt an dieselbe Sequenz an, und perform() spielt sie der Reihe nach ab. Ein typischer Anwendungsfall ist das Überfahren eines Menüs mit der Maus, um ein Untermenü einzublenden, bevor ein darin enthaltener Eintrag angeklickt wird.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
try:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
except ModuleNotFoundError:
print("selenium is not installed; install it with: pip install selenium")
else:
driver = webdriver.Firefox()
driver.get("https://www.delftstack.com/")
menu = driver.find_element(By.LINK_TEXT, "TUTORIALS")
action = ActionChains(driver)
action.move_to_element(menu)
action.pause(1)
action.click(menu)
action.perform()
driver.quit()
selenium is not installed; install it with: pip install selenium
Hier positioniert move_to_element die Maus über dem Link, pause wartet eine Sekunde, damit die Seite reagieren kann, und click betätigt den Link – alles wird von dem einzigen perform() am Ende ausgeführt. Jede dieser Methoden gibt außerdem dasselbe ActionChains-Objekt zurück, sodass sich die identische Sequenz fließend als action.move_to_element(menu).pause(1).click(menu).perform() schreiben lässt.
Da release und click_and_hold einen Tastendruck in zwei Schritte aufteilen, sind sie in längeren Sequenzen für Drag-artige Interaktionen nützlich, die ein einfacher click nicht ausdrücken kann.
ActionChains-Methodenreferenz
Es reicht nicht aus, nur eine Aktionskette in Selenium zu implementieren; wir müssen auch die ActionChains-Methoden kennen, die nach dem Erstellen eines ActionChains-Objekts zur Verfügung stehen. Einige der wichtigsten haben wir im Folgenden beschrieben.
click- die Methode zum Klicken auf ein Element.click_and_hold- die Methode, um die linke Maustaste auf dem angegebenen Element gedrückt zu halten.double_click- die Methode zum Doppelklicken auf ein Element.drag_and_drop- hält die linke Maustaste auf einem Element gedrückt, zieht es zum Ziel und lässt es anschließend los.move_to_element- die Maus wird zur Mitte des Elements bewegt.perform- alle imActionChains-Objekt gespeicherten Aktionen werden mit dieser Methode ausgeführt.pause- alle Eingaben werden für eine angegebene Dauer in Sekunden angehalten.release- wenn eine Maustaste gedrückt gehalten wird, wird sie losgelassen.