显性等待和隐性等待是用于解决UI自动化测试中页面加载、元素定位等问题的两种等待机制。
显性等待,需要手动编写代码指定等待时间,程序会在指定的时间内等待某个条件满足后再继续执行后续操作,一旦超时就会报错。例如,通过WebDriverWait类实现显性等待,调用方法ExpectedConditions的各种断言方法,等待页面元素的出现、可点击、可见等条件。
隐性等待,则是在代码初始化时设置一个全局等待时间,在等待时间内每隔固定时间检测一次元素是否存在或可见,如果存在或可见就立即继续执行下一步操作,否则就继续等待。例如,通过调用implicitly_wait()方法实现隐性等待。
两种等待机制的区别在于显性等待需要手动编写代码指定等待时间和条件,可以灵活调整等待时间和条件,但代码冗长;而隐性等待只需要设置全局等待时间,代码简洁,但等待时间和条件不太灵活和可控,如果全局等待时间设置太短,容易造成定位失败的问题。
相同点:
都是智能等待,在一定时间范围内不断查找元素,一旦找到立刻结束查找,继续执行代码,没找到会一直找到超时为止
不同点:
1、隐性等待是全局性设置,并且可以随时更改,在更改后对之后的find XXX方法生效,对点击、输入之类的操作不起作用
driver.implicitly_wait(20)
2、显性等待仅仅针对单一元素或一组生效,并且不仅仅是针对查找,也可以针对alert、iframe或者元素的某些属性进行自定义判断
ele = WebWait(driver, 3).until(EC.presence_of_element_located(locator=("link text", "登录")))
ele.click()
# 输入账号-显性等待
yhm_located = ("name", "accounts")
yhm_ele = WebWait(driver, 3).until(EC.presence_of_element_located(yhm_located))