85 votes

Selenium WebDriver : Je veux écraser la valeur du champ au lieu de l'ajouter avec sendKeys en utilisant Java.

Dans WebDriver, si j'utilise sendKeys, ma chaîne sera ajoutée à la valeur qui existe déjà dans le champ. Je ne peux pas l'effacer en utilisant la méthode clear() parce qu'à la seconde où je le fais, la page Web va lancer une erreur disant que la valeur doit être comprise entre 10 et 100. Je ne peux donc pas l'effacer, sinon une erreur sera générée avant que je puisse entrer la nouvelle valeur en utilisant sendKeys, et si j'envoie sendKeys, il ne fait que l'ajouter à la valeur déjà présente.

Y a-t-il quelque chose dans WebDriver qui vous permette d'écraser la valeur du champ ?

122voto

Tim Banks Points 4053

Vous pouvez également effacer le champ avant d'envoyer les clés.

element.clear()
element.sendKeys("Some text here")

9 votes

True_Blue a mentionné dans la question qu'il ne peut pas utiliser clear() parce qu'à la seconde où il le fait, la page Web affichera une erreur disant que la valeur doit être comprise entre 10 et 100.

5 votes

Bon choix. Je vais garder ma réponse ici, au cas où elle serait utile à quelqu'un à l'avenir, puisque le titre ne le précise pas.

6 votes

Info supplémentaire si cette solution ne fonctionne pas pour quelqu'un : assurez-vous que element.GetAttribute("value") a réellement une valeur avant d'appeler element.clear() (attendez que cette valeur soit non vide). Cela arrive parfois lorsque l'on teste des entrées AngularJS avec la directive ngModel.

102voto

Sergii Pozharov Points 6214

Je pense que vous pouvez essayer de sélectionner d'abord tout le texte dans le champ, puis d'envoyer la nouvelle séquence :

from selenium.webdriver.common.keys import Keys
element.sendKeys(Keys.chord(Keys.CONTROL, "a"), "55");

2 votes

Oui, ça a marché, j'ai juste dû importer la classe Keys. Merci beaucoup.

0 votes

Je l'essaie dans Pyton. Comment puis-je importer Keys ?

0 votes

@scarba05 Il est possible que votre bureau Linux utilise une commande différente pour sélectionner tout le texte au lieu de Ctrl+A, mais dans la plupart des cas, cela devrait fonctionner.

23voto

ChangeRequest Points 111

Ok, c'est il y a quelques jours... Dans mon cas actuel, la réponse de ZloiAdun ne fonctionne pas pour moi, mais m'amène très près de ma solution...

Au lieu de :

element.sendKeys(Keys.chord(Keys.CONTROL, "a"), "55");

le code suivant me rend heureux :

element.sendKeys(Keys.HOME, Keys.chord(Keys.SHIFT, Keys.END), "55");

J'espère que cela aidera quelqu'un !

0 votes

J'ai utilisé ceci -> element.sendKeys(Keys.HOME,Keys.chord(Keys.SHIFT, Keys.ARROW_DOWN, Keys.ARROW_DOWN, Keys.ARROW_DOWN)) ; C'était incroyable, il sélectionne 3 lignes de texte dans une zone de texte, car la commande A ne fonctionnait pas non plus pour moi.

9voto

Noah Heldman Points 2817

Au cas où cela aiderait quelqu'un, l'équivalent C# de la réponse de ZloiAdun est :

element.SendKeys(Keys.Control + "a");
element.SendKeys("55");

2voto

Gadget Points 78

Utilisez celle-ci, c'est une solution de confiance et elle fonctionne bien pour tous les navigateurs :

protected void clearInput(WebElement webElement) {
    // isIE() - just checks is it IE or not - use your own implementation
    if (isIE() && "file".equals(webElement.getAttribute("type"))) {
        // workaround
        // if IE and input's type is file - do not try to clear it.
        // If you send:
        // - empty string - it will find file by empty path
        // - backspace char - it will process like a non-visible char
        // In both cases it will throw a bug.
        // 
        // Just replace it with new value when it is need to.
    } else {
        // if you have no StringUtils in project, check value still empty yet
        while (!StringUtils.isEmpty(webElement.getAttribute("value"))) {
            // "\u0008" - is backspace char
            webElement.sendKeys("\u0008");
        }
    }
}

Si l'entrée a un type="file" - ne l'effacez pas pour IE. Il essaiera de trouver le fichier par un chemin vide et créera un bug.

Vous pouvez trouver plus de détails sur mon blog

0 votes

Désolé, j'ai mal compris. Ma solution ne concerne que la bonne façon d'effacer la valeur saisie, mais pas la façon de remplacer la valeur actuelle par la nouvelle en une seule action.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X