我尝试在更新之前或之后与元素进行交互。当我在更新元素后尝试与该元素交互时,我收到了 StaleElementReferenceException。
注意:-我的简单问题是我们是否可以处理当WebElement的先前引用被永久删除时发生的StaleElementReferenceException。 如果不可能,我会考虑使用 By 定位器而不是使用 @FindBy 的 WebElement。
我尝试使用重试机制来处理 StaleElementReferenceException,但仍然徒劳。我什至尝试重新初始化相应页面中的所有元素,但仍然徒劳。我最近使用 PageFactory 创建了我的框架。
有人可以告诉我如何处理这种情况吗?
我听说我们无法在 PageFactory 中处理 StaleElementReferenceException。许多人建议使用 By 定位器,而不是使用 @FindBy 的 WebElement。
可重复使用的组件之一:-
public void click(WebElement element, int timeout) {
int attempts = 0;
while (attempts < 10) {
try {
waitUntilElementIsClickable(element, timeout);
moveToElement(element, timeout);
element.click();
break;
} catch (ElementClickInterceptedException e) {
log.info("Reperforming click operation since
ElementClickInterceptedException is occured");
if (attempts == 9) {
e.printStackTrace();
throw new ElementClickInterceptedException(
"Retried clicking 10 times, hence
throwing this exception");
}
} catch (StaleElementReferenceException e) {
log.info("Reperforming click operation since
StaleElementReferenceException is occured");
if (attempts == 9) {
e.printStackTrace();
throw new ElementNotInteractableException(
"Retried clicking 10 times, hence
throwing this exception");
}
}
attempts++;
}
}
我建议您放弃 PageFactory,使用页面对象模型中使用
By
定义的定位器。然后在您的方法中,每次使用定义的定位器获取新鲜的元素。
登录页面页面对象的一个简单示例是......
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class LoginPage {
WebDriver driver;
private final By usernameLocator = By.id("username");
private final By passwordLocator = By.id("password");
private final By submitButtonLocator = By.cssSelector("button[type='submit']");
public LoginPage(WebDriver driver) {
this.driver = driver;
}
public void login(String username, String password) {
driver.findElement(usernameLocator).sendKeys(username);
driver.findElement(passwordLocator).sendKeys(password);
driver.findElement(submitButtonLocator).click();
}
}
你会这样称呼它
String username = "username";
String password = "password";
...
LoginPage loginPage = new LoginPage(driver);
loginPage.login(username, password);