有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java“Click Method”不断返回“Stale Element Exceoption”?

Click方法继续返回Stale Element Exception

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

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

org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document

方法:

    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) 个答案

  1. # 1 楼答案

    如上所述,当你试图使用的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 {
    }
    

    这个问题就是为什么我没有使用带有注释@FindBy的PageFactory来定位元素的原因。如果你正在自动化一个有很多javascript和/或AJAX调用的应用程序,那么它是不稳定的

    希望有帮助

    编辑:解释我的工作方式

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

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

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

    driver.findElement(myElement).click();
    

    这仍然不是我的工作方式,因为总是定义等待,然后定义元素的位置,等等,这相当繁重

    我创建了一个Seleniumultils类,所以我只需要写一些

    SeleniumUtils.clickElement(myElement);
    

    在这个方法中,我做了所有必要的事情来确保我可以点击元素。等待是可点击的,有时操作更依赖于应用程序

    我会补充一点说明,这就是我的工作方式。我并不是说它是完美的或其他什么,但由于我已经定义了这些UTIL,我很少需要在应用程序中的任何地方编写等待,这有助于我更快地实现自动化