执行checkbox.click()后获取StaleElementReferenceException

时间:2013-08-30 08:16:52

标签: webdriver selenium-webdriver

获取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元素

上的任何方法

相应图片: enter image description here

我的定位器

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>

3 个答案:

答案 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解决方案。他的代码更清晰。