等待web元素的好方法

时间:2015-10-20 15:45:24

标签: java selenium selenium-webdriver selenium-chromedriver

如果我的问题听起来很重要,我提前道歉,我在QA和Selenium都很新。

我使用Java和Selenium编写测试,有时我需要等待Web元素可访问,下面是我以前使用的代码片段:

        int counter = 0;
        while (true) {
            counter++;
             boolean breakIt = false;
            try {
                WebElement element= driverChrome.findElement(By.xpath("bla bla"));
                element.click();
                breakIt = true;
            } catch (Exception e) {             
                Thread.sleep(1000);
            }
            if (breakIt) {
               break;
            }
            if (counter > 4) {
               System.out.println("Failed");
               tearDown();
               System.exit(1);
             }
        }

但现在我看到了这个地方:

WebDriverWait wait = new WebDriverWait(driverChrome, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("bla bla"))).click();

肯定第二个更短但我不知道它是否更好,换句话说,它们是不同的吗?如果是,怎么样?哪个更好用于哪些目的?

2 个答案:

答案 0 :(得分:5)

答案you accepted不正确。

WebDriverWait所做的粗略地说与您的代码段的作用相同:它定期轮询DOM以检查您希望它检查的条件是否为真。如果不是,那么就会使用Thread.sleep 。 (您可以通过阅读implementation of FluentWaitWebDriverWait所基于的类以及Sleeper来确定我在说什么,因为FluentWait使用{{1}在民意调查之间进入睡眠状态。)

与接受的答案断言相反(“一旦元素被加载然后立即变得难以处理”),当您等待的条件变为真时,Sleeper.SYSTEM_SLEEPER将不会立即允许您与元件。如果WebDriverWait实例在条件成立时处于休眠状态,将继续休眠,直到其休眠间隔结束(默认为0.5秒),然后它将再次检查条件并立即返回如果发现条件是真的。否则,它会重新进入睡眠状态,除非你给它的超时时间已经过期。

您的自制等待外观与WebDriverWait之间的区别在于WebDriverWait可重用,灵活,旨在处理您的代码无法处理的一系列条件。或者换句话说,它更强大。特别是,它会让它不知道如何处理涓流而不是像代码那样隐藏它们的异常。 我无法想象你的代码会更好。

答案 1 :(得分:1)

使用WebDriverWait始终是睡眠声明的理想选择。一旦元素被加载,它就会立即变得难以处理,而不是等待一段时间。特别是如果您有许多使用相同步骤的测试,从长远来看可以节省大量时间。

对于ExpectedConditions,我建议this page,