Klartext aus dem Textbereich mit Selen


142

Ich habe einige Tests, bei denen ich überprüfe, ob die richtige Fehlermeldung angezeigt wird, wenn Text in bestimmten Feldern ungültig ist. Eine Überprüfung der Gültigkeit besteht darin, dass ein bestimmtes Textbereichselement nicht leer ist.

Wenn dieser Textbereich bereits Text enthält, wie kann ich Selen anweisen, das Feld zu löschen?

etwas wie:

driver.get_element_by_id('foo').clear_field()

1
Ich fand es driver.get_element_by_id ('foo'). Clear ()
Isaac

Antworten:


214
driver.find_element_by_id('foo').clear()

4
Dies funktioniert bei mir in der neuesten Selenium-Version nicht.
Learning - Statistik von Beispiel

3
youp chromedriver bricht auch bei diesem. Fenix ​​Antwort funktioniert überall
norbertas.gaulia

1
Dies kann ein Problem mit widersprüchlichen Selen- und Chromedriver-Versionen sein. Es ist unwahrscheinlich, dass die Entwickler diese Funktionalität absichtlich von chromedriver entfernen.
Isaac

7
Im Moment funktioniert diese Antwort in React-Apps nicht richtig, da durch Löschen die React onChange-Funktion nicht ausgelöst wird. Auf diese Weise wird Ihre Eingabe gelöscht und die Tests werden fortgesetzt, und der Status Ihrer Komponente bleibt unverändert. reagieren Problem , Selen Problem
ncrmro

1
@ncrmro 3 Jahre später sieht es so aus, als ob dies immer noch nicht funktioniert
Stephen

81

Sie können verwenden

 webElement.clear();

Wenn dieses Element ein Texteingabeelement ist, wird der Wert gelöscht.

Beachten Sie, dass die von diesem Ereignis ausgelösten Ereignisse möglicherweise nicht den Erwartungen entsprechen. Insbesondere lösen wir keine Tastatur- oder Mausereignisse aus. Wenn Sie sicherstellen möchten, dass Tastaturereignisse ausgelöst werden, sollten Sie Folgendes verwenden sendKeys(CharSequence). Z.B:

 webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loop

oder:

 webElement.sendKeys(Keys.CONTROL + "a");
 webElement.sendKeys(Keys.DELETE);

4
Berücksichtigen Sie bei Verwendung von STRG + 'a' die Situation, in der der Test unter MacOS (anderen Tastaturkürzeln) ausgeführt wird. Übrigens - guter Vorschlag, mein Problem gelöst.
Outside_Box

1
Mein Problem wurde durch die "Keys.BACK_SPACE" gelöst. Ich nehme einfach das Suchtestfeld auf, führe .click () aus und führe dann in einer for-Schleife den Code aus. Es entfernt alle Charterer, die das Suchfeld zuvor hatte. Senden Sie dann einen neuen Wert an das Suchfeld. Nur die Funktion .clear () funktionierte bei mir nicht.
Noman_ibrahim

Hat nur webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loopin meinem seltsamen Fall geholfen
Chaki_Black

17

Ich bin auf ein Feld gestoßen, in dem .clear () nicht funktioniert hat. Die Verwendung einer Kombination der ersten beiden Antworten funktionierte für dieses Feld.

from selenium.webdriver.common.keys import Keys

#...your code (I was using python 3)

driver.find_element_by_id('foo').send_keys(Keys.CONTROL + "a");
driver.find_element_by_id('foo').send_keys(Keys.DELETE);

Wofür ist das ;nochmal?
Stephen

1
@ surfer190 ;ist in Python nicht erforderlich. Ich habe es versehentlich hinzugefügt. Guter Fang.
Jortega


4

für Java

driver.findelement(By.id('foo').clear();

oder

webElement.clear();

Wenn dieses Element ein Texteingabeelement ist, wird der Wert gelöscht.


3

Es ist eine allgemeine Syntax

driver.find_element_by_id('Locator value').clear();
driver.find_element_by_name('Locator value').clear();

1

Mit einem einfachen Aufruf von clear () wird im DOM angezeigt, dass die entsprechende Eingabe- / Textbereichskomponente noch ihren alten Wert hat, sodass alle folgenden Änderungen an dieser Komponente (z. B. Füllen der Komponente mit einem neuen Wert) nicht rechtzeitig verarbeitet werden.

Wenn Sie sich den Selen-Quellcode ansehen, werden Sie feststellen, dass die clear () - Methode mit dem folgenden Kommentar dokumentiert ist:

/ ** Wenn dieses Element ein Texteingabeelement ist, wird der Wert gelöscht. Hat keine Auswirkung auf andere Elemente. Texteingabeelemente sind INPUT- und TEXTAREA-Elemente. Beachten Sie, dass die von diesem Ereignis ausgelösten Ereignisse möglicherweise nicht den Erwartungen entsprechen. Insbesondere lösen wir keine Tastatur- oder Mausereignisse aus. Wenn Sie sicherstellen möchten, dass Tastaturereignisse ausgelöst werden, sollten Sie {@link #sendKeys (CharSequence ...)} mit der Rücktaste verwenden. Um sicherzustellen, dass Sie ein Änderungsereignis erhalten, sollten Sie {@link #sendKeys (CharSequence ...)} mit der Tabulatortaste aufrufen. * /

Wenn Sie diesen hilfreichen Hinweis verwenden, um einen Eingabe- / Textbereich (Komponente, die bereits einen Wert hat) zu löschen UND ihm einen neuen Wert zuzuweisen, erhalten Sie Code wie den folgenden:

public void waitAndClearFollowedByKeys(By by, CharSequence keys) {
    LOG.debug("clearing element");
    wait(by, true).clear();
    sendKeys(by, Keys.BACK_SPACE.toString() + keys);
}

public void sendKeys(By by, CharSequence keysToSend) {
    WebElement webElement = wait(by, true);
    LOG.info("sending keys '{}' to {}", escapeProperly(keysToSend), by);
    webElement.sendKeys(keysToSend);
    LOG.info("keys sent");
}

private String escapeProperly(CharSequence keysToSend) {
    String result = "" + keysToSend;
    result = result.replace(Keys.TAB, "\\t");
    result = result.replace(Keys.ENTER, "\\n");
    result = result.replace(Keys.RETURN, "\\r");

    return result;
}

Entschuldigen Sie, dass dieser Code Java und nicht Python ist. Außerdem musste ich eine zusätzliche "waitUntilPageIsReady () - Methode überspringen, die diesen Beitrag viel zu lang machen würde.

Hoffe das hilft dir auf deiner Reise mit Selen!


1

Nach meiner Erfahrung erwies sich dies als die effizienteste

driver.find_element_by_css_selector('foo').send_keys(u'\ue009' + u'\ue003')

Wir senden Strg + Rücktaste, um alle Zeichen aus der Eingabe zu löschen. Sie können auch die Rücktaste durch Löschen ersetzen.

BEARBEITEN: Schlüsselabhängigkeit entfernt


0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') hat super mit FireFox funktioniert

  • u '\ ue003' ist ein BACK_SPACE für Leute wie mich - ich erinnere mich nie daran)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.