等待web元素的好方法

Lov*_*ava 1 java selenium selenium-chromedriver selenium-webdriver

如果我的问题听起来很重要,我会提前道歉,我在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);
             }
        }
Run Code Online (Sandbox Code Playgroud)

但现在在某处我看到了这个:

WebDriverWait wait = new WebDriverWait(driverChrome, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("bla bla"))).click();
Run Code Online (Sandbox Code Playgroud)

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

Lou*_*uis 5

您接受的答案是错误的.

什么WebDriverWait确实是粗略地说同样的事情,你的代码片段做什么:它轮询DOM定期检查你想让它检查的条件是否为真.如果它不是真的那么它会Thread.sleep用于你.(你可以通过阅读实现FluentWait来确定我在这里所说的内容,这是基于哪个WebDriverWait类,以及Sleeper因为FluentWait用于Sleeper.SYSTEM_SLEEPER在民意调查之间进入睡眠状态.)

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

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