【问题标题】:A good way to wait for a web element等待网页元素的好方法
【发布时间】:2015-10-20 15:45:24
【问题描述】:

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

我正在使用Java和Selenium编写一个测试,有时我需要等待一个web元素可以访问,下面是我以前使用的sn-p代码:

        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 语句的理想选择。一旦元素被加载,它就会立即变得难以处理,而不是等待一段时间。特别是如果您有许多使用相同步骤的测试,从长远来看,它可以节省大量时间。
  • @AutomatedOrder 感谢您的回复,您能否将其发布为答案?如果你知道,你能告诉我在哪里可以了解更多关于 ExpectedConditions 的信息。方法?

标签: java selenium selenium-webdriver selenium-chromedriver


【解决方案1】:

you accepted 的答案不正确。

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

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

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

【讨论】:

  • 非常感谢您的帮助,我在哪里可以下载 org.openqa.selenium.support.ui 的 javadoc jar,我可以将它添加到我的项目中,当我将鼠标悬停在一个方法上时,它会显示一些信息关于它?
  • @LoveLovelyJava 恐怕我无法将 javadoc 链接到您的项目。我可以阅读 Java,但自从我不得不以任何实质性的能力在其中编写代码以来,这已经是一个很好的十年了。
【解决方案2】:

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

至于 ExpectedConditions,我推荐this page,

【讨论】:

  • 我在哪里可以下载 org.openqa.selenium.support.ui 的 javadoc jar,我可以将它添加到我的项目中,当我将鼠标悬停在一个方法上时,它会显示一些信息关于它?
  • 我在 c# 中使用 selenium,所以我不是 100% 肯定,但这个链接应该是你要找的,你只需要得到你的版本:java2s.com/Code/Jar/s/selenium-support.htm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多