Texto claro del área de texto con selenio

142

Tengo algunas pruebas en las que compruebo que aparece el mensaje de error adecuado cuando el texto en ciertos campos no es válido. Una comprobación de validez es que cierto elemento de área de texto no está vacío.

Si este área de texto ya tiene texto, ¿cómo puedo decirle al selenio que borre el campo?

algo como:

driver.get_element_by_id('foo').clear_field()
Isaac
fuente
1
Lo encontré driver.get_element_by_id ('foo'). Clear ()
Isaac

Respuestas:

215
driver.find_element_by_id('foo').clear()
Isaac
fuente
44
Esto no funciona para mí en la versión más reciente de Selenium.
Estadísticas de aprendizaje por ejemplo
3
youp chromedriver también se rompe en este caso. La respuesta de Fenix ​​funciona en todas partes
norbertas.gaulia
1
Puede ser un problema con las versiones conflictivas de selenio y chromedriver. Parece poco probable que los desarrolladores eliminen esta funcionalidad de chromedriver deliberadamente.
Isaac
77
Por el momento, esta respuesta no funciona correctamente en las aplicaciones React, ya que clear no hará que se active la función React onChange. Por lo tanto, su entrada se borrará y las pruebas continuarán y el estado de su componente permanecerá como estaba antes. problema de reacción , problema de selenio
ncrmro
1
@ncrmro 3 años después parece que esto todavía no funciona
stephen
81

Puedes usar

 webElement.clear();

Si este elemento es un elemento de entrada de texto, esto borrará el valor.

Tenga en cuenta que los eventos activados por este evento pueden no ser los esperados. En particular, no activamos ningún evento de teclado o mouse. Si desea asegurarse de que se activen los eventos del teclado, considere usar algo como sendKeys(CharSequence). P.ej:

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

o:

 webElement.sendKeys(Keys.CONTROL + "a");
 webElement.sendKeys(Keys.DELETE);
Fénix
fuente
44
Cuando use CTRL + 'a' considere la situación en la que la prueba se ejecutará en MacOS (otros atajos de teclado). Por cierto, buena sugerencia, resolvió mi problema.
Outside_Box
1
Mi problema resuelto por el "Keys.BACK_SPACE". Simplemente capturo el campo de prueba de búsqueda, ejecuto .click () y luego dentro de un bucle for ejecuta el código. elimina todos los fletadores que el campo de búsqueda tenía anteriormente. luego envíe un nuevo valor al campo de búsqueda. La función .clear () no funcionaba para mí.
Noman_ibrahim
Ayudado solo webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loopen mi extraño caso
Chaki_Black
17

Me encontré con un campo donde .clear () no funcionaba. El uso de una combinación de las dos primeras respuestas funcionó para este 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);
Jortega
fuente
¿Para qué sirve ;de nuevo?
Stephen
1
@ surfer190 ;no es necesario en python. Lo agregué por accidente. Buena atrapada.
Jortega
16

En la versión más reciente de Selenium, use:

driver.find_element_by_id('foo').clear()
Estadísticas de aprendizaje por ejemplo
fuente
4

para java

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

o

webElement.clear();

Si este elemento es un elemento de entrada de texto, esto borrará el valor.

vaibhavcool20
fuente
3

Es sintaxis general

driver.find_element_by_id('Locator value').clear();
driver.find_element_by_name('Locator value').clear();
iamsankalp89
fuente
1

Con una simple llamada de clear (), aparece en el DOM que el componente de entrada / área de texto correspondiente todavía tiene su valor anterior, por lo que los siguientes cambios en ese componente (por ejemplo, llenar el componente con un nuevo valor) no se procesarán a tiempo.

Si observa el código fuente de selenio, encontrará que el método clear () está documentado con el siguiente comentario:

/ ** Si este elemento es un elemento de entrada de texto, esto borrará el valor. No tiene efecto sobre otros elementos. Los elementos de entrada de texto son elementos INPUT y TEXTAREA. Tenga en cuenta que los eventos activados por este evento pueden no ser los esperados. En particular, no activamos ningún evento de teclado o mouse. Si desea asegurarse de que se activen los eventos del teclado, considere usar algo como {@link #sendKeys (CharSequence ...)} con la tecla de retroceso. Para asegurarse de obtener un evento de cambio, considere seguir con una llamada a {@link #sendKeys (CharSequence ...)} con la tecla de tabulación. * /

Entonces, utilizando esta sugerencia útil para borrar una entrada / área de texto (componente que ya tiene un valor) Y asignarle un nuevo valor, obtendrá un código como el siguiente:

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

Lo siento, este código es Java y no Python. Además, tuve que omitir un método adicional "waitUntilPageIsReady () que haría que esta publicación fuera demasiado larga.

¡Espero que esto te ayude en tu viaje con Selenium!

ShadowGames
fuente
1

En mi experiencia, este resultó ser el más eficiente

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

Estamos enviando Ctrl + Retroceso para eliminar todos los caracteres de la entrada, también puede reemplazar el retroceso con eliminar.

EDITAR: se eliminó la dependencia de Keys

m0h17
fuente
0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') funcionó muy bien con Firefox

  • u '\ ue003' es un BACK_SPACE para aquellos como yo, nunca lo recuerdo)
Виктория Демкина
fuente