Java 使用for循环嵌套下拉列表会导致过时的元素引用错误

Java 使用for循环嵌套下拉列表会导致过时的元素引用错误,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我想知道如何使用SeleniumWebDriver和java嵌套下拉列表,也就是说,我有两个下拉列表,这些下拉列表可以一个接一个嵌套吗? 在为下拉列表循环2次后,显示陈旧元素引用错误 我编写了以下代码: Select drpdwns6 = new Select(driver.findElement(By.xpath("//*[@id=\"MainContent_ddlBillable\"]"))); List <WebElement> sels6 = drpdwns6.getOpti

我想知道如何使用SeleniumWebDriver和java嵌套下拉列表,也就是说,我有两个下拉列表,这些下拉列表可以一个接一个嵌套吗? 在为下拉列表循环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);
    }
}

我猜是从下拉列表中选择选项刷新DOM,因此引发异常。您需要在每个itreation中重新定位下拉列表

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,那么只要DOM中存在的元素被删除或移除或不可用,就会出现陈旧元素异常,使用By.id it而不是By.xpath

上面的答案是在DOM刷新后重新定位元素,或者您可以使用Webdriver wait,如果元素未连接到DOM,那么您可以尝试在“for loop”中使用“try catch block”,如下所示

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);
  }
  }

虽然它工作正常,但我有一个问题,为什么你没有使用List?@HimanshuBansal你可以将行拆分为int drpdwns6Size=drpdwns6.getOptions.size;至两行列表sels6=drpdwns6.getOptions;int drpdwns6Size=sels6.size;。如果你愿意的话,我想这是没有必要的。只是别忘了给变量赋值。