📜  什么是 staleelementexception (1)

📅  最后修改于: 2023-12-03 15:21:47.146000             🧑  作者: Mango

什么是 StaleElementException?

StaleElementException 是一个 Selenium 异常类,通常表示 web 元素已经不再可用,无法进行任何操作。

何时会出现 StaleElementException?

StaleElementException 通常会在以下场景中出现:

  • 当我们获取到某个 web 元素之后,但是该元素发生了变化,比如被隐藏、删除、禁用或者其他更改操作,导致元素不再可用。
  • 当我们在该元素未加载完成时,就执行了某些操作,比如点击、输入内容等,此时元素也会变得不可用。
如何处理 StaleElementException?

对于 StaleElementException,我们可以采取以下几种处理方法:

  1. 尝试重新获取该元素,如果元素已经失效,则会抛出 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();
    }
    
  2. 利用 ExpectedConditions 的条件判断方法,等待元素变得可用后再进行操作。

    WebElement element = driver.findElement(By.xpath("//input[@id='username']"));
    // 等待元素变得可用,超时时间为 10 秒
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.elementToBeClickable(element));
    element.click();
    
  3. 对于复杂的 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();
        }
    }