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 写博客 服务写脚本开吧 , 因为窗口太多, 不知道要去哪关闭服务 开的话无所谓 , 哪里都能开 要确认是否有开 , 直接跑代码 下面的要先过 别人的环境 工具软件自己的问题 不支 ...
随机推荐
- 2.6、Android Studio创建可伸缩的图片(9-patch文件)
Draw 9-patch工具是一个所见即所得编辑器,允许你创建可以自动改变大小来适应视图的内容和屏幕的大小. 以下是使用Draw 9-path工具快速创建一个NinePatch图片. 1. 在命令行中 ...
- 05 Android强制设置横屏或竖屏/全屏
全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TIT ...
- J2EE进阶(三)struts2 <s:action>标签的用法
J2EE进阶(三)struts2 <s:action>标签的用法 前言 使用action标签,可以允许在jsp页面中直接调用Action,(类似AJAX页面调用)在调用Action时候,可 ...
- Mysql group by语句的优化
默认情况下,MySQL排序所有GROUP BY col1, col2, ....,查询的方法如同在查询中指定ORDER BY col1, col2, ....如果显式包括一个包含相同的列的ORDER ...
- CentOS下Mariadb表名大小写的问题
今天在linux上跑一个系统 发现数据库报错,说找不到表 问题是,我已经建立了表呀. 我把报错的那个表 复制到命令行 运行一下. 发现是大小写的问题. 那问题就简单了. 网上百度可以知道 打开/etc ...
- 仿iphone快速导航悬浮球
用过iphone的朋友都知道,iPhone有个圆球辅助工具,它漂浮在你的手机屏幕(在任何APP之上),你可以将它移动到任何地方,它叫做AssistiveTouch,本篇模拟该软件实现一个小案例,主要是 ...
- Windows7 x64 跨平台开发环境安装配置
======================================================================= Windows7 x64 跨平台开发环境安装配置 201 ...
- ffplay for mfc 代码备忘
之前上传了一个开源播放器工程ffplay for mfc.它将ffmpeg项目中的ffplay播放器(ffplay.c)移植到了VC的环境下,并且使用MFC做了一套界面.它可以完成一个播放器播放视频的 ...
- javascript之DOM编程通过html元素的标签属性找节点
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ISLR系列:(4.2)模型选择 Ridge Regression & the Lasso
Linear Model Selection and Regularization 此博文是 An Introduction to Statistical Learning with Applicat ...