J'ai des tests où je vérifie que le message d'erreur approprié apparaît lorsque le texte de certains champs est invalide. Une vérification de la 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 à Selenium de vider le champ?
quelque chose comme:
driver.get_element_by_id('foo').clear_field()
driver.find_element_by_id('foo').clear()
Vous pouvez utiliser
webElement.clear();
Si cet élément est un élément d'entrée de texte, la valeur sera effacée.
Notez que les événements déclenchés par cet événement peuvent ne pas être conformes à vos attentes. En particulier, nous ne déclenchons aucun événement de clavier ou de souris. Si vous voulez vous assurer que les événements de clavier sont déclenchés, utilisez 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);
Dans la version la plus récente de Selenium, utilisez:
driver.find_element_by_id('foo').clear()
C'est la syntaxe générale
driver.find_element_by_id('Locator value').clear();
driver.find_element_by_name('Locator value').clear();
pour Java
driver.findelement(By.id('foo').clear();
ou
webElement.clear();
Si cet élément est un élément d'entrée de texte, la valeur sera effacée.
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 champ.
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);
Avec un simple appel à clear (), il apparaît dans le DOM que le composant input/textarea correspondant a toujours son ancienne valeur. Par conséquent, les modifications suivantes de ce composant (par exemple, le remplissage du composant avec une nouvelle valeur) ne seront pas traitées à temps.
Si vous regardez dans le code source Selenium, 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 de saisie 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 conformes à vos attentes. En particulier, nous ne déclenchons aucun événement de clavier ou de souris. Si vous voulez vous assurer que les événements de clavier sont déclenchés, utilisez 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 entrée/zone de texte (composant qui a déjà une valeur) ET lui affecter une nouvelle valeur, vous obtiendrez du 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 pas Python. En outre, je devais ignorer une méthode supplémentaire "waitUntilPageIsReady ()" qui rendrait cette publication trop longue.
J'espère que cela vous aidera dans votre voyage avec Selenium!