获取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"]
执行checkbox.click()
之前的HTML源代码:
<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>
答案 0 :(得分: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));
}
答案 1 :(得分: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"));
}
答案 2 :(得分:0)
这发生了,因为您的DOM结构已经更改,因为您已经引用了复选框。
这是人们得到的一个非常常见的例外。
WorkAround可以捕获异常并尝试再次定位并单击相同的元素。
实施例
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解决方案。他的代码更清晰。