能否构建健壮和可靠的测试是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 webdriverclass BaiduSearchTest(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()self.driver.implicitly_wait(30)   #set implicit wait time 30sself.driver.maximize_window()#open the baidu pageself.driver.get('https://www.baidu.com')def test_search_python(self):#get the search textboxsearch_textbox = self.driver.find_element_by_id('kw')search_textbox.clear()#enter search keywordsearch_textbox.send_keys("python")#get the and seacrh button and clicksearch_button = self.driver.find_element_by_id('su')search_button.click()#add asserttag = self.driver.find_element_by_link_text("PyPI").text        self.assertEqual('PyPI',tag)def tearDown(self):#close the browser windowself.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_conditionsclass 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类也提供了强大的自定义预期等待判定功能。

  注意:应尽量避免在测试中隐式等待与显式等待混合使用来处理同步问题。

  关于更多等待机制信息可以参考:https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.wait.html#module-selenium.webdriver.support.wait

WebDriver元素等待机制相关推荐

  1. selenium WebDriverWait类等待机制的实现

    在自动化测试脚本的运行过程中,可以通过设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三种: 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语 ...

  2. Selenium自动化测试-设置元素等待

    ------·今天距2020年54天·------ 这是ITester软件测试小栈第75次推文 selenium中有三种时间等待: 强制等待:sleep 隐式等待:implicitly_wait 显示 ...

  3. Selenium等待机制之显示等待

    显示等待需要用到两个类:WebDriverWait 和 expected_conditions两个类 WebDriverWait:指定轮询间隔.超时时间等 expected_conditions:指定 ...

  4. 断言信息与元素等待_Sinno_Song_新浪博客

    断言信息:获取title .URL和text等信息进行断言. title:用于获得当前页面的标题. current_url:用户获得当前页面的URL. text:获取搜索条目的文本信息. title ...

  5. 【Java】三种等待机制

    [AT]三种等待机制 一. 等待机制种类 二. 三种等待机制应用场景 三.显示等待介绍 3.1 相关概念 3.2 显示等待用到的两个类 3.2.1 WebDriverWait 3.2.2 Expect ...

  6. Appium+python自动化(二十四)- 白素贞千年等一回许仙 - 元素等待(超详解)

    简介 许仙小时候最喜欢吃又甜又软的汤圆了,一次一颗汤圆落入西湖,被一条小白蛇衔走了.十几年后,一位身着白衣.有青衣丫鬟相伴的美丽女子与许仙相识了,她叫白娘子.白娘子聪明又善良,两个人很快走到了一起.靠 ...

  7. python自动化等待时间_python+appium 自动化测试 - 元素等待

    该篇文章主要用于整理的是在执行自动化测试过程中的几种元素等待方法 implicity_wait() sleep() wait_activity() 等待某元素出现后,再执行操作 WebDriverWa ...

  8. selenium元素等待及滚动条滚动

    selenium三大等待,sleep(强制).implicitlyWait(隐式等待).WebDriverWait(显式等待),主要记一下最后面的WebDriverWait. WebDriverWai ...

  9. Selenium - 元素等待与智能等待

    UI层面的自动化的测试,由于网络.电脑配置等因素的不同,导致页面的加载速度不同,因此为了保证测试脚本的稳定性,需要在脚本中添加相应的等待时间. 1. 休眠等待 添加休眠非常简单,只需要引入python ...

最新文章

  1. 为什么阿里强制 boolean 类型变量不能使用 is 开头?
  2. 东师计算机应用基础18秋在线作业3答案,奥鹏东师计算机应用基础15秋在线作业3试卷及答案(4)...
  3. 推荐15个在线多媒体(图片、音频、视频)编辑器
  4. 一个比较完整的Inno Setup 安装脚本
  5. java feign同时传对象和其他参数_关于Spirng Cloud的Feign传参问题:
  6. ecshop商城禁止修改管理员邮箱
  7. pythonrequest得替代_Python爬虫通过替换http request header来欺骗浏览器实现登录功能...
  8. 《第二章:深入了解超文本》
  9. Ubuntu下修改root密码
  10. html元素按压高亮效果
  11. 《5分钟商学院》--读书笔记
  12. Chrome 屏蔽广告
  13. 643. Maximum Average Subarray I*
  14. 五十部电影(4)—和青春有关
  15. unity实现对话控制
  16. windows版 redis安装教程,以及redis客户端安装
  17. 北大青鸟ACCP初学java
  18. 常用spaceclaim脚本(三)
  19. K210图传(用的脸子姐的工具)
  20. 洛达1536u怎么刷固件_华强北洛达1536U三代Pro版AirPods开箱体验

热门文章

  1. OpenGL使用链表进行顺序独立的透明度
  2. C语言实现希尔排序shell sort算法之二(附完整源码)
  3. C语言实现AVL树(附完整源码)
  4. C++ Opengl WaveFlag(飘扬的旗帜)源码
  5. C++对C的函数扩展
  6. C++11 - 返回类型后置
  7. 当代最值得收藏的画家作品_欣赏当代知名画家谭日群——国画人物画书法作品欣赏...
  8. 合并k个有序链表 python_[LeetCode] 23. Merge k Sorted Lists 合并k个有序链表
  9. Apache Ranger、业务背景、现状与需求、大数据安全组件介绍与对别、系统架构及实践、ranger admin、UserSync、plugin、权限模型、权限实现等
  10. fiddler filters 使用(fiddler只显示指定请求,fiddler不显示指定请求,即filter请求过滤)转自:http://blog.csdn.net/notejs/article/