java - 等待网页元素的好方法

标签 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();

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

最佳答案

答案you accepted是不正确的。

WebDriverWait 所做的粗略地说与您的代码片段所做的相同:它定期轮询 DOM 以检查您希望它检查的条件是否是真的。如果不是,则它会为您使用Thread.sleep。 (您可以通过阅读 implementation of FluentWait 来确定我在这里所说的内容,这是 WebDriverWait 所基于的类,并且 Sleeper 是因为 FluentWait 使用 Sleeper.SYSTEM_SLEEPER 在轮询之间 hibernate 。)

与接受的答案所断言的相反(“一旦元素被加载,它就会立即变得棘手”),当您等待的条件变为真时,WebDriverWait 不会立即允许您与元素交互。如果 WebDriverWait 实例在条件变为真时正在 hibernate ,它将继续 hibernate 直到其 hibernate 间隔结束(默认为 0.5 秒),然后它会再次检查条件如果发现条件为真,则立即返回。否则,除非您为其设置的超时已过期,否则它将重新进入休眠状态。

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

关于java - 等待网页元素的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33241083/

相关文章:

java - 使用 txt 文件创建 zip 存档,其内容具有 utf-8 字符集

java - 使用 Web 服务时如何管理用户 session ?

javascript - 如何将鼠标悬停在超链接上 - Webdriver

java - Selenium java添加cookie

python - AttributeError : 'NoneType' object has no attribute 'to_capabilities' . 在 Appium 上运行 python 脚本时出现此错误

java - 从 Github 克隆失败

java - Java 中的数字格式化

使用 java 时,Selenium SendKeys 不适用于开括号和强键

firefox - 如何让 Firefox 在同一窗口中打开通过 WebDriver 打开的所有链接?

java - 导出项目 eclipse java 时制作多个可运行文件