处理动态等待是UI自动化领域的一个紧迫任务,特别是对于现代Web应用程序,因为内容常常会出现并且变化并不瞬时。
问题背景
在早期的自动化版本中,使用了硬等待(sleep),这使得测试变得过于缓慢,或者,如果应用程序的加载时间超过正常,测试则会出现波动。在SPA和重JS时代,这一问题变得尤为突出。
问题 使用静态延迟导致测试不稳定和浪费时间:自动化测试可能会随机卡住或失败。此外,测试的可扩展性和维护性也受到影响。
解决方案
使用动态(显式)等待:例如,在Selenium中使用WebDriverWait,在Cypress和Playwright框架中使用waitFor函数。
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) # 最大等待时间10秒 wait.until(EC.visibility_of_element_located((By.ID, 'my-element')))
关键特点:
如果有动态等待,sleep还有什么用?
使用time.sleep()仅在调试或极端情况下是合理的。在实际的自动测试中,最好始终使用显式等待。
使用等待是否能完全消除波动?
不,如果等待条件描述不合理(例如,等待某个属性出现,而不是数据完全加载),波动将会继续存在。
可以为所有测试做一个全局等待吗?
不 - 元素的出现条件各不相同。等待应该严格应用于那些必要的步骤。
sleep代替等待所有自动测试在“点击”和检查之间都写了sleep(2)。更新页面后,用户抱怨延迟,而测试有时因网络慢而失败。
优点:
缺点:
为加载块设置了显式等待,在出现所需元素后才可以点击。放弃了sleep,所有测试稳定且快速通过。
优点:
缺点: