显式等待高级使用
显式等待高级使用
简介
Appium
中的显式等待是一种等待机制,它用于在执行测试脚本时,显式地等待某个特定条件发生或者元素可用,以确保脚本在合适的时机执行。显式等待会在等待一定时间后,判断某个条件是否满足。如果条件满足则继续执行脚本,如果超过设定的时间仍然不满足条件,则抛出超时异常。
在 Appium
中,显式等待可以通过 WebDriverWait
类来实现。WebDriverWait
允许指定一个最长等待时间,并设置一个间隔时间,在这个事件范围内等待某个条件满足。一旦条件满足或超时,等待就会结束。
显式等待的优势
显式等待是一种灵活、可控的等待机制,适用于各种测试场景,帮助测试脚本再复杂的页面加载和异步操作情况下更加稳定地执行。
- 精准等待:显式等待允许测试脚本等待某个特定条件发生,有助于确保测试在最合适的时机执行,提高了测试脚本的稳定性和可靠性。
- 灵活性:显式等待提供了灵活的等待时间设置,用户可根据实际情况调整,以适应不同的应用场景。这种可调整性使得测试更较灵活,能够适应不同的网络速度、服务器响应时间等因素。
- 超时处理:显式等待允许设置最长等待时间,一旦时间超过设定的超时时间,就会抛出超时异常。有助于及时检测和处理超时情况,
- 提高稳定性:通过显式等待,可以确保在执行测试脚本时等待页面或元素加载完毕,从而提高了测试的稳定性。对于自动化测试来说是至关重要的,因为页面加载时间和异步操作的完成时间可能受到多种因素的影响。
显式等待用法
WebDriverWait 用法
WebDriverWait
是 Selenium
中的等待类,用于再测试脚本中指定条件等待某个特定的条件发生或超时。主要包含如下参数:
Python:
-
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
:driver
:浏览器驱动。timeout
:最长超时时间,默认以秒为单位。poll_frequency
:检测的间隔步长,默认为 0.5s。ignored_exceptions
:超时后的抛出的异常信息,默认抛出NoSuchElementExeception
异常。
-
WebDriverWait
的until()
和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。
-
WebDriverWait
的until()
和untilNot()
方法: until(Funchtion<WebDriver, T> isTrue)
:当某元素出现或什么条件成立则继续执行。untilNot(Funchtion<WebDriver, T> isTrue)
:当某个元素消失或什么条件不成立则继续执行。
等待条件
在 WebDriverWait
中的模块提供了一系列条件,用于等待页面元素的特定状态。
以下是两种常用的条件:
-
等待某个元素出现在 DOM 中:
presence_of_element_located
- 用于判断元素是否被加到了 DOM 树里,并不代表该元素一定可见。
- 语法:
- Python:
WebDriverWait().until(expected_conditions.presence_of_element_located(元素对象))
- Java:
new WebDriverWait(driver, timeout).until(ExpectedConditions.presenceOfElementLocated(元素对象))
。
- Python:
-
等待某个元素既存在于 DOM 中,又是可见的:
visibility_of_element_located
- 判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于 0。
- 语法:
- Python:
WebDriverWait().until(expected_conditions.visibility_of_element_located(元素定位符))
- Java:
new WebDriverWait(driver, timeout).until(ExpectedConditions.visibilityOfElementLocated(元素定位符))
。
- Python:
其他常用方法:
- 等待元素可点击:即元素可见且启用,可以响应点击事件,
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")));
总结
- 显式等待的用法