1.死等 sleep()
遇到的问题:页面加载渲染过程中,元素未就绪而抛出NoSuchElementException
解决方法:在元素定位报错代码前一行加上time.sleep(N)
注意:
如果加了sleep能够解决问题,说明是元素未就绪
如果加了sleep无法解决问题,说明是别的问题导致,比如说定位器写错
强制等待只能用于脚本调试,提交到工程中的代码不能包含强制等待
缺点:-》解决办法是隐式等待
不稳定(比如说,网速影响导致同一个元素在不同测试过程中加载时间不一致)
不确定页面加载时间,设置等待时间过长可能影响用例的执行效率,过短可能依然没等到元素就绪导致代码报错
2.隐式等待implicitly_wait()
implicitly_wait()
遇到的问题:难以确定元素加载就绪所需要的等待时间
解决方案:针对寻找元素的这个动作,使用隐式等待添加配置
特点:隐式等待全局生效,对所有find_element方法生效
缺点:只能解决元素查找的问题,不能解决元素无法交互的问题
原因:-》解决办法是显式等待
• 页面元素加载是异步加载过程,通常先加载html,再加载css、js
• 元素存在与否由HTML决定,元素的交互是由css或js决定的
• 隐式等待只关注元素能不能找到,不关注元素是否能够交互(点击、输入等)
3.显式等待 WebDiverWait().until()
WebDiverWait(driver,x).until(expected_conditions.element_to_be_xx)
为元素交互设置一个灵活的总等待时间和一个轮询检测元素状态的时间间隔,脚本每隔一段时间就去检测一次元素是否达到指定的交互状态,如果达到了则退出等待,如未达到则进入下一次轮询间隔直到超出总等待时间。