Selenium 中 PageFactory 中的 StaleElementReferenceException

问题描述 投票:0回答:1

我尝试在更新之前或之后与元素进行交互。当我在更新元素后尝试与该元素交互时,我收到了 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++;
    }
}
java selenium-webdriver cucumber testng
1个回答
0
投票

我建议您放弃 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);
© www.soinside.com 2019 - 2024. All rights reserved.