'Click Method'会不断返回'Stale Element Exceoption'吗?

时间:2017-01-19 09:19:25

标签: java selenium selenium-webdriver webdriver

点击方法会不断返回Stale Element Exception

  1. 有时,该方法会点击预期的链接: -

    public @FindBy(xpath = ".//div[@class='category_menu']//a[text()='Supercars »']") WebElement link_Supercars;
    
  2. 但是,我经常收到以下exception: -

  3.   

    org.openqa.selenium.StaleElementReferenceException:陈旧元素   reference:元素未附加到页面文档

    方式:

        public void clickSupercarsLink() throws Exception {
        this.wait = new WebDriverWait(driver, 30);
        Boolean elementPresent = wait.until(ExpectedConditions.elementToBeClickable(link_Supercars)).isEnabled();
        try {
            if (elementPresent == true) {
                link_Supercars.click();
            }
        } catch (Exception e) {
            System.out.println("Exception! - could not click on supercars link: " + e.toString());
            throw (e);
        } finally {
        }
    }
    

    关于如何改进这种方法的任何想法?

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如上所述,当您尝试使用的WebElement在找到它之间以及您尝试与之交互的那一刻之间已经更新了您尝试使用的WebElement时,会发生此异常。

解决方案可能是在catch语句中再次找到它:

public void clickSupercarsLink() throws Exception {
this.wait = new WebDriverWait(driver, 30);
Boolean elementPresent = wait.until(ExpectedConditions.elementToBeClickable(link_Supercars)).isEnabled();
try {
    if (elementPresent == true) {
        link_Supercars.click();
    }
} catch (StaleElementReferenceException elementUpdated){
    link_Supercars = driver.findElement(myLocator);
    if (elementPresent == true) {
        link_Supercars.click();
    }
} catch (Exception e) {
    System.out.println("Exception! - could not click on supercars link: " + e.toString());
    throw (e);
} finally {
}

这个问题就是为什么我没有使用PageFactory来注释@FindBy来定位我的元素。如果您自动化具有大量javascript和/或AJAX调用的应用程序,则它不稳定。

希望有所帮助

编辑:解释我的工作方式

我通过仅定义类中的定位器来创建我的pageObject:

By myElement = By.id("myId");

一旦你有了,你可以简单地使用(例如):

driver.findElement(myElement).click();

我仍然不是我的工作方式,因为总是定义你的等待,然后定义元素的位置等等,这很重要。

我创建了一个SeleniumUtils类,所以我只需编写类似

的内容
SeleniumUtils.clickElement(myElement);

在这种方法中,我正在做所有必要的事情,以确保我可以点击该元素。等待是可点击的,有时是与应用程序有关的动作。

我会添加一点说明,这就是我工作的方式。我不能说它完美或其他任何东西,但由于我已经定义了这些工具,我很少在应用程序的任何地方写等待,这有助于我更快地自动化。