Texto não criptografado da área de texto com selênio


142

Eu tenho alguns testes nos quais estou verificando se a mensagem de erro correta aparece quando o texto em determinados campos é inválido. Uma verificação de validade é que um determinado elemento da área de texto não está vazio.

Se essa área de texto já tiver texto, como posso dizer ao selênio para limpar o campo?

algo como:

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

1
Eu encontrei driver.get_element_by_id ('foo'). Clear ()
Isaac

Respostas:


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

4
Isso não funciona para mim na versão mais recente do Selenium.
Estatísticas de aprendizado por exemplo

3
você chromedriver também quebra neste. Fenix resposta funciona em qualquer lugar
norbertas.gaulia

1
Pode ser um problema com versões conflitantes de selênio e chromedriver. Parece improvável que os desenvolvedores removam essa funcionalidade do chromedriver deliberadamente.
Isaac

7
No momento, essa resposta não funciona corretamente nos aplicativos React, pois a limpeza não fará com que a função React onChange seja acionada. Assim, sua entrada será limpa e os testes seguirão em frente e o estado do seu componente permanecerá como antes. reagir questão , questão selênio
ncrmro

1
@ncrmro 3 anos depois, parece que isso ainda não funciona
stephen

81

Você pode usar

 webElement.clear();

Se este elemento for um elemento de entrada de texto, isso limpará o valor.

Observe que os eventos disparados por esse evento podem não ser os esperados. Em particular, não acionamos eventos de teclado ou mouse. Se você deseja garantir que os eventos do teclado sejam acionados, considere usar algo parecido sendKeys(CharSequence). Por exemplo:

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

ou:

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

4
Ao usar CTRL + 'a', considere a situação em que o teste será executado no MacOS (outros atalhos de teclado). Btw - boa sugestão, resolveu o meu problema.
Outside_Box 15/01

1
Meu problema foi resolvido pelo "Keys.BACK_SPACE". Acabei de capturar o campo de teste de pesquisa, execute .click () e, em um loop for, execute o código. remove todos os fretadores que o campo de pesquisa possuía anteriormente. em seguida, envie um novo valor para o campo de pesquisa. A função .clear () não estava funcionando para mim.
Noman_ibrahim

Ajudou a única webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loopno meu caso estranho
Chaki_Black

17

Encontrei um campo em que .clear () não funcionava. Usando uma combinação das duas primeiras respostas funcionou 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);

Para que serve ;novamente?
stephen

1
@ surfer190 ;não é necessário em python. Eu adicionei por acidente. Boa pegada.
Jortega 03/04


4

para java

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

ou

webElement.clear();

Se este elemento for um elemento de entrada de texto, isso limpará o valor.


3

É uma sintaxe geral

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

1

Com uma simples chamada de clear (), aparece no DOM que o componente de entrada / área de texto correspondente ainda possui seu valor antigo, portanto, quaisquer alterações a seguir nesse componente (por exemplo, preenchendo o componente com um novo valor) não serão processadas a tempo.

Se você der uma olhada no código fonte do selênio, verá que o método clear () - está documentado com o seguinte comentário:

/ ** Se este elemento for um elemento de entrada de texto, isso limpará o valor. Não tem efeito sobre outros elementos. Os elementos de entrada de texto são elementos INPUT e TEXTAREA. Observe que os eventos disparados por esse evento podem não ser os esperados. Em particular, não acionamos eventos de teclado ou mouse. Se você deseja garantir que os eventos do teclado sejam acionados, considere usar algo como {@link #sendKeys (CharSequence ...)} com a tecla backspace. Para garantir que você obtenha um evento de alteração, considere seguir com uma chamada para {@link #sendKeys (CharSequence ...)} com a tecla tab. * /

Portanto, usando esta dica útil para limpar uma entrada / área de texto (componente que já possui um valor) E atribuir um novo valor a ele, você receberá um código como o seguinte:

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

Desculpe por este código ser Java e não Python. Além disso, tive que pular um método "waitUntilPageIsReady () - adicional que tornaria essa postagem muito longa.

Espero que isso ajude você em sua jornada com o Selenium!


1

Na minha experiência, isso acabou sendo o mais eficiente

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

Estamos enviando Ctrl + Backspace para excluir todos os caracteres da entrada. Você também pode substituir o backspace por delete.

EDIT: dependência de chaves removida


0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') funcionou muito bem com o FireFox

  • u '\ ue003' é um BACK_SPACE para quem gosta de mim - nunca se lembra)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.