1、强制等待
time.sleep(5)或者sleep(5)
等待固定的时间,才会继续执行下面的代码,影响脚本的运行速度。
2、隐式等待(全局隐式等待)
driver.implicitly_wait(5)
当元素可以被定位到,则继续执行;如果超过时长还没有定位到,则会抛出异常。
隐式等待是全局的,设置时间不宜过长。当元素处于不可交互的状态时就会触发隐式等待,多次设置的话后一次会覆盖前一次。
这种方法有个弊端,就是程序会一直等到整个页面加载完成才会继续执行下一步,比如某些时候想要的页面元素早就加载完了,但是由于个别JS等资源加载稍慢,此时程序仍然等待全部页面加载完成后才会继续执行下一步,无形中加长了测试用例的执行时间。
3、显式等待
是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在;
如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作;如果超过设置时间检测不到则抛出异常,默认检测频率为0.5s,默认抛出异常为:NoSuchElementException
显示等待用到的两个类: WebDriverWait
和expected_conditions
WebDriverWait用法
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
- driver:浏览器驱动
- timeout:最长超时时间,默认以秒为单位
- poll_frequency:检测的间隔步长,默认为0.5s
- ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception
WebDriverWait的until()和until_not()方法:
- method:在等待期间,每隔一段时间(init中的poll_frequency)调用这个传入的方法,直到返回值不是False
- message:如果超时,抛出TimeoutException,将message传入异常
- until_not:与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件则继续执行,参数也相同。
expected_conditions类
presence_of_element_located
判断元素是否被加到了DOM树里,并不代表该元素一定可见、可点击的- 用法:
WebDriverWait().until(expected_conditions.presence_of_element_located(元素))
visibility_of_element_located
判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0- 用法:
WebDriverWait().until(expected_conditions.visibility_of_element_located(元素定位)
使用lambda表达式
- WebDriverWait(driver,time).until(lambda x:x.find_element_by_id("someId")
返回一个元素
例子
lambda:
WebDriverWait(driver, 8).until(lambda x: x.find_element(By.XPATH, "//*[@text='账号密码登录']"))
expected_conditions:
locate=(By.XPATH, "//*[@text='手机号']")
WebDriverWait(driver, 10).until(expected_conditions.visibility_of_element_located(locate))
WebDriverWait(driver,10).until(expected_conditions.presence_of_element_located(locate))
WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable(locate))