等待网页元素的好方法

A good way to wait for a web element

如果我的问题听起来很初级,我提前道歉,我是 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();

当然第二个更短,但我不知道它是否更好,换句话说,它们是不同的吗?如果是,怎么办?哪个更好用?

使用 WebDriverWait 总是优于 sleep 语句。一旦元素被加载,它就会立即变得棘手,而不是等待一段设定的时间。特别是如果您有许多使用相同步骤的测试,它会在漫长的 运行.

中节省大量时间

至于 ExpectedConditions,我会推荐 this page,

答案不正确。

WebDriverWait 所做的 粗略地说 与您的代码片段所做的相同:它定期轮询 DOM 以检查您是否满足条件希望它检查是真的。如果它不正确,那么 它会为你使用 Thread.sleep。 (您可以通过阅读 implementation of FluentWait, which is the class on which WebDriverWait is based, and of Sleeper 来确定我在这里说的是什么,因为 FluentWait 使用 Sleeper.SYSTEM_SLEEPER 在民意调查之间休眠。)

与接受的答案断言 ("Once the element is loaded then it becomes intractable immediately") 相反,当您等待的条件变为真时,WebDriverWait 不会立即允许您与该元素进行交互。如果 WebDriverWait 实例在条件变为真时正在休眠,它将继续休眠 直到其休眠间隔结束(默认为 0.5 秒),然后它会再次检查条件如果发现条件为真,则立即 return 。否则,除非您为其设置的超时已过期,否则它将重新进入睡眠状态。

您自制的等待外观与 WebDriverWait 之间的区别在于 WebDriverWait 可重用、灵活,并且旨在处理您的代码无法处理的一系列情况。或者换句话说,它更健壮。特别是,它会让不知道如何处理的异常逐渐出现,而不是像您的代码那样隐藏它们。 我无法想象在哪种情况下您的代码会更可取。