当前位置: 首页 > 知识库问答 >
问题:

等待web元素的好方法

段干宏硕
2023-03-14

如果我的问题听起来很重要,我事先道歉,我在质量保证和硒方面是新手。

我正在使用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个答案

董庆
2023-03-14

使用WebDriverWait总是比使用sleep语句更理想。一旦加载了元素,它就会立即变得难以处理,而不是等待一定的时间。尤其是如果有许多测试使用同一步骤,从长远来看,这会节省大量时间。

至于预期的情况,我推荐这一页,。

轩辕庆
2023-03-14

你接受的答案是不正确的。

WebDriver等待所做的事情与您的代码片段所做的大致相同:它定期轮询DOM,以检查您希望它检查的条件是否为真。如果它不为真,那么它将使用Thread.sleep为您服务。(您可以通过阅读Fluent等待的实现来确定我在这里所说的内容,这是WebDriver等待所基于的类,也是Sleeper的实现,因为Fluent等待使用Sleeper.SYSTEM_SLEEPER在轮询之间进入睡眠状态。)

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

自制等待外观与WebDriverWait之间的区别在于WebDriverWait是可重用的、灵活的,可以处理代码无法处理的一系列条件。或者换一种说法,它更健壮。特别是,它会让不知道该如何处理的异常慢慢累积,而不是像代码那样隐藏它们。我无法想象在什么情况下你的代码会更好。

 类似资料:
  • 我有一个动态加载的页面,其中包含一个按钮。我正在尝试等待selenium使用C#绑定点击按钮。我有以下代码: 不过这不管用。click事件永远不会被触发。selenium脚本不会抛出异常警告ID为“addInspectionButton”的元素不存在。它只是不能点击它。如果我加一根线。Sleep(3000)在wait语句和我获得按钮元素句柄的那一行之间。 我没有使用预期条件.元素在这里正确点击吗?

  • 所以我们有一页医学专科。它原本只是英文的。因此,如果您搜索“neuro”,则HTML看起来类似于 然后他们添加了西班牙语,所以并不是所有的结果都会返回,但是只有西班牙语是可见的。一个新的 > 添加在底部。 是否有方法等待任何匹配xpath的元素可见?注意,visibilityOfAllElements()将不起作用,因为它们不会全部可见。 我想可以做的是,预先计算所有带有@id和“width”的元

  • 本文向大家介绍Python爬虫之Selenium设置元素等待的方法,包括了Python爬虫之Selenium设置元素等待的方法的使用技巧和注意事项,需要的朋友参考一下 一、显式等待 WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常(TimeoutException) 语法: WebDr

  • 问题内容: 我正在寻找类似于在单击元素之前检查元素是否已显示的内容。我认为可以通过完成此操作,因此我使用了以下方法: 然后点击 不幸的是,有时它等待元素,有时不等待。我寻找了一段时间,找到了这个解决方案: 它等待一切正常,但是在超时之前必须等待10次5、50秒。有点多。因此,我将隐式等待时间设置为1秒,直到现在一切都还不错。因为现在有些事情在超时前等待10秒,而另一些事情在1秒之后超时。 如何覆盖

  • 问题内容: 只要我使用PageObject模式,我就想知道应该在哪里等待动态页面上的元素。假设我们有测试方法和pageObject类。我应该做类似的事情吗(在测试方法中): 点击按钮 等待元素显示 验证元素(例如包含方法isElementDisplayed()) 也许还有其他好的做法来等待该要素?也许我们应该等待PageObject.class中的isElementDisplayed方法中的元素?

  • 等待元素出现在网页上的最佳方式是什么?我已经读到,我们可以使用隐式等待和功能,如网络驱动程序wait,流利的等待等,最后但不是最不重要的线程.sleep()...我使用最多,但想停止使用。 我的场景: 用户登录到网站…网站检查凭据,并以叠加的形式向用户提供报价(一种弹出窗口,但不是单独的窗口)。我需要验证叠加图上的文字。用户登录和显示覆盖之间存在时间间隔。最好的方法是什么,以便硒只等待元素不可见的