当前位置: 首页 > 知识库问答 >
问题:

“Click Method”持续返回“stale Element exceoption”?

越雨泽
2023-03-14

Click方法始终返回stale Element exception

>

  • 有时方法会单击预期的链接:-

    public @FindBy(xpath = ".//div[@class='category_menu']//a[text()='Supercars »']") WebElement link_Supercars;
    

    然而,我经常会得到以下异常:-

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

    孟鹏海
    2023-03-14

    如上所述,当您试图使用的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调用的应用程序,那么它是不稳定的。

    希望有帮助

    编辑:对我工作方式的解释

    我在创建pageObjects时只定义类中的定位器:

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

    一旦有了这些,您就可以简单地使用(例如):

    driver.findElement(myElement).click();
    

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

    SeleniumUtils.clickElement(myElement);
    
     类似资料:
    • 问题内容: 我正在尝试获取报告的构建持续时间,但它始终返回0。 通过阅读文档,阅读Slack插件源以及阅读其他资源,我应该能够执行以下操作之一: 都不起作用。根据我的理解,这可能是因为我在构建实际完成之前就调用了它,因此尚无可用时间。 管道的结构如下所示: 我的问题是: 为什么我没有得到持续时间 管道中是否可以指定“构建后”步骤?从我读到的内容来看,try-catching应该这样工作 我的临时解

    • 我的主类包含这些代码行。(还有一个JButton可将文件添加到播放列表中) 这是另一个类,playlymanager,它管理我的播放列表,比如从播放列表中添加、删除文件。 问题是,每次我在播放列表中添加歌曲时,持续时间总是读取为0。控制台打印: 添加歌曲:name_of_the_song.mp3,持续时间为0 为什么会这样?它不能正确读取持续时间(javafx.util.duration)的原因是

    • 它们还提供了一个警告:如果您能够持续部署到测试系统,有时也会使用术语“持续部署”。 这一切让我很困惑。任何更详细的解释(或附带一个例子)都是赞赏的!

    • 在一些请求中,我们会做一些日志的推送、用户数据的统计等和返回给终端数据无关的操作。而这些操作,即使你用异步非阻塞的方式,在终端看来,也是会影响速度的。这个和我们的原则:终端请求,需要用最快的速度返回给终端,是冲突的。 这时候,最理想的是,获取完给终端返回的数据后,就断开连接,后面的日志和统计等动作,在断开连接后,后台继续完成即可。 怎么做到呢?我们先看其中的一种方法: local response

    • translated_page: https://github.com/PX4/Devguide/blob/master/en/test_and_ci/continous_integration.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e PX4 Continuous Integration PX4 builds and