Effacer le texte de la zone de texte avec du sélénium


142

J'ai quelques tests où je vérifie que le message d'erreur approprié apparaît lorsque le texte de certains champs n'est pas valide. Un contrôle de validité est qu'un certain élément textarea n'est pas vide.

Si cette zone de texte contient déjà du texte, comment puis-je dire au sélénium d'effacer le champ?

quelque chose comme:

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

1
Je l'ai trouvé driver.get_element_by_id ('foo'). Clear ()
Isaac

Réponses:


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

4
Cela ne fonctionne pas pour moi dans la version la plus récente de Selenium.
Apprentissage des statistiques par exemple le

3
youp chromedriver casse également sur celui-ci. La réponse Fenix ​​fonctionne partout
norbertas.gaulia

1
Cela peut être un problème avec les versions de sélénium et de pilote chromé en conflit. Il semble peu probable que les développeurs suppriment délibérément cette fonctionnalité de chromedriver.
Isaac le

7
Pour le moment, cette réponse ne fonctionne pas correctement dans les applications React car clear ne déclenchera pas la fonction React onChange. Ainsi, votre entrée sera effacée et les tests continueront et l'état de votre composant restera tel qu'il était avant. réagir question , problème de sélénium
ncrmro

1
@ncrmro 3 ans plus tard, il semble que cela ne fonctionne toujours pas
Stephen le

81

Vous pouvez utiliser

 webElement.clear();

Si cet élément est un élément d'entrée de texte, cela effacera la valeur.

Notez que les événements déclenchés par cet événement peuvent ne pas être comme prévu. En particulier, nous ne déclenchons aucun événement clavier ou souris. Si vous voulez vous assurer que les événements de clavier sont déclenchés, pensez à utiliser quelque chose comme sendKeys(CharSequence). Par exemple:

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

ou:

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

4
Lorsque vous utilisez CTRL + 'a', considérez la situation dans laquelle le test sera exécuté sur MacOS (autres raccourcis clavier). Btw - bonne suggestion, a résolu mon problème.
Outside_Box

1
Mon problème résolu par le "Keys.BACK_SPACE". Je capture juste le champ de test de recherche, exécutez .click () puis dans une boucle for, exécutez le code. il supprime tous les affréteurs que le champ de recherche avait auparavant. puis envoyez une nouvelle valeur dans le champ de recherche. Juste la fonction .clear () ne fonctionnait pas pour moi.
Noman_ibrahim

Aidé uniquement webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loopdans mon cas étrange
Chaki_Black

18

Je suis tombé sur un champ où .clear () ne fonctionnait pas. L'utilisation d'une combinaison des deux premières réponses a fonctionné pour ce domaine.

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

Quel est le ;pour encore?
stephen le

1
@ surfer190 ;n'est pas nécessaire en python. Je l'ai ajouté par accident. Bonne prise.
Jortega le


4

pour java

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

ou

webElement.clear();

Si cet élément est un élément d'entrée de texte, cela effacera la valeur.


3

C'est une syntaxe générale

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

1

Avec un simple appel de clear (), il apparaît dans le DOM que le composant input / textarea correspondant a toujours son ancienne valeur, donc toutes les modifications suivantes sur ce composant (par exemple, remplir le composant avec une nouvelle valeur) ne seront pas traitées à temps.

Si vous regardez dans le code source du sélénium, vous constaterez que la méthode clear () est documentée avec le commentaire suivant:

/ ** Si cet élément est un élément d'entrée de texte, cela effacera la valeur. N'a aucun effet sur les autres éléments. Les éléments d'entrée de texte sont des éléments INPUT et TEXTAREA. Notez que les événements déclenchés par cet événement peuvent ne pas être comme prévu. En particulier, nous ne déclenchons aucun événement clavier ou souris. Si vous voulez vous assurer que les événements de clavier sont déclenchés, envisagez d'utiliser quelque chose comme {@link #sendKeys (CharSequence ...)} avec la touche de retour arrière. Pour vous assurer d'obtenir un événement de modification, envisagez de suivre avec un appel à {@link #sendKeys (CharSequence ...)} avec la touche de tabulation. * /

Donc, en utilisant cette astuce utile pour effacer une zone d'entrée / de texte (composant qui a déjà une valeur) ET lui attribuer une nouvelle valeur, vous obtiendrez un code comme celui-ci:

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

Désolé pour ce code étant Java et non Python. En outre, j'ai dû sauter une méthode supplémentaire "waitUntilPageIsReady () () qui rendrait ce message trop long.

J'espère que cela vous aidera dans votre voyage avec Selenium!


1

D'après mon expérience, cela s'est avéré être le plus efficace

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

Nous envoyons Ctrl + Retour arrière pour supprimer tous les caractères de l'entrée, vous pouvez également remplacer le retour arrière par supprimer.

EDIT: suppression de la dépendance des clés


0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') a très bien fonctionné avec FireFox

  • u '\ ue003' est un RETOUR_SPACE pour ceux comme moi - ne s'en souvenant jamais)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.