Wyczyść tekst z obszaru tekstowego za pomocą selenu

142

Mam kilka testów, w których sprawdzam, czy pojawia się właściwy komunikat o błędzie, gdy tekst w niektórych polach jest nieprawidłowy. Jednym ze sposobów sprawdzenia poprawności jest to, że określony element textarea nie jest pusty.

Jeśli ten obszar tekstowy zawiera już tekst, jak mogę powiedzieć selenowi, aby wyczyścił pole?

coś jak:

driver.get_element_by_id('foo').clear_field()
Izaak
źródło
1
Znalazłem to driver.get_element_by_id ('foo'). Clear ()
Isaac

Odpowiedzi:

215
driver.find_element_by_id('foo').clear()
Izaak
źródło
4
To nie działa dla mnie w najnowszej wersji Selenium.
Statystyki uczenia się na przykładzie
3
youp chromedriver również psuje się na tym. Odpowiedź Fenix ​​działa wszędzie
norbertas.gaulia
1
Może to być problem w przypadku sprzecznych wersji selenu i chromedriver. Wydaje się mało prawdopodobne, aby programiści celowo usunęli tę funkcję z chromedriver.
Isaac
7
W tej chwili ta odpowiedź nie działa poprawnie w aplikacjach React, ponieważ wyczyszczenie nie spowoduje uruchomienia funkcji React onChange. W ten sposób wprowadzone dane zostaną wyczyszczone, a testy będą kontynuowane, a stan komponentu pozostanie taki, jak przedtem.
reaguj na
1
@ncrmro 3 lata później wygląda na to, że to nadal nie działa
stephen
81

Możesz użyć

 webElement.clear();

Jeśli ten element jest elementem wprowadzania tekstu, spowoduje to wyczyszczenie wartości.

Pamiętaj, że zdarzenia wywołane przez to zdarzenie mogą nie być zgodne z oczekiwaniami. W szczególności nie uruchamiamy żadnych zdarzeń związanych z klawiaturą ani myszą. Jeśli chcesz mieć pewność, że zdarzenia klawiatury są uruchamiane, rozważ użycie czegoś takiego jak sendKeys(CharSequence). Na przykład:

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

lub:

 webElement.sendKeys(Keys.CONTROL + "a");
 webElement.sendKeys(Keys.DELETE);
Fenix
źródło
4
Używając CTRL + 'a' weź pod uwagę sytuację, w której test będzie uruchamiany na MacOS (inne skróty klawiszowe). Przy okazji - dobra sugestia, rozwiązała mój problem.
Outside_Box
1
Mój problem został rozwiązany przez „Keys.BACK_SPACE”. Po prostu przechwytuję pole testowe wyszukiwania, uruchamiam .click (), a następnie w pętli for uruchamiam kod. usuwa wszystkich czarterujących, które poprzednio posiadało pole wyszukiwania. następnie wyślij nową wartość do pola wyszukiwania. Funkcja Just .clear () nie działała dla mnie.
Noman_ibrahim
Pomogło tylko webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loopw moim dziwnym przypadku
Chaki_Black
17

Wpadłem na pole, na którym .clear () nie działa. Użycie kombinacji dwóch pierwszych odpowiedzi zadziałało w tej dziedzinie.

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);
Jortega
źródło
Po co ;znowu?
stephen
1
@ surfer190 ;nie jest konieczne w Pythonie. Dodałem to przypadkowo. Dobry chwyt.
Jortega
16

W najnowszej wersji Selenium użyj:

driver.find_element_by_id('foo').clear()
Nauka statystyk na przykładzie
źródło
4

dla java

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

lub

webElement.clear();

Jeśli ten element jest elementem wprowadzania tekstu, spowoduje to wyczyszczenie wartości.

vaibhavcool20
źródło
3

To jest składnia ogólna

driver.find_element_by_id('Locator value').clear();
driver.find_element_by_name('Locator value').clear();
iamsankalp89
źródło
1

Po prostym wywołaniu funkcji clear () w modelu DOM okazuje się, że odpowiedni komponent input / textarea nadal ma swoją starą wartość, więc wszelkie późniejsze zmiany w tym komponencie (np. Wypełnienie komponentu nową wartością) nie będą przetwarzane w czasie.

Jeśli spojrzysz na kod źródłowy selenu, zobaczysz, że metoda clear () - jest udokumentowana następującym komentarzem:

/ ** Jeśli ten element jest elementem wprowadzania tekstu, spowoduje to wyczyszczenie wartości. Nie ma wpływu na inne elementy. Elementy wprowadzania tekstu to elementy INPUT i TEXTAREA. Pamiętaj, że zdarzenia wywołane przez to zdarzenie mogą nie być zgodne z oczekiwaniami. W szczególności nie uruchamiamy żadnych zdarzeń związanych z klawiaturą ani myszą. Jeśli chcesz mieć pewność, że zdarzenia klawiatury są uruchamiane, rozważ użycie czegoś takiego jak {@link #sendKeys (CharSequence ...)} z klawiszem Backspace. Aby zapewnić otrzymanie zdarzenia zmiany, rozważ wykonanie wywołania {@link #sendKeys (CharSequence ...)} za pomocą klawisza tabulatora. * /

Korzystając z tej przydatnej wskazówki, aby wyczyścić dane wejściowe / obszar tekstowy (komponent, który już ma wartość) ORAZ przypisać mu nową wartość, otrzymasz kod podobny do następującego:

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;
}

Przepraszamy, że ten kod to Java, a nie Python. Musiałem również pominąć dodatkową metodę „waitUntilPageIsReady ()”, która spowodowałaby, że ten post byłby zbyt długi.

Mam nadzieję, że pomoże Ci to w Twojej podróży z Selenium!

ShadowGames
źródło
1

Z mojego doświadczenia wynika, że ​​jest to najbardziej efektywne

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

Wysyłamy Ctrl + Backspace, aby usunąć wszystkie znaki z wejścia, możesz też zamienić Backspace na delete.

EDYCJA: usunięto zależność Keys

m0h17
źródło
0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') działał świetnie z FireFox

  • u '\ ue003' to BACK_SPACE dla takich jak ja - nigdy o tym nie pamiętam)
Виктория Демкина
źródło