selenium自动化测试中的等待操作(9)
一、selenium自动化测试中的等待操作
1.为什么要做等待:因为被测系统反应需要一些时间,所以有些步骤之间需要加一些必要的等待操作。
2.等待的实现三种方式:
(1)方式一:强制等待固定时间,只需要导入python语言自带的time模块里的sleep函数,在脚本中调用sleep函数,增加以秒为单位的时间数作为参数即可。优点是代码语法简洁,适合初学者使用,缺点是不灵活,等待的时间是固定的。
示例:
from time import sleep
sleep(3)
(2)方式二:隐式等待,是全局的设置,在每一次查找定位元素前都会自动做等待,直到等待到元素能定位到为止,等待时间不是固定的。只需要在启动浏览器的步骤后,设置一下所有元素找不到时最多等待多长时间,也就是隐式等待的超时时间即可,后面的步骤中间不需要加等待元素出现的步骤了。如果到达超时时间仍然找不到元素,会抛出异常NoSuchElementException。优点是等待时间比强制等待灵活,而且是全局设置,不用书写很多次,缺点是如果判断元素找不到,需要等待很长时间,只能等待元素出现,不能等待其他的条件成立,功能有限。
语法:driver.implicitly_wait(超时时间)
说明:超时时间单位是秒。
示例:
driver=webdriver.Firefox()
# 设置隐式等待的超时时间是15秒
driver.implicitly_wait(15)
(3)方式三:显式等待,是功能最强大的等待方式,也是语法最复杂的等待方式,可以自定义等待的条件,例如等待一个弹出框出现、等待一个按钮变为可用的状态、等待一个单选按钮变为选中的状态、等待当前网页标题变为xxx、等待当前url变为xxx……,它不是全局的设置,哪里需要等待,就在哪里书写代码。
a.第一步:在文件开头处导入selenium专门设计的一个显式等待类WebDriverWait和自定义等待条件的模块expected_conditions,语法如下
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
b.第二步:在需要等待的步骤之间,实例化WebDriverWait对象,它的构造函数至少要给定两个必填参数,第一个参数是driver,第二个参数是等待的超时时间(以秒为单位)。
示例:
# 实例化WebDriverWait对象,等待超时时间是15秒
w1=WebDriverWait(driver,15)
c.第三步:准备自定义的等待条件,需要调用expected_conditions模块里的实现类构造函数描述需要等待的条件,具体参考Selenium资料\expected_conditions.txt里的说明。
示例1:
# 准备等待条件:网页的标题包含“用户中心”
c1=EC.title_contains("用户中心")
示例2:
# 准备等待条件:网页的标题等于“用户中心_ECSHOP演示站 - Powered by ECShop”
c1=EC.title_is("用户中心_ECSHOP演示站 - Powered by ECShop")
示例3:
# 准备等待条件:等待用户名文本框出现在当前网页源代码里
c2=EC.presence_of_element_located((By.NAME,"username"))
d.第四步:调用WebDriverWait类里的until函数或until_not函数来等待条件成立或不成立,参数就是第三步所准备的那个等待条件的对象。
示例:
w1.until(c1)
补充:显示等待的条件如果是presence_of_element_located,那么until函数会返回刚才所等待出现的元素对象,随后可以直接操作该元素。---了解!
示例:
# # 显式等待,等待跳转回留言板页(等待网页源代码里出现主题文本框)
w1=WebDriverWait(driver,15)
c1=EC.presence_of_element_located((By.NAME,"msg_title"))
zhu=w1.until(c1)
# 输入主题
#zhu=driver.find_element(By.NAME,"msg_title")
zhu.send_keys("hello")