如何使用firefox的selenium代码选择Ajax Dropdown建议列表项?
我的问题是:Ajax下拉列表是可见的,但未选中,后续步骤卡住了。 可能是硒正在等待什么。
页面填充的列表是动态的,在bla bla标签中。 请帮助一个示例代码。 我怎么能在这里使用waitfor *。 记住我没有使用firefox ide,但我正在编写代码。 请帮忙。
答案 0 :(得分:1)
我有一个类似的问题,硒可以找到下拉菜单,但无法单击可见的文本。后来我发现,有一个Ajax调用正在填充下拉菜单数据,结果硒似乎无法选择预期的可见文本,因为列表项尚未完全填充。也就是说,当脚本选择我的选项值时,Ajax尚未完全加载菜单选项。这是我的解决方案:
public void nameOfCollegeList(String optionItem) {
// declare the dropdownMenu web element
WebElement dropDownMenu = driver.findElement(By.cssSelector("#CollegeNames"));
// click on the dropdownMenu element to initiate Ajax call
dropDownMenu.click();
// keep checking the drop down menu item list until you find the desired text that indicates that the menu has
// been fully loaded. In this example I always expect "Other (please specify)" to be the last item in the drop down menu.
// If I don't find the expected last item in the list in my if condition, execute the else condition by calling the
// same method(recursively). Please note that if the "if" statement is never satisfied then you'll end up with an
// infinite loop.
if (dropDownMenu.getText().contains("Other (please specify)")) {
new Select(dropDownMenu).selectByVisibleText(optionItem);
}
else {
nameOfCollegeList(optionItem);
}
}
答案 1 :(得分:0)
我对你的问题感到困惑:“Ajax下拉列表是可见的,但未被选中”
听起来这个元素被禁用了。 (Java编码)
如果是selenium.isElementDisabled()
如果没有,
1)使用while循环和isElementPresent()
OR isElementDisabled()
//trigger the Ajax request and then
long initialTime = System.currentTimeMillis();
do{
thread.sleep(1000);
}while((!selenium.isElementPresent("AjaxElement")) && (System.getCurrentTimeMillis() - initialTime <= 5000)) ;
//对于客户端编程解决方案有点像上面那样...但是,
2)硒的内置溶液
我们有一个名为waitForCondition("java script to be executed", "time out value");
的方法
此方法循环javascript语句,直到它返回true或提供的超时发生
这里重要的是分析应用程序/ Ajax元素以找出元素的哪个特定条件发生变化。
从您的解释中我的猜测是,display=none
将更改为display=block
或
disabled=true
将更改为disabled=false
或isReadOnly
将更改为无此类属性.....(您需要弄清楚这一点)
然后,使用此attribute = value
构建一个javascript函数,
selenium.waitForCondition("window.document.getElementById('AJAX ELEMENT').disabled == 'false'", "3000");
你可以用编程语言编写上述语句。
try {
//do the action which triggers the Ajax call
selenium.waitForCondition("window.document.getElementById('AJAX ELEMENT[drop down element]').disabled == 'false'", "3000");
//OR
selenium.waitForCondition("window.document.getElementById('AJAX ELEMENT').disabled == 'false'", "3000");
}
catch(SeleniumException se)
{
if((se.getMessage()).toLowerCase().contains("timed out")
throw //..some a custom exception however your organisation requires
}
selenium.select("drop down element id", "option id");
依旧.....