WebDriverWait 类实战—Python自动化测试实战(7)

发表于:2019-6-20 10:04

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:无涯    来源:51Testing软件测试网原创

  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软件测试网获得电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号