9I WebDriver – 显式等待

    大家好! 这篇文章是先前文章“”的延续。

    事不宜迟,让我们利用“显式等待”的力量。 显式等待需要更多的编码,但是与隐式等待相比,它具有巨大的优势。 在这里,我们可以等到某种情况发生后再进行测试。 如果在指定的超时值内未满足条件,则将引发异常。

    语法如下,

    因此,类用于指定最大超时值,在这种情况下为 15 秒。 ExpectedCondition类的方法涵盖了我们希望在测试中出现之前要等待的大多数条件。 这些条件与WebDriverWait一起使用。

    ExpectedCondition预定义方法的一些示例是,

    • elementToBeClickable(By locator) – 用于检查元素的期望是可见的并已启用,以便您可以单击它。
    • elementToBeSelected(WebElement element) - 检查是否选择了给定元素。
    • – 检查页面的 DOM 上是否存在元素。
    • urlToBe(java.lang.String url) – 检查当前页面的 URL 是一个特定的 URL。
    • visibilityOf(WebElement element) - 用于检查存在于页面的 DOM 上的已知元素的是可见的。

    您可以在此处,找到适用于 Java 的ExpectedConditions包的所有可用方法及其用法的详细信息。

    注意:根据 ,我们警告您不要混合使用隐式和显式等待,因为这可能会导致不可预测的等待时间。

    谁不喜欢自定义? 对于显式等待,如果这是您要搜索的内容,那么我建议您使用流利的等待。 我们可以通过流畅的等待来配置以下内容,

    • 在抛出异常之前我们希望等待(超时)条件发生的最长时间,
    • 我们在等待条件发生时要忽略的异常类型
    1. public WebElement fluentWait(final By locator) {
    2. Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
    3. .withTimeout(20, TimeUnit.SECONDS)
    4. .pollingEvery(2, TimeUnit.SECONDS)
    5. .ignoring(NoSuchElementException.class)
    6. .until(new Function<WebDriver, WebElement>() {
    7. public WebElement apply(WebDriver driver) {
    8. }
    9. });
    10. }

    在这里,我们声明超时值为 20 秒的流畅等待,每 2 秒(频率)轮询 DOM 直到找到元素为止,并在此时间间隔内忽略NoSuchElementException。 我们在上面的代码片段中创建了一个新函数,以在.until()中标识此 Web 元素。

    有几点值得您花时间

    1. 与隐式等待不同,此方法适用于findElement(s)以及您可能会想到的在自动化网页时进行枚举的任何其他条件。
    2. 可以自定义默认超时值和频率,并且仅将其应用于特定元素,这与隐式等待不同,隐式等待在启动后就适用于WebDriver对象实例的寿命。
    3. 我们可以实现自己的条件,也可以使用ExpectedConditions类中的预定义条件之一。
    4. 使用FluentWait,我们可以忽略某些异常并改为指定自定义错误消息。 这将我们的调试经验提升到一个全新的水平。
    5. 通过忽略特定的异常直到满足我们的条件,流利的等待比隐式等待更可靠。

    同意的显式等待包括对代码的更多修饰,但是您认为值得这样做吗?

    注意您可能会想,为什么要经历所有这些痛苦? 我不能只使用Thread.sleep()吗? 嗯,不,不建议这样做,因为它会使整个测试脚本无条件进入休眠状态。 在大多数情况下,指定的睡眠时间不够长(导致异常),或者变得太长,导致即使元素加载速度更快,测试也要等待。

    令我全神贯注:虽然显式等待涉及更多的编程部分,但由于它能够解决很多问题,使我们的生活变得更加轻松,我宁愿选择此方法,而不是隐式等待(基于测试自动化的需求和复杂性涉及眨眼)。

    在另一个帖子中再见! 祝你今天愉快!