1

我正在尝试使用页面对象测试网站,当我执行脚本时,我在调用时间歇性地收到Element is no longer attach to the DOM (Selenium::WebDriver::Error::StaleElementReferenceError)错误消息一个函数。

如果有任何建议,我该如何克服这个问题?

4

3 回答 3

2

当您与之交互的元素在 DOM 中发生更改时,您会收到此异常。如果您在 WebElement 对象中捕获元素,然后进一步使用该对象执行一些单击/键入操作,并且如果在此期间对该元素的引用发生了更改,那么您正在使用的对象将不再引用正确的定位器。尝试在与元素交互时使用元素定位器,而不是先在 WebElement 对象中捕获它,然后再进一步使用该对象。

例如,而不是做:

WebElement e = driver.findElement(By.id("someID"));
e.click();
.
.
.
e.click();

尝试使用:

driver.findElement(by.id("someID")).click();
.
.
.
driver.findElement(by.id("someID")).click();

否则,您可以使用 Vinay 的方法。

于 2013-08-09T05:43:55.887 回答
2

我们在项目中也遇到了同样的问题。克服此问题的一种方法是在导致此问题的方法中使用 try catch 块。在 catch 块内再次重新执行相同的代码行/另一个方法。这将解决这个问题。

于 2013-08-08T11:59:42.400 回答
0

使用 PageFactory 来初始化您的页面对象。它将为实际元素创建惰性代理。

public class PageObject {
   @FindBy(id="someID")
   private WebElement someElement;

   public void doSomething() {
      someElement.click();  
   }
}

PageObject po = PageFactory.initElements(driver, PageObject.class);

如果您不将@CacheLookup 与@FindBy 一起使用,则任何时候您使用 someElement,它都会使用查找器查找此元素。

于 2013-09-24T17:41:21.390 回答