我正在尝试使用页面对象测试网站,当我执行脚本时,我在调用时间歇性地收到Element is no longer attach to the DOM (Selenium::WebDriver::Error::StaleElementReferenceError)错误消息一个函数。
如果有任何建议,我该如何克服这个问题?
我正在尝试使用页面对象测试网站,当我执行脚本时,我在调用时间歇性地收到Element is no longer attach to the DOM (Selenium::WebDriver::Error::StaleElementReferenceError)错误消息一个函数。
如果有任何建议,我该如何克服这个问题?
当您与之交互的元素在 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 的方法。
我们在项目中也遇到了同样的问题。克服此问题的一种方法是在导致此问题的方法中使用 try catch 块。在 catch 块内再次重新执行相同的代码行/另一个方法。这将解决这个问题。
使用 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,它都会使用查找器查找此元素。