1

获取 org.openqa.selenium.StaleElementReferenceException:元素不再附加到 DOM

list = driver.findElements(By.cssSelector(listLocator));
for (WebElement listItem : list) {

checkbox = listItem.findElement(By.cssSelector(checkboxLocator));
checkbox.click();

String path = checkbox.getCssValue("background-image"));
}

执行后 checkbox.click();我无法在checkbox元素上调用任何方法

对应图片: 在此处输入图像描述

我的定位器是

listLocator = ul[class="planList"] > li[class="conditionsTextWrapper"]
checkboxLocator = label[role="button"] > span[class="ui-button-text"]

我在执行之前的 HTML 源代码checkbox.click()

<ul class="planList">       
 <li class="conditionsTextWrapper" >
   <input name="chkSubOpt" type="checkbox">
   <label class="check ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" for="CAT_5844" aria-pressed="false" role="button">
   <span class="ui-button-text"></span>
   </label>
   <label class="conditionsText">Eat at least 5 fruits and vegetables every day</label>
 </li>
</ul>

执行后checkbox.click()

<ul class="planList">       
  <li class="conditionsTextWrapper" >
    <input name="chkSubOpt" type="checkbox">
    <label class="check ui-button ui-widget ui-state-default ui-corner-all ui-state-active ui-button-text-only" for="CAT_5844" aria-pressed="true" role="button" aria-disabled="false">
    <label class="conditionsText">Eat at least 5 fruits and vegetables every day</label>
  </li>
 </ul>
4

3 回答 3

1

如上所述,这些错误的原因是单击复选框后DOM结构发生了变化。以下代码适用于我。

string checkboxXPath = "//input[contains(@id, 'chblRqstState')]";
var allCheckboxes = driver.FindElements(By.XPath(checkboxXPath));

for (int i = 0; i != allCheckboxes.Count; i++)
{
    allCheckboxes[i].Click();
    System.Threading.Thread.Sleep(2000);
    allCheckboxes = driver.FindElements(By.XPath(checkboxXPath));
} 
于 2014-01-21T14:49:35.520 回答
0

发生这种情况是因为您的 DOM 结构在您引用复选框后发生了变化。

这是人们得到的一个非常常见的异常。

解决方法可以是捕获异常并尝试再次定位并单击相同的元素。

例子

    WebElement date = driver.findElement(By.linkText("date"));
 date.click();
                        }
                        catch(org.openqa.selenium.StaleElementReferenceException ex)
                        {
                            log.debug("Exception in finding date");
                            log.debug(e);
                            WebElement date = driver.findElement(By.linkText("date"));
                                                        date.click();
                        }

这可以解决你的大部分问题!

也适用于您的复选框问题。但是我建议您使用@Mark Rowlands 解决方案。他的代码更干净。

于 2013-08-30T10:37:20.903 回答
0

您的 DOM 在 之后发生变化.click(),因此与该元素相关的引用Webdriver(如列表中的下一个)不再有效。因此,您将需要在循环中重建列表。

list = driver.findElements(By.cssSelector(listLocator));
for (i=0; list.length(); i++) {
    list = driver.findElements(By.cssSelector(listLocator));
    checkbox = list[i].findElement(By.cssSelector(checkboxLocator));
    checkbox.click();

    String path = checkbox.getCssValue("background-image"));
}
于 2013-08-30T09:20:12.323 回答