📅  最后修改于: 2023-12-03 15:21:47.146000             🧑  作者: Mango
StaleElementException 是一个 Selenium 异常类,通常表示 web 元素已经不再可用,无法进行任何操作。
StaleElementException 通常会在以下场景中出现:
对于 StaleElementException,我们可以采取以下几种处理方法:
尝试重新获取该元素,如果元素已经失效,则会抛出 NoSuchElementException 异常。在捕获该异常后,需要等待一段时间后再次尝试获取该元素。
WebElement element = null;
try {
element = driver.findElement(By.xpath("//input[@id='username']"));
element.click();
} catch (NoSuchElementException e) {
// 元素已经失效,稍等一段时间重新获取
Thread.sleep(5000);
element = driver.findElement(By.xpath("//input[@id='username']"));
element.click();
}
利用 ExpectedConditions 的条件判断方法,等待元素变得可用后再进行操作。
WebElement element = driver.findElement(By.xpath("//input[@id='username']"));
// 等待元素变得可用,超时时间为 10 秒
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(element));
element.click();
对于复杂的 web 界面,可以采用 Page Object 模式来管理和操作页面元素,以避免出现 StaleElementException 异常。
public class LoginPage {
private WebDriver driver;
private WebElement usernameInput;
private WebElement passwordInput;
private WebElement loginButton;
public LoginPage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
@FindBy(id = "username")
public void setUsernameInput(WebElement usernameInput) {
this.usernameInput = usernameInput;
}
@FindBy(id = "password")
public void setPasswordInput(WebElement passwordInput) {
this.passwordInput = passwordInput;
}
@FindBy(id = "loginButton")
public void setLoginButton(WebElement loginButton) {
this.loginButton = loginButton;
}
public void login(String username, String password) {
usernameInput.sendKeys(username);
passwordInput.sendKeys(password);
loginButton.click();
}
}