使用Selenium for Firefox选择Ajax Dropdown建议列表

时间:2011-07-03 19:59:01

标签: ajax firefox testing selenium autosuggest

如何使用firefox的selenium代码选择Ajax Dropdown建议列表项?

我的问题是:Ajax下拉列表是可见的,但未选中,后续步骤卡住了。 可能是硒正在等待什么。

页面填充的列表是动态的,在bla bla标签中。 请帮助一个示例代码。 我怎么能在这里使用waitfor *。 记住我没有使用firefox ide,但我正在编写代码。 请帮忙。

2 个答案:

答案 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()

编程laguage解决方案
 //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=blockdisabled=true将更改为disabled=falseisReadOnly将更改为无此类属性.....(您需要弄清楚这一点)

然后,使用此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");

依旧.....