Selenium webdriver:陈旧元素引用:元素未附加到页面文档

时间:2018-03-02 04:54:13

标签: java selenium-webdriver

我有一个下拉列表,我可以在第一时间按索引选择元素。当我尝试第二次选择元素时,它会抛出过时的元素引用错误。我尝试使用try catch block,显式等待,但没有任何效果。

WebElement drop = driver.findElement(By.cssSelector("#ctl00_mainPanel_MainPanel1_SearchStop1_DropDownRoute"));

Select sel_drop = new Select(drop);
List<WebElement> drop_count = sel_drop.getOptions();
int drop_size = drop_count.size();
System.out.println("size of drop down" + drop_size);
sel_drop.selectByIndex(1);


JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(250,0)", "");

sel_drop.selectByIndex(10);//this line is causing error-- when I am trying to select element from dropbox for second time.

2 个答案:

答案 0 :(得分:2)

当您之前找到的元素不再附加到DOM(HTML源)时,会出现

StaleElementReferenceException。它已被更改,需要再次找到它。元素已更改,因为您执行了select操作,并且其值已更改。

解决方案:再次找到您的元素:

WebElement drop = driver.findElement(By.cssSelector("#ctl00_mainPanel_MainPanel1_SearchStop1_DropDownRoute"));

Select sel_drop = new Select(drop);
List<WebElement> drop_count = sel_drop.getOptions();
int drop_size = drop_count.size();
System.out.println("size of drop down" + drop_size);
sel_drop.selectByIndex(1);

//below lines are crucial
drop = driver.findElement(By.cssSelector("#ctl00_mainPanel_MainPanel1_SearchStop1_DropDownRoute"));
sel_drop = new Select(drop);

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(250,0)", "");

sel_drop.selectByIndex(10);//this line is causing error-- when I am trying to select element from dropbox for second time.

答案 1 :(得分:0)

如果没有相关的 HTML ,很难猜到在尝试选择第二个选项时看到StaleElementReferenceException的原因,但此时值得一提的是有效 usecase 将包含根据 HTML DOM 仅选择单个元素的步骤,并继续执行其他步骤。因此,根据您的代码块,如果选择第一个selectByIndex正在运行,那么最好去。

WebElement drop = driver.findElement(By.cssSelector("#ctl00_mainPanel_MainPanel1_SearchStop1_DropDownRoute"));
Select sel_drop = new Select(drop);
List<WebElement> drop_count = sel_drop.getOptions();
int drop_size = drop_count.size();
System.out.println("size of drop down" + drop_size);
sel_drop.selectByIndex(1);

为什么连续选择不起作用

选择第一个<option>调用 JavaScript AjaxCall HTML DOM可能会被更改,新的相关元素可能会显示在页面上在这种情况下,<select>代码可能会更改DOM Tree中的位置。因此,当您尝试选择第二个<option>时,您需要再次标识<select>标记,然后尝试选择第二个<option>

您可以在此处找到有关StaleElementReferenceException

的详细讨论