首页 > 解决方案 > Selenium try/catch click 似乎需要很长时间?

问题描述

在编写 Selenium 测试时,我总是遇到一个问题,尝试单击未准备好的元素会导致 StaleElementReference/ElementClickIntercepted 异常。如果我只等待 2 秒以使项目可点击,这可以通过使测试在成功时失败而使测试变得不稳定。

我已经修复了WebElement检索,在我认为它丢失之前,我使用隐式等待等待一个元素的出现大约 2 秒,并且我一直在尝试创建一个clickElement()围绕基本click()函数的函数来实现相同的目的。

它的目的是不断尝试以 100 毫秒的增量单击,直到可以为止。我通过捕获异常并为每次单击增加一个计数器来做到这一点,并且仅在单击元素或单击太多尝试引发异常时才跳出循环。

这是我写的函数:

public void clickElement(WebElement element) {
    int maxTimeOut = 50;
    int timeOutCt = 0;
    boolean isTimedOut = false;
    System.out.println("=> Try to click on <" + element.getTagName() + ">");
    while ( !isTimedOut ) {
        try {
            element.click();
            isTimedOut = true; // could click
            System.out.println("\n OK \n");
        } catch (Exception e) {
            waitSeconds(0.1);
            timeOutCt++;
            System.out.println(" \t => Error while attempting to click for the " + timeOutCt +"nd time \n");
            if ( timeOutCt > maxTimeOut ) { 
                isTimedOut = true;
                fail("Element <" + element.getTagName() + "> is not clickable. See exception:  " + e);
            }
        }
    }
}

等待秒是:

public void waitSeconds(double t) {
    long mT = (long) (t * 1000);
    try {
        System.out.print("\n \t \t ( ) Sleep de " + mT + "secondes"); 
        Thread.sleep(mT);
        System.out.print(" ... Done \n ");
    }
    catch (InterruptedException e) {
       e.printStackTrace();
    }
}

我遇到的问题是,这样做似乎需要很长的时间,至少超过一毫秒,至少我可以说它持续超过一秒。我想也许我的waitSeconds()功能不能正常工作,但我在一个简单的程序中对其进行了测试,它应该可以正常工作:waitSeconds(0.1)导致 100 毫秒的等待。

那么为什么当clickElement被调用并尝试多次单击一个元素时,两次尝试之间可能需要长达两秒钟的时间?

是控制台输出减慢了速度吗?

或者是 try/catch 搞砸了一切?

标签: javaseleniumexception

解决方案


对于 try/catch,我遇到了一些类似的问题,尝试在 try/catch 块之前禁用隐式等待并在 catch 之后再次启用它。希望这会有所帮助。


推荐阅读