3.5 WebDriverWait 类实战
在 UI 自动化测试中,首先要保障测试脚本的稳定运行。但是在实际的测试场景中,由于网络的因素导致需要测试的页面打不开或者打开延迟,从而导致页面元素找不到等各种错误的出现。
在 UI 自动化测试中,等待主要存在如下三种形式,分别是:
(1)固定等待。如调用 time 模块中的 sleep 方法,固定等待几秒。
(2)隐式等待。用到的方法是 implicitly_wait,隐藏式等待指设置 长等待时间。
(3)显式等待。主要指程序会每隔一段时间执行自定义的程序判断条件,如果判断条件成功,程序就继续执行;如果判断条件失败,程序就会报TimeOutEcpection 的异常信息。
例如,测试百度首页的搜索时,设置固定等待几秒的时间,实现的代码如下:
#!/usr/bin/envpython #-*-coding:utf-8-*- #author:wuya fromseleniumimportwebdriverimporttimeast driver=webdriver.Firefox()driver.maximize_window()driver.get('http://www.baidu.com')t.sleep(3)driver.find_element_by_id('kw').send_keys('Selenium')driver.quit() |
在以上测试代码中,增加了固定等待 3 秒的时间,试想,如果每个步骤都增加等待 3 秒的时间,那么一个测试用例执行下来后,等待的时间就有十几秒,这样会大大地延长测试用例执行的时间。因此,在 Selnium 中提供了WebDriverWait 类,专门解决网络延迟等待等问题。
1. WebDriverWait 类详解
在学习 WebDriverWait 类应用之前,先来了解一下 WebDriverWait 类的相关概念。WebDriverWait 类放置在 wait 模块下,使用该类的时候,首先需要导入并且对它进行实例化,导入的代码如下:
from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait 类的参数分别是 driver 和 timeout。driver 指的是 webdriver 实例化后的对象,timeout 指的是具体等待的时间。在 WebDriverWait 类的 until 方法中,参数 method 指的是需要调用的方法,调用的方法来自 expected_conditions 模块中的类,也就是说 WebDriverWait 会与 expected_conditions 模块结合起来应用。调用 expected_conditions 模块中的类之后,一般会返回两种形式的对象实例:一种是布尔类型,返回 True 程序继续执行,如果不是 True,程序就会报 TimeOutExpection 的异常信息;另外一种是返回某个类的具体实例对象,使用该对象就可以直接调用该类中的方法。下面具体看一下该模块中的类在 UI 自动化测试中的应用。
2. 元素可见并且可操作
element_to_be_clickable 判断某元素可见后执行输入、点击等操作。 element_to_be_clickable 满足条件后返回的是 WebElement 类的实例对象,这样就可以调用 WebElement 类中的 send_keys 等方法。这里以百度搜索输入框为例,打开百度首页后首先需要加载搜索的输入框,然后才可以在搜索输入框中输入搜索的关键字,否则就返回错误的信息。
实现点击百度首页的"百度一下"按钮的代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- #author:wuya from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By import time as t driver=webdriver.Firefox() driver.maximize_window() driver.get('http://www.baidu.com') driver.implicitly_wait(30) so=WebDriverWait(driver,10).until(expected_conditions.element_to_be_clic kable((By.ID,'kw'))) so.send_keys('Selenium') driver.quit() |
注解:在以上代码中,我们可以看到 WebDriverWait 直接调用静态方法 until,并且显式等待 10 s 的时间,在 until 的方法中又调用了 expected_conditions 模块中的 element_to_be_clickable 类,在 element_to_be_clickable 类中需要指定按 ID 或者其他元素属性来指定元素的属性。
运行以上代码后,在 10 s 范围内,只要百度首页的搜索输入框可以正确地加载出来,都是可以在输入框中输入搜索的关键字。对以上代码进行修改,故意写错元素属性,把 kw 修改成 kwkw,执行后,就会提示 TimeOutExpection 的错误提示,如图 3-5-1 所示。
图 3-5-1
3. 指定元素的文本位置
text_to_be_present_in_element 指定元素的文本位置,一般用于验证一个文本信息或者错误的提示信息。在这里以新浪邮箱登录页面为例,当账号和密码为空,点击"登录"按钮,验证页面返回的错误提示信息是否为"请输入邮箱名",实现的代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- #author:wuya from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By import time as t driver=webdriver.Firefox() driver.maximize_window() driver.implicitly_wait(30) driver.get('https://mail.sina.com.cn/#') #输入新浪邮箱账号 driver.find_element_by_id('freename').send_keys('') #输入新浪邮箱密码 driver.find_element_by_id('freepassword').send_keys('') #点击新浪邮箱登录按钮 driver.find_element_by_link_text('登录').click() WebDriverWait(driver,10).until(expected_conditions.text_to_be_present_in _element((By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/d iv[1]/div[1]/span[1]'),'请输入邮箱名')) driver.quit() |
注解:在以上代码中,如果错误提示信息是"请输入邮箱名",程序执行正确;如果不是,就会提示对应的错误信息。text_to_be_present_in_element 返回的结果是 True 或者 False,当返回结果是 True 的时候,执行结果是正确的;当返回的结果是 False 的时候,则会提示 TimeOutExpection 的错误信息。
因为 text_to_be_present_in_element 返回的结果是 True 或者 False,对以上代码进行修改,见打印的结果:
#!/usr/bin/env python #-*-coding:utf-8-*- #author:wuya from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By import time as t driver=webdriver.Firefox() driver.maximize_window() driver.implicitly_wait(30) driver.get('https://mail.sina.com.cn/#') #输入新浪邮箱账号 driver.find_element_by_id('freename').send_keys('') #输入新浪邮箱密码 driver.find_element_by_id('freepassword').send_keys('') #点击新浪邮箱登录按钮 driver.find_element_by_link_text('登录').click() isText=WebDriverWait(driver,10).until(expected_conditions.text_to_be_pre sent_in_element((By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/d iv[1]/div[1]/div[1]/span[1]'),'请输入邮箱名')) print('打印结果是否是True:{0}'.format(isText)) driver.quit() |
执行后的结果如图 3-5-2 所示。
图 3-5-2
4. 判断元素是否可见
visibility_of_element_located 方法的作用是等元素可见后再执行操作。这里以百度首页的"关于百度"为案例,如果"关于百度"可见,再点击百度首页的"关于百度"链接。实现的代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- #author:wuya from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By import time as t driver=webdriver.Firefox() driver.maximize_window() driver.implicitly_wait(30) driver.get('http://www.baidu.com') aboutBaidu=WebDriverWait(driver,10).until(expected_conditions.visibility _of_element_located((By.LINK_TEXT,'关于百度'))) aboutBaidu.click() driver.quit() |
版权声明:51Testing软件测试网获得电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。