web-dev-qa-db-fra.com

Selenium WebDriver: je veux écraser la valeur dans le 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 () car, à la seconde près, la page Web affichera une erreur indiquant qu'il doit être compris entre 10 et 100. Je ne peux donc pas l'effacer ou une erreur sera générée avant. Je peux mettre la nouvelle valeur en utilisant sendKeys, et si je l'envoie, elle l'ajoute simplement à la valeur déjà présente.

Existe-t-il quelque chose dans WebDriver qui vous permet d'écraser la valeur dans le champ?

60
True_Blue

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

from Selenium.webdriver.common.keys import Keys
element.sendKeys(Keys.chord(Keys.CONTROL, "a"), "55");
70
Sergii Pozharov

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

element.clear()
element.sendKeys("Some text here")
93
Tim Banks

Ok, il y a quelques jours .......... Dans mon cas actuel, la réponse de ZloiAdun ne fonctionne pas pour moi, mais me rapproche beaucoup 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");

Alors j'espère que ça aide quelqu'un!

13
ChangeRequest

Cela a fonctionné pour moi.

mElement.sendKeys(Keys.HOME,Keys.chord(Keys.SHIFT,Keys.END),MY_VALUE);
7
Guy Engel

Si cela peut aider quelqu'un, l'équivalent C # de ZloiAdun est:

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

Utilisez celui-ci, c'est une solution de confiance et 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 input a le type = "fichier" - ne l'effacez pas pour IE. Il essaiera de trouver le fichier par chemin vide et jettera un bogue.

Plus de détails que vous pourriez trouver sur mon blog

1
Gadget

Utilisez le suivant:

driver.findElement(By.id("id")).sendKeys(Keys.chord(Keys.CONTROL, "a", Keys.DELETE), "Your Value");
1
Akhil

Eu des problèmes en utilisant la plupart des méthodes mentionnées depuis textfield n'a pas accepté la saisie au clavier et la solution de la souris semble pas complète.

Cela a permis de simuler un clic dans le champ, en sélectionnant le contenu et en le remplaçant par le nouveau.

     Actions actionList = new Actions(driver);
     actionList.clickAndHold(WebElement).sendKeys(newTextFieldString).
     release().build().perform();
0
Boris Imenitov

La question initiale dit clear () ne peut pas être utilisée. Cela ne s'applique pas à cette situation. J'ajoute mon exemple de travail ici car cet article SO a été l'un des premiers résultats de Google à effacer une entrée avant d'entrer une valeur.

Pour les entrées où il n'y a pas de restriction supplémentaire, j'inclus une méthode agnostique de navigateur pour Selenium utilisant NodeJS. Cet extrait fait partie d'une bibliothèque commune que j'importe avec var test = require( 'common' ); dans mes scripts de test. C'est pour une définition de noeud standard module.exports.

when_id_exists_type : function( id, value ) {
driver.wait( webdriver.until.elementLocated( webdriver.By.id( id ) ) , 3000 )
    .then( function() {
        var el = driver.findElement( webdriver.By.id( id ) );
        el.click();
        el.clear();
        el.sendKeys( value );
    });
},

Recherchez l'élément, cliquez dessus, effacez-le, puis envoyez les clés. 

Cette page contient un exemple de code complet et un article qui peut aider.

0
Lance Cleveland

C'est quelque chose de facile à faire et cela a fonctionné pour moi:

//Create a Javascript executor

JavascriptExecutor jst= (JavascriptExecutor) driver;
jst.executeScript("arguments[1].value = arguments[0]; ", 55, driver.findElement(By.id("id")));

55 = valeur assignée

0
nosequeweaponer

Cela a résolu mon problème lorsque j'ai eu à traiter avec une page HTML avec JavaScript intégré 

WebElement empSalary =  driver.findElement(By.xpath(PayComponentAmount));
Actions mouse2 = new Actions(driver);
mouse2.clickAndHold(empSalary).sendKeys(Keys.chord(Keys.CONTROL, "a"), "1234").build().perform();

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].onchange()", empSalary);
0
Prasanth RJ