2016-12-24 4 views
2

Я пытаюсь выбрать из datalist, но только первый элемент в списке, по-видимому, можно выбрать.Как выбрать из datalist HTML5 с Selenium

Это HTML фрагмент:

<td> 
<input id="applianceFilterTextbox" class="flat" name="applianceFilter" list="applianceNames" value="ROC-1006 - B827EBB5D539" style="width: 100%"/> 
<datalist id="applianceNames"> 
<!-- ngRepeat: app in appliances --> 
<option class="ng-binding ng-scope" ng-repeat="app in appliances" value="ROC-1006 - B827EBB5D539" ng-value="app.DisplayName">ROC-1006 - B827EBB5D539</option> 
<!-- end ngRepeat: app in appliances --> 
<option class="ng-binding ng-scope" ng-repeat="app in appliances" value="ROC-1007 - B827EBD15125" ng-value="app.DisplayName">ROC-1007 - B827EBD15125</option> 
<!-- end ngRepeat: app in appliances --> 
<option class="ng-binding ng-scope" ng-repeat="app in appliances" value="ROC-1008 - B827EB05DEF3" ng-value="app.DisplayName">ROC-1008 - B827EB05DEF3</option> 
<!-- end ngRepeat: app in appliances --> 
<option class="ng-binding ng-scope" ng-repeat="app in appliances" value="ROC-1009 - B827EB2A379C" ng-value="app.DisplayName">ROC-1009 - B827EB2A379C</option> 
<!-- end ngRepeat: app in appliances --> 
</datalist> 
</td> 

Мой модуль выглядит следующим образом:

public void SelectApplianceFromDatalist(int index) 
{ 
    ExplicitWait.waitElementToBeClickable(driver, 25, appliancesFilterTextBox); 
    appliancesFilterTextBox.Clear(); 
    appliancesFilterTextBox.Click(); 
    string select1 = driver.FindElement(By.XPath("//*[@id='applianceNames']/option['" + index + "']")).GetAttribute("value"); 
    index++; 
    string select2 = driver.FindElement(By.XPath("//*[@id='applianceNames']/option['" + index + "']")).GetAttribute("value"); 
    index++; 
    string select3 = driver.FindElement(By.XPath("//*[@id='applianceNames']/option['" + index + "']")).GetAttribute("value"); 
    index++; 
    string select4 = driver.FindElement(By.XPath("//*[@id='applianceNames']/option['" + index + "']")).GetAttribute("value"); 

    appliancesFilterTextBox.SendKeys(driver.FindElement(By.XPath("//*[@id='applianceNames']/option['"+ index +"']")).GetAttribute("value")); 
} 

select1, Выбор2, выбор3 и select4 присутствуют только для целей отладки. При вызове модуля со значением для примера 3 для индекса все они содержат значение первого параметра.

ответ

1

Попробуйте простой метод sendKeys() отправить требуемое значение, как -

driver.findElement(By.id("applianceFilterTextbox")).clear(); 
    driver.findElement(By.id("applianceFilterTextbox")).sendKeys("ROC-1008 - B827EB05DEF3"); 

Он очистит значение по умолчанию выбран и введите нужное значение.

Другое дело, что я думаю, что вы используете правильный подход, но есть небольшая ошибка в вашем XPath. Меняется

By.XPath("//*[@id='applianceNames']/option['" + index + "']") 

в

By.XPath("//*[@id='applianceNames']/option["+ index +"]") 
+0

Потому что я не знаю, что требуемое значение, я не могу использовать простой SendKeys() метод, как вы предложили. Но вы были правы в отношении незначительной ошибки в выражении XPath. После того как я удалил простые ведущие котировки, мой метод работает нормально. – Frank

Смежные вопросы