web-dev-qa-db-fra.com

Selenium WebDriver pour sélectionner l'élément combo-box?

Nous utilisons Selenium WebDriver et JBehave pour exécuter des tests "d'intégration" sur notre application Web. J'ai une méthode qui entrera une valeur dans une entrée de formulaire.

@When("I enter $elementId value $value")
public void enterElementText(final String elementId, final String value) {
    final WebElement webElement = webdriver.findElement(By.id(elementId));
    webElement.clear();
    webElement.sendKeys(value);
}

Mais lorsque j'essaie de l'utiliser pour sélectionner un élément dans une liste déroulante, il (sans surprise) échoue

Java.lang.UnsupportedOperationException: vous ne pouvez définir que la valeur des éléments qui sont des éléments d'entrée

Comment sélectionner une valeur dans le combo?

15
Paul McKenzie

Voici comment faire:

@When("I select $elementId value $value")
public void selectComboValue(final String elementId, final String value) {
    final Select selectBox = new Select(web.findElement(By.id(elementId)));
    selectBox.selectByValue(value);
}
20
Paul McKenzie

Le pack d'assistance de Selenium contient tout ce dont vous avez besoin:

using OpenQA.Selenium.Support.UI;

SelectElement select = new SelectElement(driver.findElement( By.id( elementId ) ));
select.SelectByText("Option3");
select.Submit();

Vous pouvez l'importer via NuGet en tant que package séparé: http://nuget.org/packages/Selenium.Support

8
PPC

En utilisant ext js combobox typeAhead pour rendre les valeurs visibles dans l'interface utilisateur.

var theCombo = new Ext.form.ComboBox({  
...
id: combo_id,
typeAhead: true,
...
});

driver.findElement(By.id("combo_id-inputEl")).clear();
driver.findElement(By.id("combo_id-inputEl")).sendKeys("The Value you need");
driver.findElement(By.id("combo_id-inputEl")).sendKeys(Keys.ARROW_DOWN);
driver.findElement(By.id("combo_id-inputEl")).sendKeys(Keys.ENTER);

Si cela ne fonctionne pas, cela vaut également la peine d'essayer

driver.findElement(By.id("combo_id-inputEl")).sendKeys("The Value you need");
driver.findElement(By.className("x-boundlist-item")).click();
4
Thrullerinn

Le paradigme du sélénium est que vous êtes censé simuler ce qu'un utilisateur ferait dans la vie réelle. Ce serait donc un clic ou une touche de navigation.

Actions builder = new Actions( driver );
Action  action  = builder.click( driver.findElement( By.id( elementId ) ) ).build();
action.perform();

Tant que vous obtenez un sélecteur qui fonctionne dans findElement, vous ne devriez pas avoir de problème avec lui. J'ai trouvé que les sélecteurs CSS étaient un meilleur pari pour les choses impliquant plusieurs éléments. Avez-vous un exemple de page?

3
Mike Kwan