web-dev-qa-db-fra.com

Définir la valeur de l'entrée au lieu de sendKeys () - Selenium webdriver nodejs

J'ai une longue chaîne à tester et sendKeys() prend trop de temps. Lorsque j'ai essayé de définir la valeur de text, le programme s'est arrêté. Je sais que Selenium sendKeys() est le meilleur moyen de tester la saisie de l'utilisateur, mais pour mon application, cela prend trop de temps. Alors j'essaie de l'éviter.

Est-il possible de définir la valeur immédiatement?

Voir cet exemple rapide:

var webdriver = require('Selenium-webdriver');

var driver = new webdriver.Builder().
   withCapabilities(webdriver.Capabilities.chrome()).
      build();

driver.get('http://www.google.com');

// find the search input field on google.com
inputField = driver.findElement(webdriver.By.name('q'));

var longstring = "test"; // not really long for the sake of this quick example

// this works but is slow
inputField.sendKeys(longstring);

// no error but no values set
inputField.value = longstring;

// Output: TypeError: Object [object Object] has no method 'setAttributes'

inputField.setAttributes("value", longstring);
32
F. Rakes

Essayez de définir la valeur de l'élément en utilisant la méthode executeScript:

webdriver.executeScript("document.getElementById('elementID').setAttribute('value', 'new value for element')");
47
Andrey Egorov

Étendre à partir de la réponse correcte de Andrey-Egorov en utilisant .executeScript() pour conclure mon propre exemple de question:

inputField = driver.findElement(webdriver.By.id('gbqfq'));
driver.executeScript("arguments[0].setAttribute('value', '" + longstring +"')", inputField);
9
F. Rakes

Merci à Andrey Egorov, dans mon cas avec python setAttribute ne fonctionne pas, mais j'ai constaté que je pouvais définir la propriété directement,

Essayez ce code:

driver.execute_script("document.getElementById('q').value='value here'")
8
Larry Song

Une autre façon d’envoyer un grand nombre de caractères répétés dans un champ de texte (par exemple, pour tester le nombre maximal de caractères autorisé par le champ) consiste à taper quelques caractères, puis à les copier et les coller à plusieurs reprises:

inputField.sendKeys('0123456789');
for(int i = 0; i < 100; i++) {
    inputField.sendKeys(Key.chord(Key.CONTROL, 'a'));
    inputField.sendKeys(Key.chord(Key.CONTROL, 'c'));
    for(int i = 0; i < 10; i++) {
        inputField.sendKeys(Key.chord(Key.CONTROL, 'v'));
    }
}

Malheureusement, appuyer sur CTRL ne semble pas fonctionner pour IE à moins que REQUIRE_WINDOW_FOCUS est activé (ce qui peut causer d’autres problèmes), mais cela fonctionne bien pour Firefox et Chrome.

3
Dave

Merci à Andrey-Egorov et ceci réponse , j'ai réussi à le faire en C #

IWebDriver driver = new ChromeDriver();
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string value = (string)js.ExecuteScript("document.getElementById('elementID').setAttribute('value', 'new value for element')");
2
Leojet
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("document.querySelector('attributeValue').value='new value'");
0
Rakesh