之前有总结到说定位元素的方法,我习惯是用xpath的,上篇文章已经提到过怎么用xpath来定位,在我们做UI自动化,定位到了元素,但是在页面中元素不一定被渲染出来了,这个时候我们运行脚本肯定会给你报错的,那么我们怎么解决这种问题呢?
selenium中有三大定位方式可以解决这种问题:
- 强制等待
- 隐性等待
- 显性等待
这三种方式都是可以解决这种问题的,简单说下这三种方式的用法以及适用场景吧
1、强制等待
强制等待我们一般在做UI自动化用的也多,但是对于这个时间一般是很少的,强制等待的意思是运行到了这行代码后,你就必须要停止多少秒之后才能运行,这种确实是比较强制吧,哈哈哈。。。
import time time.sleep(5) # 强制等待5秒
用法就是上面这种,time.sleep(5)就是强制等待5秒,也就是5秒之后你才能去运行下一行代码
2、隐性等待
隐性等待的意思是等待的时间不会暴露出来,也就是悄悄的等,不会让你发现,等页面加载好了之后就会进行下一步操作,如果设定的时间还没有等到页面加载完,那么就会抛出异常,也就是最多会等待你设定的时间,超出这个时间后就会报错
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # 隐性等待10秒钟
3、显性等待
显性等待的意思就是在我们的代码中可以设置一个元素,设定时间,和循环周期,比如下面的代码:
使用显性等待的话我们需要导入下面几个包,expected_conditions这个里面有很多的检查方式,我这里只是列举了一个检查到元素存在的方式(具体可以看看源码哈,方式很多,根据具体的方式选择),在WebDriverWait这个类里面我们需要传递三个参数(会话、总共等待的时间,循环时间)
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Chrome() driver.get("https://ke.qq.com/") # 打开腾讯课堂 first_login = (By.XPATH, '//a[@class="mod-header__link-login js-login-op"]') # 腾讯课堂首页登录按钮 WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(first_login)) # 显性等待到登录按钮加载出来,没隔0.5检查一共10秒
在以上这三种等待方式中我们一般常用的是显性等待,当然这三种方式都是可以共同用的。