selenium等待的三种方式和排查定位的步骤
做UI自动化时会遇到服务环境不稳定、网络环境不稳定,访问一个页面要加载好久都没出来,导致页面还没有打开就报错了,这时用到等待
等待有三种方式:
普通人用time等待(最不可取)
聪明人用隐式等待 driver.implicitly_wait()
# 隐式等待是针对整个项目的,driver生成的时候写一遍就行了,写在get之后,不建议使用
大神用显示等待 WebDriverWait
# from selenium.webdriver.support.wait import WebDriverWait
# from selenium.webdriver.support import expected_conditions as EC
# 不间断扫描dom,保证元素第一次出现后,不再做无谓的等待,如果用time就会比较死,按照规定的时间等待
WebDriverWait(driver, 10, 1).until(EC.presence_of_element_located((By.ID, 'i1'))) # 了解until
EC.presence_of_element_located((By.ID,'i1')) # 判断以ID形式定位的元素是否出现在dom树中,返回true or false,until里面如果是true就继续执行,如果是false过1秒后再次判断EC.presence_of_element_located((By.ID, 'i1'))是true还是false,当超过10秒时整体WebDriverWait会报一个TimeoutException
隐式等待和现实等待的区别:
1、隐式等待是全局的,可以随时更改的,显示等待是针对单一元素或者一组元素的
2、隐式等待只能针对元素查找方法,显示等待可以自定义等待条件
当你遇到一个定位不到的问题,怎么去排查:
1、分清html,看清楚哪些是我们要用的唯一属性
2、看清父子级关系
3、有没有浏览器的tab要切换
4、排查有没有iframe
5、排查这元素在代码调用打开时,页面是否渲染了
6、排查你定位的元素是否有display
7、不用显示等待,用time调式方式,确保元素可以点击
8、看你的操作是不是需要连贯的操作
9、考虑是不是我的定位方式写错了