元素等待
为什么要进行元素等待?
- 网络慢的时候,元素还未加载出来,这时候继续往下进行程序,就会报错
- 有些元素只有执行某种交互的时候才会加载出来(例如一些分页加载/懒加载)
元素等待的几种方式
- 强制等待:time.sleep()
- 智能等待:隐式等待/显示等待
为什么要进行智能等待?
- 强制等待不灵活,如果等待时间不足,程序就会报错;如果等待时间过长,自动化程序效率低
- 智能等待是任何时候元素加载完成,接结束等待,不会浪费时间,可以很快进行下一步操作
隐式等待 implicitly_wait(self, time_to_wait)
用法:
- time_to_wait:就是设置隐式等待的时间
- 设置隐式等待 driver.implicitly_wait(30), 最大等待时间是30s,如果加载超过30s 元素还是没有加载出来,程序就会报错;所以设置隐式等待超时时间,可以稍微设置长一点,一般30-40s就可以.如果元素在2s的时候就加载出来了,那程序就不会继续等待30s,比强制等待更加灵活。
- 隐式等待只需要设置一次,在初始化浏览器后进行设置;之后每一个元素查找都有30s的等待时间。
- 隐式等待的不足——隐式等待只能用于元素查找,等待元素出现;有些不是元素查找的操作,就不适用!(例如等待一个弹窗/页面出现,这时候就不能用隐式等待)
显示等待--重点!
定时器+条件——>等待某个条件被满足(例如等待某个元素可以被点击/某个页面可见等)
- 常用的一些触发条件
condition_1 = EC.presence_of_element_located(locator=) #查找元素被加载出来,用的最多
condition_2 = EC.visibility_of_element_located(locator=) #查找元素可视,用的第二多
condition_3 = EC.element_to_be_clickable(locator=) #查找元素可以被点击,第三 - 定位器locator()
2.1 locator是放在条件里的参数,一定是元组类型;
2.2 loader()里面有两个参数,第一个是元素查找的方式,例如id/xpath,第二个元素是要元素值,例如:loader = ("xpath", "//input[@id='kw']") - 显示等待的4个步骤
3.1 初始化一个定时器wait()
3.2 初始化一个定位器locator()
3.3 设置一个条件condition,触发定时器的条件,把locator()添加到条件中,condition(locator);
3.4 把条件添加到定时器中,wait.until(condition(locator()));
全部写一起就是:wait = WebDriverWait(driver, 30, 0.2).until(EC.presence_of_element_located(("xpath", "//input[@id='kw']"))) - locator()参数的两种写法
4.1 直接用字符串:locator("xpath", '//input[@id="kw"]')
4.2 用By表达式:locator(By.XPATH, '//input[@id="kw"]')
注意事项
- 条件使用:首选visible/presence/clickable
- loader()--一定是一个元组类型的数据!
提供一个偷懒等待方法: