使用for循环嵌套下拉列表会导致陈旧元素引用错误

时间:2018-07-24 12:52:18

标签: java selenium selenium-webdriver

我想知道如何使用Java的Selenium Webdriver嵌套下拉列表,即我有2个下拉列表,这些下拉列表可以一个接一个地嵌套吗? 在为下拉列表循环2次之后,它显示了过时的元素引用错误

我写了以下代码:

Select drpdwns6 = new Select(driver.findElement(By.xpath("//*[@id=\"MainContent_ddlBillable\"]")));
List <WebElement> sels6 = drpdwns6.getOptions();
sels6.size();
for(int s6=0;s6<sels6.size();s6++) {
    drpdwns6.selectByIndex(s6);
    System.out.println("selected value"+s6);

    Select drpdwns7 = new Select(driver.findElement(By.xpath("//*[@id=\"MainContent_ddlofflinestatus\"]")));
    List <WebElement> sels7 = drpdwns7.getOptions();
    sels7.size();
    for(int s7=0;s7<sels7.size();s7++) {
        drpdwns7.selectByIndex(s7);
        System.out.println("selected value"+s7);
    }
}

2 个答案:

答案 0 :(得分:1)

我的猜测是从下拉列表中选择选项会刷新DOM,因此会引发异常。您需要在每次迭代中重新放置下拉菜单

Select drpdwns6 = new Select(driver.findElement(By.id("MainContent_ddlBillable")));
int drpdwns6Size = drpdwns6.getOptions().size();
for(int s6 = 0 ; s6 < drpdwns6Size ; s6++) {
    drpdwns6 = new Select(driver.findElement(By.id("MainContent_ddlBillable")));
    drpdwns6.selectByIndex(s6);
    System.out.println("selected value"+s6);

    Select drpdwns7 = new Select(driver.findElement(By.id("MainContent_ddlofflinestatus")));
    int drpdwns7Size = drpdwns7.getOptions().size();
    for(int s7 = 0 ; drpdwns7Size ; s7++) {
        drpdwns7 = new Select(driver.findElement(By.id("MainContent_ddlofflinestatus")));
        drpdwns7.selectByIndex(s7);
        System.out.println("selected value"+s7);
    }
}

请注意,如果您有id,请使用By.id代替By.xpath

答案 1 :(得分:0)

只要DOM中存在的元素被删除或删除或不可用,您就会获得Stale元素异常。

以上答案(即)在DOM刷新后重新定位元素,或者您可以使用Webdriver等待,如果元素未附加到DOM,则可以尝试在“ for循环”中使用“ try-catch块”,如下所示

driver.manage().timeouts().implicitlywait(30,TimeUnit.SECONDS);
try{
Select drpdwns6 = new 
Select(driver.findElementByXpath("//[@id=\"MainContent_ddlBillable\"]")));
List <WebElement> sels6AllOptions = drpdwns6.getOptions();
int count1=sels6AllOptions.size();
for(int s6=0;s6<count1;s6++) 
{
drpdwns6.selectByIndex(s6);
} 
}
catch(StaleElementException e1){
System.out.println("selected value"+s6);
}
try{
Select drpdwns7 = new Select(driver.findElement(By.xpath("//*[@id=\"MainContent_ddlofflinestatus\"]")));

List <WebElement> sels7AllOptions = drpdwns7.getOptions();
int count2=sels7AllOptions.size();
for(int s7=0;s7<count2;s7++) {
    drpdwns7.selectByIndex(s7);
    catch(StaleElementException e2){

    System.out.println("selected value"+s7);
  }
  }