Skip to content

显式等待高级使用

显式等待高级使用

简介

Appium 中的显式等待是一种等待机制,它用于在执行测试脚本时,显式地等待某个特定条件发生或者元素可用,以确保脚本在合适的时机执行。显式等待会在等待一定时间后,判断某个条件是否满足。如果条件满足则继续执行脚本,如果超过设定的时间仍然不满足条件,则抛出超时异常。

Appium 中,显式等待可以通过 WebDriverWait 类来实现。WebDriverWait 允许指定一个最长等待时间,并设置一个间隔时间,在这个事件范围内等待某个条件满足。一旦条件满足或超时,等待就会结束。

显式等待的优势

显式等待是一种灵活、可控的等待机制,适用于各种测试场景,帮助测试脚本再复杂的页面加载和异步操作情况下更加稳定地执行。

  • 精准等待:显式等待允许测试脚本等待某个特定条件发生,有助于确保测试在最合适的时机执行,提高了测试脚本的稳定性和可靠性。
  • 灵活性:显式等待提供了灵活的等待时间设置,用户可根据实际情况调整,以适应不同的应用场景。这种可调整性使得测试更较灵活,能够适应不同的网络速度、服务器响应时间等因素。
  • 超时处理:显式等待允许设置最长等待时间,一旦时间超过设定的超时时间,就会抛出超时异常。有助于及时检测和处理超时情况,
  • 提高稳定性:通过显式等待,可以确保在执行测试脚本时等待页面或元素加载完毕,从而提高了测试的稳定性。对于自动化测试来说是至关重要的,因为页面加载时间和异步操作的完成时间可能受到多种因素的影响。

显式等待用法

WebDriverWait 用法

WebDriverWaitSelenium 中的等待类,用于再测试脚本中指定条件等待某个特定的条件发生或超时。主要包含如下参数:

Python:

  • WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

    • driver:浏览器驱动。
    • timeout:最长超时时间,默认以秒为单位。
    • poll_frequency:检测的间隔步长,默认为 0.5s。
    • ignored_exceptions:超时后的抛出的异常信息,默认抛出 NoSuchElementExeception 异常。
  • WebDriverWaituntil()until_not() 方法:

  • until( method, message='') :当某元素出现或什么条件成立则继续执行。
  • until_not(method, message='') :当某个元素消失或什么条件不成立则继续执行。
    • method:在等待时期,每隔一段时间(init 中的 poll_frequency)调用这个传入的方法,知道返回值不是 False。
    • message:如果超时,抛出 TimeoutException,将 message 传入异常。

Java:

  • WebDriverWait(WebDriver driver, long timeoutInSeconds)

    • driver:浏览器驱动。
    • timeoutInSeconds:最长超时时间,默认以秒为单位。
    • pollFrequency:检测的间隔步长,默认为 0.5s。
  • WebDriverWaituntil()untilNot()方法:

  • until(Funchtion<WebDriver, T> isTrue):当某元素出现或什么条件成立则继续执行。
  • untilNot(Funchtion<WebDriver, T> isTrue):当某个元素消失或什么条件不成立则继续执行。

等待条件

WebDriverWait 中的模块提供了一系列条件,用于等待页面元素的特定状态。

以下是两种常用的条件:

  1. 等待某个元素出现在 DOM 中: presence_of_element_located

    • 用于判断元素是否被加到了 DOM 树里,并不代表该元素一定可见。
    • 语法:
      • Python: WebDriverWait().until(expected_conditions.presence_of_element_located(元素对象))
      • Java: new WebDriverWait(driver, timeout).until(ExpectedConditions.presenceOfElementLocated(元素对象))
  2. 等待某个元素既存在于 DOM 中,又是可见的: visibility_of_element_located

    • 判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于 0。
    • 语法:
      • Python: WebDriverWait().until(expected_conditions.visibility_of_element_located(元素定位符))
      • Java: new WebDriverWait(driver, timeout).until(ExpectedConditions.visibilityOfElementLocated(元素定位符))

其他常用方法:

  • 等待元素可点击:即元素可见且启用,可以响应点击事件,element_to_be_clickable/elementToBeClickable
  • 等待元素包含指定文本:text_to_be_present_in_element/textToBePresentInElement
  • 等待打开的窗口数量达到特定值:number_of_windows_to_be/numberOfWindowsToBe
  • 等待窗口标题包含特定文本title_contains/titleContains

使用 lambda 表达式

WebDriverWait 还可以结合 lambda 表达式,直到等待表达式通过后再将所等待的元素返回。

Python 示例:

# 通过id定位元素,直到成功定位到这个元素将该元素返回。
WebDriverWait(driver,time).until(
    lambda x:x.find_element(AppiumBy.ID, "someId")
)

Java 示例:

// 通过id定位元素,直到成功定位到这个元素将该元素返回。
WebElement element = wait.until((driver) -> driver.findElement(By.id("someId")));

总结

  • 显式等待的用法