WebDriver元素等待机制
能否构建健壮和可靠的测试是UI自动化测试能否成功的关键因素之一。但实际情况是当一个测试接着一个测试执行的时候,常会遇到各种不同的状况。比如脚本去定位元素或去验证程序的运行状态时,有时会发现找不到元素,这可能是由于突然的资源受限或网络延迟等引起响应速度太慢所导致,这时会返回测试失败的结果。so我们需要在测试脚本中引入延时机制,来使脚本的运行速度与程序的响应速度相匹配。即使脚本和程序的响应能够同步。WebDriver为我们提供了隐式等待和显式等待两种机制。下面一一说明下:
隐式等待
隐式等待为WebDriver中的完整一个测试用例或者一组测试的同步,提供了通用的方法。对于解决由于网络延迟或利用Ajax动态加载所导致的程序响应时间不一致是非常有效的。
当设置了隐式等待时间后,WebDriver会在一定时间内持续检测和搜寻DOM,以便于查找一个或多个不立即加载成功可用的元素。一般情况下,隐式等待的默认超时间设置为0。但一旦设置会作用于这个WebDriver实例的整个生命周期或者说一次完整测试的执行期间,并且WebDriver会使其对所有测试步骤中包含的整个页面的元素查找时都有效。
WebDriver提供了implicity_wait()方法来配置超时时间。基于unittest写的测试脚本,常在setUp()方法中加入隐式等待时间并设置为30秒。当测试执行时,WebDriver在找不到一个元素时,将会等待30秒。当达到30秒超时时间后,将抛出一个NoSuchElementException的异常。下面是一个用到隐式等待机制的简单百度搜索测试脚本,代码如下:
import unittest
from selenium import webdriver class BaiduSearchTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(30) #set implicit wait time 30s
self.driver.maximize_window() #open the baidu page
self.driver.get('https://www.baidu.com') def test_search_python(self):
#get the search textbox
search_textbox = self.driver.find_element_by_id('kw')
search_textbox.clear()
#enter search keyword
search_textbox.send_keys("python") #get the and seacrh button and click
search_button = self.driver.find_element_by_id('su')
search_button.click() #add assert
tag = self.driver.find_element_by_link_text("PyPI").text
self.assertEqual('PyPI',tag) def tearDown(self):
#close the browser window
self.driver.quit() if __name__ == '__main__':
unittest.main(verbosity=2)
显式等待
显式等待是WebDriver中用于同步测试的另外一种等待机制。显式等待比隐式等待具备更好的操控性。与隐式等待不同,显示等待需要为脚本设置一些预置或者定制化的条件,等待条件满足后再进行下一步测试。
显式等待可以只作用于仅有同步需要的测试用例。WebDriver提供了WebDriverWait类和expected_conditions类来实现显式等待。expected_condition类提供了一些预置条件来作为测试脚本进行下一步测试的判断依据。下面是一个包含显式等待的简单测试脚本,代码如下:
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions class BaitduExplicitWaitTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.get('https://www.baidu.com') def test_login_link(self):
WebDriverWait(self.driver, 10).until(lambda s: s.find_element_by_name("tj_login").get_attribute("class") == "lb")
login_link = WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable((By.LINK_TEXT, "登录")))
login_link.click() def tearDown(self):
self.driver.quit() if __name__ == '__main__':
unittest.main(verbosity=2)
上面脚本先使用python的lambda表达式,并且基于WebDriverWait来实现自定义的预期条件判断。设置显式等待超时时间为10s,直到获取到登录元素并判定其class属性为1b。同时使用element_to_be_clickable方法来判断预期条件是否满足。该条件为等待通过定位器查找的元素可见并可用,这里为登录选项可以点击,直到最大等待时间10s。一旦根据指定的定位器找到了元素,预期条件判定方法会把元素返回给测试脚本以提供给下一步的单击操作。如果在设定的超时时间内,没有通过定位器找到可见可点击的元素,将出抛出TimeoutExpection异常。
下表是expected_conditions类支持的网页浏览器自动化操作时常用到的一些通用等待条件。

expected_conditions类已经提供了多种内置的预期等待判定条件,我们在实际工作中的可以直接调用。但如果超出了expected_conditions的范围,不用怕,WebDriverWait类也提供了强大的自定义预期等待判定功能。
注意:应尽量避免在测试中隐式等待与显式等待混合使用来处理同步问题。
WebDriver元素等待机制的更多相关文章
- Python+Selenium笔记(十):元素等待机制
(一) 前言 突然的资源受限或网络延迟,可能导致找不到目标元素,这时测试报告会显示测试失败.这时需要一种延时机制,来使脚本的运行速度与程序的响应速度相匹配,WebDriver为这种情况提供了隐式等待 ...
- Selenium with Python 008 - WebDriver 元素等待
如今大多数Web应用程序使用Ajax技术,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成的,这给元素的定位增加了困难.如果因为在加载某个元素时延迟而造成ElementNotVisibleE ...
- selenium webdriver——设置元素等待
如今大多数Web应用程序使用ajax技术,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给定位元素的定位增加了困难, 如果因为在加载某个元素时延迟而造成ElementNotVisibl ...
- WebDriver API——延时操作及元素等待
在自动化测试过程当中,受网络.测试设备等诸多因素的影响,我们经常需要在自动化测试脚本中添加一些延时来更好的定位元素来进行一系列的操作. 一般有这么几种方式: 1.implicitlyWait.识别对象 ...
- selenium等待机制
等待机制 因为你要查找的标签由于网速等原因迟迟没有加载出来,你就直接获取这个标签,很明显是报错,现有的简单粗暴的解决办法就是time.sleep(3),睡几秒,也就是设置线程等待,等这个标签加载出 ...
- selenium WebDriverWait类等待机制的实现
在自动化测试脚本的运行过程中,可以通过设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三种: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法 ...
- selenium webdriver python 等待
AJAX,即“Asynchronous Javascript And XML”.可以实现网页的异步更新.也就是在不重新加载整个网页的情况下,对网页的某部分进行更新. 现在大多数网站都使用AJAX技术 ...
- 【亲测显式等待】Selenium:元素等待的4种方法
Selenium:元素等待的4种方法 1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用. 2.隐式等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉We ...
- Macaca 等待机制
看代码注释todo 写博客 服务写脚本开吧 , 因为窗口太多, 不知道要去哪关闭服务 开的话无所谓 , 哪里都能开 要确认是否有开 , 直接跑代码 下面的要先过 别人的环境 工具软件自己的问题 不支 ...
随机推荐
- UNIX网络编程——Socket通信原理和实践
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠so ...
- Java基础----Java---集合框架---泛型、泛型方法、静态方法泛型、泛型接口、泛型限定、泛型类
泛型:jdk1.5后的新特性,用于解决安全问题,是一个安全机制. 好处: 1.将运行时的异常出现问题classcastException.转移到了编译时期.方便程序员调试解决问题,让运行事情问题减少, ...
- SpringMVC系列之(一) 入门实例
Spring MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了.Spring MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也 ...
- Cookie 进阶
Cookie作为一个客户端技术被广泛的应用着.我今天也来谈一谈我对Cookie的理解. 先来一个小菜(实现"上次登录时间") 具体的思路如下: 通过request.getCooki ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- AR ...
- Android官方命令深入分析之bmgr
作者:宋志辉 bmgr是一个可以跟Backup Manager进行交互的shell工具,要使用这个工具,Android设备API最小为8.它提供了备份和恢复操作的命令,所以你无需频繁的清除数据.这些命 ...
- 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上
博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813 本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 A ...
- Android的加速度传感器模拟摇一摇的效果-android学习之旅(66)
主要介绍一下android的加速传感器的简单用法,模拟摇一摇 ,如果x,y,z三个方向的加速度超过了15,就会弹出Toast,当然你可以设置更复杂的策略,比如判断间隔 代码如下 public clas ...
- 分布式进阶(二)Ubuntu 14.04下安装Dockr图文教程(二)
4.1 构建我们自己的映像 构建Docker映像有两种方法: •通过docker commit(提交)命令 •通过docker build(构建)命令以及Docker文件(Dockerfile) 目前 ...
- pig读取部分列 (全部列中的少部分列)
pig流式数据,load数据时,不能读入任意列. 但是,可以从头读,只能连续几列.就是前几列.比如10列数据,可以只读前3列.但不能读第3列: 如:数据testdata [wizad@sr104 lm ...