HOWTO · Python
Die Methode send_keys() in Selenium Python
Dieses Tutorial demonstriert die Verwendung der Methode send_keys() in Selenium Python.
Auf dieser Seite
send_keys() ist eine Methode auf Seleniums WebElement, die Text und Tastatureingaben an ein zuvor lokalisiertes Element sendet – in der Regel ein Textfeld, ein Formularfeld oder ein anderes editierbares Steuerelement. Sobald Sie das Element haben, tippt element.send_keys("your text") jedes Zeichen hinein, und element.send_keys(Keys.ENTER) sendet eine benannte Taste wie die Eingabetaste. Dies ist die Standardmethode, um Formulare auszufüllen, Suchen auszuführen und zu prüfen, wie eine Anwendung auf Tastatureingaben reagiert.
Was send_keys() in Selenium Python bewirkt
send_keys() ist auf WebElement definiert; Sie rufen sie daher immer auf einem bereits lokalisierten Element auf, etwa driver.find_element(By.NAME, "q").send_keys("selenium"). Die Methode akzeptiert einen oder mehrere Werte – ihre Signatur ist variadisch, send_keys(*value) – und jeder Wert ist eine Zeichenkette, die in der angegebenen Reihenfolge eingetippt wird. Sondertasten (Eingabetaste, Tabulatortaste, Rücktaste und Modifikatoren) befinden sich in selenium.webdriver.common.keys.Keys; jede Konstante ist lediglich ein Zeichen im Unicode-Private-Use-Area, sodass Sie sie in eine normale Zeichenkette einfügen oder als separate Argumente übergeben können, etwa element.send_keys("text", Keys.ENTER). element.send_keys("selenium" + Keys.ENTER) tippt den Text und drückt anschließend die Eingabetaste.
In der Praxis sind zwei Details wichtig:
send_keys()simuliert Tastatureingaben. Sie gibt nur Eingaben ein – die Logik der Anwendung entscheidet, was anschließend geschieht. Ob eine Anmeldung abgelehnt wird, eine Suche ausgeführt wird oder ein Feld eine Meldung anzeigt, ist Anwendungsverhalten, das Ihr Test beobachtet, und keine Aktion, diesend_keys()ausführt.- Das Element muss Eingaben empfangen können. Textfelder, Textbereiche,
contenteditable-Elemente und Datei-Eingabefelder (die einen Dateipfad als Text annehmen) funktionieren; das Senden von Tasten an ein einfaches<div>liefert die Ereignisse zwar, ändert aber in der Regel nichts.
Eine Seite einrichten und ein Element lokalisieren
Bevor Sie Tasten senden können, starten Sie einen Treiber, öffnen die Seite und suchen das Zielelement. Mit from selenium import webdriver und from selenium.webdriver.common.by import By besteht die minimale Einrichtung aus driver = webdriver.Chrome(), driver.get("https://www.google.com/") und anschließend search_box = driver.find_element(By.NAME, "q"). Das aktuelle Selenium (Version 4) lokalisiert Elemente über driver.find_element(By.*, "..."); die älteren Methoden find_element_by_id, find_element_by_name und ähnliche wurden entfernt.
Bei Seiten, die Felder dynamisch rendern, warten Sie auf das Element, statt zu raten: WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "q"))) gibt es zurück, sobald es bereit ist. Dabei werden WebDriverWait aus selenium.webdriver.support.ui und expected_conditions as EC aus selenium.webdriver.support verwendet. Ein festes time.sleep() vor dem Lokalisieren ist anfällig, weil der Test weiterhin fehlschlägt, wenn das Element später gerendert wird.
Verwenden Sie bevorzugt den stabilsten verfügbaren Locator: zuerst eine Element-ID, dann ein name-Attribut oder einen CSS-Selektor und XPath für strukturbezogene Suchen. Die Browser-Snippets in diesem Artikel setzen pip install selenium sowie einen installierten Browser voraus; der Treiber wird über Selenium Manager aufgelöst. Sie sind für Selenium 4 geschrieben und werden als anpassbare Inline-Syntax gezeigt, nicht als hier ausgeführter Code.
Text und Tasten senden
Um ein Feld auszufüllen, übergeben Sie den Text an send_keys(); um das Formular abzusenden, hängen Sie Keys.ENTER an oder senden es in einem zweiten Aufruf (Keys befindet sich in selenium.webdriver.common.keys). Auf der oben lokalisierten Google-Seite tippt search_box.send_keys("This is filed by Selenium send keys") die Suchanfrage ein, und search_box.send_keys(Keys.ENTER) sendet sie ab. Ein Modifikator, der innerhalb von send_keys() gesendet wird – etwa Keys.CONTROL + "a" – drückt die Tasten gemeinsam, bleibt jedoch gedrückt, bis Sie ihn explizit loslassen, entweder indem Sie denselben Modifikator erneut oder Keys.NULL senden. Keys.chord(Keys.CONTROL, "a") ist die Form, die Modifikatoren von selbst wieder loslässt, weil sie nach der Tastenkombination Keys.NULL anhängt.
Der Screenshot zeigt den in das Google-Suchfeld getippten Text.
Eine Keys-Konstante ist ein einzelnes Zeichen. Wenn Sie die Zeichenkette selbst erstellen, sehen Sie daher genau, was eine Tastenkombination hinzufügt. Führen Sie dieses Beispiel aus:
Der folgende Codeblock und seine Ausgabe bleiben unverändert; die Kommentare und Beschriftungen darin sind auf Englisch.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
select_all = "\ue009" + "a" # Keys.CONTROL + "a"
field_value = "selenium" + "\ue007" # text + Keys.ENTER
print(len(select_all), len(field_value))
2 9
Jede Keys-Konstante zählt als ein Zeichen. "selenium" + Keys.ENTER sendet daher neun Tastaturereignisse: acht Buchstaben plus die Eingabetaste.
Eingaben validieren und Ergebnisse überprüfen
send_keys() führt keine eigenen Prüfungen durch – die Anwendung validiert. Um eine Validierung zu testen, senden Sie einen Wert, lösen die Anwendung aus und lesen anschließend die angezeigte Reaktion aus. Bei einem Anmeldeformular lautet die Sequenz email = driver.find_element(By.NAME, "email"), email.send_keys("not-an-email"), email.send_keys(Keys.ENTER) und danach zwei übliche Überprüfungen: email.get_attribute("value") liest den Feldinhalt zurück – Texteingabefelder speichern ihren Inhalt in value, nicht im .text des Elements – und driver.find_element(By.CSS_SELECTOR, ".error-message").text liest die Antwort, die die Anwendung rendert.
Dasselbe Muster deckt die üblichen Szenarien ab. Bei einem E-Mail-Feld senden Sie einen Wert, der das Format verletzt, und bestätigen, dass die Anwendung ihn ablehnt. Bei einem Passwortfeld senden Sie Werte, die jeweils eine Regel verletzen, und bestätigen die passende Meldung. Bei einer Suchleiste senden Sie eine Suchanfrage und prüfen, ob die von der Anwendung zurückgegebenen Ergebnisse relevant sind. In jedem Fall liefert send_keys() die Tastatureingaben, während Ihre Assertions bestätigen, wie die Anwendung reagiert.
Text löschen oder ersetzen
Um ein Feld zu überschreiben, haben Sie zwei Möglichkeiten:
element.clear()leert ein editierbares Feld mit einem einzigen WebDriver-Befehl.- Die Bearbeitung über die Tastatur löscht oder markiert Text tastendruckweise:
Keys.BACKSPACEentfernt das Zeichen vor dem Cursor,Keys.DELETEentfernt das Zeichen danach, undKeys.CONTROL + "a"markiert alles, sodass der nächstesend_keys()-Aufruf es ersetzt.
Der Unterschied ist wichtig, wenn ein Feld auf jeden Tastendruck reagiert – Autovervollständigungen und Live-Formatierer benötigen möglicherweise echte Tastaturereignisse, während clear() nur eine einzelne Aktualisierung auslöst. Im Google-Suchfeld lautet die Bearbeitungssequenz search_box.send_keys("For test purpose"), um einen Wert einzutippen, search_box.send_keys(3 * Keys.BACKSPACE), um die letzten drei Zeichen zu löschen (übrig bleibt “For test purp”), search_box.clear(), um das Feld zu leeren, und search_box.send_keys("testing second key"), um neuen Text einzutippen. Ein time.sleep(3) zwischen den Aufrufen ermöglicht es Ihnen, jeden Schritt im Browser zu beobachten, und driver.quit() schließt ihn am Ende.
Erster Schritt – der Text wird in das Feld getippt:
Zweiter Schritt – drei Zeichen werden per Rücktaste entfernt, sodass “For test purp” übrig bleibt:
Dritter Schritt – clear() leert das Feld, und neuer Text wird erneut eingegeben:
Fehlerbehebung bei send_keys()
Wenn Eingaben das Element nicht erreichen, prüfen Sie Folgendes:
NoSuchElementException: Der Locator stimmt nicht überein, die Seite wurde noch nicht vollständig gerendert, oder das Element befindet sich in einem<iframe>oder Shadow DOM. Warten Sie mitWebDriverWait, und verwenden Siedriver.switch_to.frame(...)für Inhalte in Frames.StaleElementReferenceException: Die Seite wurde nach dem Lokalisieren des Elements erneut gerendert. Lokalisieren Sie es daher unmittelbar vor der Eingabe erneut.ElementNotInteractableException: Das Element ist ausgeblendet, deaktiviert oder verdeckt. Scrollen Sie es in den sichtbaren Bereich, warten Sie aufelement_to_be_clickableund prüfen Sie die Attributedisabledundreadonly– ein schreibgeschütztes Feld lehnt Eingaben ab.InvalidElementStateException: Das Ziel kann nicht bearbeitet werden, etwa wennclear()auf einem nicht editierbaren Element aufgerufen wird.- Nichts erscheint: Der Fokus liegt möglicherweise auf einem anderen Element. Klicken Sie das Element zuerst an oder steuern Sie es mit
ActionChains(driver).move_to_element(el).click().send_keys(text). Bestätigen Sie, was angekommen ist, indem Sieelement.get_attribute("value")auslesen. - Tastenkombinationen und Sondertasten: Verwenden Sie
Keys-Konstanten oderKeys.chord();send_keys()sendet Zeichen, keine physischen Tastendrücke, und steuert daher keine IME-Komposition für Schriftsysteme, die sie benötigen.