您指出了有关“StaleElementReferenceException”的问题,这与 webElement 实例更改时有关,当 DOM 由于页面上的某些活动而更改时。
它与 WebDriver 如何在内部处理对 webElements 的引用有关,并且在运行时对对象的引用发生更改时会发生此问题。
现在,让我们假设当您获取元素并且在对其执行任何操作之前,您的页面上刷新了一些内容。它可能是正在刷新的整个页面,也可能是某个调用仅刷新了元素所在的 DOM 的一部分。
在这种情况下,WebDriver 使用并存储在缓存中某处的内部 id 已经过时(不再引用),所以现在对于这个 WebElement 上的每个操作,我们都会得到StaleElementReferenceException
.
所以要尽量避免在关键地方使用这种方法,以确定元素是否过时。
public static boolean isStale(WebElement e){
try{
e.isDisplayed();
return false;
}catch(StaleElementReferenceException ex){
return true;
}
}
通常刷新页面、页面对象或仅此特定元素在 90% 的情况下会有所帮助。
并且在刷新页面/元素后,WebDriver 会为这个元素分配一个不同的内部 Id,并且可以再次使用它而不会出现任何问题。
这个问题是 PageObject / PageFactory 设计模式的解决者。
public class SomePage {
@FindBy(how = How.NAME, using = "q")
private WebElement searchBox;
public SomePage() {
PageFactory.initElements(driver, this);
}
public void searchFor(String text) {
searchBox.sendKeys(text);
}
}
希望这可以帮助,