在自动化UI测试的初期,主要的困难在于因为元素出现的延迟而导致测试不稳定,以及需要等待页面上的异步操作。测试人员之前经常使用硬性延迟(sleep),这导致测试执行时间过长且稳定性低。
问题在于,网页应用程序变得越来越动态。元素异步出现和消失,前端和后端的同时操作可能导致测试因对UI状态的错误预期而失败。像Thread.sleep(1000)这样的静态暂停只会增加测试时间,并不能保证测试的成功通过。
解决方案是使用显式和隐式等待(explicit/implicit waits),这允许更灵活和有效地将操作与接口的实际状态同步。例如,在Selenium或类似框架中,可以使用WebDriverWait或类似的工具根据条件检查所需元素的出现:
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) element = wait.until(EC.presence_of_element_located((By.ID, "myElem")))
关键特点:
为什么仅使用隐式等待(implicit waits)而不使用显式等待更好?
隐式等待应用于整个驱动程序,可能导致意外的延迟或与显式等待的冲突,这通常会导致“TimeoutException”错误。
在UI测试中是否应使用Thread.sleep进行等待?
强烈不建议使用Thread.sleep:这会导致不必要的延迟和测试的不稳定性。最好使用显式等待和条件。
如果元素有动画式出现该怎么办?
不仅要等待元素本身的出现,还要等待它的状态(例如,可见性或可点击性),使用像visibility_of_element_located这样的特殊条件。
sleep)而不是条件。在项目中,使用Thread.sleep(3000)实现了等待模态窗口的出现。窗口的出现时间有时更快,有时更慢。脚本工作缓慢,在负载增加时,测试有时会失败。
优点:
缺点:
逻辑被重新设计——所有与UI的操作都包裹在明确的可见性和元素活跃性的等待函数中,所有操作都加快了,稳定性提高到98%。
优点:
缺点: