Cancella testo da textarea con selenio


142

Ho alcuni test in cui sto controllando che venga visualizzato il messaggio di errore corretto quando il testo in alcuni campi non è valido. Un controllo per la validità è che un determinato elemento textarea non è vuoto.

Se questa textarea contiene già del testo, come posso dire al selenio di cancellare il campo?

qualcosa di simile a:

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

1
L'ho trovato driver.get_element_by_id ('pippo'). Clear ()
Isaac,

Risposte:


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

4
Questo non funziona per me nella versione più recente di Selenium.
Statistiche di apprendimento con l'esempio

3
anche tu il chromedriver si rompe su questo. La risposta di Fenix ​​funziona ovunque
norbertas.gaulia

1
Potrebbe essere un problema con le versioni in conflitto di selenio e chromedriver. Sembra improbabile che gli sviluppatori rimuovano deliberatamente questa funzionalità da chromedriver.
Isacco,

7
Al momento questa risposta non funziona correttamente nelle app React, poiché la funzione Clear non provoca l'attivazione della funzione Reac onChange. In questo modo il tuo input verrà cancellato e i test proseguiranno e lo stato del tuo componente rimarrà come prima. problema di reazione , problema di selenio
ncrmro

1
@ncrmro 3 anni dopo sembra che questo non funzioni ancora
stephen

81

Puoi usare

 webElement.clear();

Se questo elemento è un elemento di immissione testo, questo cancellerà il valore.

Tieni presente che gli eventi generati da questo evento potrebbero non essere quelli previsti. In particolare, non generiamo eventi da tastiera o mouse. Se vuoi assicurarti che gli eventi della tastiera vengano attivati, considera l'utilizzo di qualcosa del genere sendKeys(CharSequence). Per esempio:

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

o:

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

4
Quando usi CTRL + 'a' considera la situazione in cui il test sarà eseguito su MacOS (altre scorciatoie da tastiera). A proposito, buon suggerimento, risolto il mio problema.
Outside_Box

1
Il mio problema è stato risolto da "Keys.BACK_SPACE". Catturo solo il campo del test di ricerca, eseguo .click () quindi all'interno di un ciclo for eseguo il codice. rimuove tutti i noleggiatori che il campo di ricerca aveva precedentemente. quindi invia un nuovo valore al campo di ricerca. Solo la funzione .clear () non funzionava per me.
Noman_ibrahim,

Aiutato solo webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loopnel mio strano caso
Chaki_Black,

18

Mi sono imbattuto in un campo in cui .clear () non funzionava. Utilizzando una combinazione delle prime due risposte ha funzionato per questo campo.

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

A cosa serve ;di nuovo?
stephen,

1
@ surfer190 ;non è necessario in Python. L'ho aggiunto per caso. Buona pesca.
Jortega,


4

per java

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

o

webElement.clear();

Se questo elemento è un elemento di immissione testo, questo cancellerà il valore.


3

È una sintassi generale

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

1

Con un semplice richiamo di clear () appare nel DOM che il componente input / textarea corrispondente ha ancora il suo vecchio valore, quindi eventuali successive modifiche su quel componente (es. Riempire il componente con un nuovo valore) non verranno elaborate in tempo.

Se dai un'occhiata al codice sorgente del selenio, scoprirai che il metodo clear () - è documentato con il seguente commento:

/ ** Se questo elemento è un elemento di immissione testo, questo cancellerà il valore. Non ha alcun effetto su altri elementi. Gli elementi di immissione testo sono INPUT e TEXTAREA. Tieni presente che gli eventi generati da questo evento potrebbero non essere quelli previsti. In particolare, non generiamo eventi da tastiera o mouse. Se vuoi assicurarti che gli eventi della tastiera vengano attivati, considera l'utilizzo di qualcosa come {@link #sendKeys (CharSequence ...)} con il tasto backspace. Per assicurarti di ricevere un evento di modifica, considera di seguire con una chiamata a {@link #sendKeys (CharSequence ...)} con il tasto Tab. * /

Quindi, usando questo utile suggerimento per cancellare un input / textarea (componente che ha già un valore) E assegnargli un nuovo valore, otterrai un codice come il seguente:

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

Ci scusiamo per questo codice essendo Java e non Python. Inoltre, ho dovuto saltare un ulteriore metodo "waitUntilPageIsReady () - che renderebbe questo post troppo lungo.

Spero che questo ti aiuti nel tuo viaggio con Selenium!


1

Nella mia esperienza, questo si è rivelato il più efficiente

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

Stiamo inviando Ctrl + Backspace per eliminare tutti i caratteri dall'input, puoi anche sostituire backspace con delete.

EDIT: rimozione delle chiavi rimossa


0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') ha funzionato alla grande con FireFox

  • u '\ ue003' è un BACK_SPACE per quelli come me - non ricordarlo mai)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.