能否构建健壮和可靠的测试是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类也提供了强大的自定义预期等待判定功能。

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

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

WebDriver元素等待机制的更多相关文章

  1. Python+Selenium笔记(十):元素等待机制

     (一) 前言 突然的资源受限或网络延迟,可能导致找不到目标元素,这时测试报告会显示测试失败.这时需要一种延时机制,来使脚本的运行速度与程序的响应速度相匹配,WebDriver为这种情况提供了隐式等待 ...

  2. Selenium with Python 008 - WebDriver 元素等待

    如今大多数Web应用程序使用Ajax技术,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成的,这给元素的定位增加了困难.如果因为在加载某个元素时延迟而造成ElementNotVisibleE ...

  3. selenium webdriver——设置元素等待

    如今大多数Web应用程序使用ajax技术,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给定位元素的定位增加了困难, 如果因为在加载某个元素时延迟而造成ElementNotVisibl ...

  4. WebDriver API——延时操作及元素等待

    在自动化测试过程当中,受网络.测试设备等诸多因素的影响,我们经常需要在自动化测试脚本中添加一些延时来更好的定位元素来进行一系列的操作. 一般有这么几种方式: 1.implicitlyWait.识别对象 ...

  5. selenium等待机制

    等待机制 ​ 因为你要查找的标签由于网速等原因迟迟没有加载出来,你就直接获取这个标签,很明显是报错,现有的简单粗暴的解决办法就是time.sleep(3),睡几秒,也就是设置线程等待,等这个标签加载出 ...

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

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

  7. selenium webdriver python 等待

    AJAX,即“Asynchronous Javascript And  XML”.可以实现网页的异步更新.也就是在不重新加载整个网页的情况下,对网页的某部分进行更新. 现在大多数网站都使用AJAX技术 ...

  8. 【亲测显式等待】Selenium:元素等待的4种方法

    Selenium:元素等待的4种方法 1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用.   2.隐式等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉We ...

  9. Macaca 等待机制

    看代码注释todo 写博客 服务写脚本开吧 , 因为窗口太多,  不知道要去哪关闭服务 开的话无所谓 , 哪里都能开 要确认是否有开 , 直接跑代码 下面的要先过 别人的环境 工具软件自己的问题 不支 ...

随机推荐

  1. webStorm破解

    B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiw ...

  2. Android View的绘制过程

    首先是view的绘制过程~最主要的分三部分 measure layout draw 看字面意思,计算,布局,画~ android中控件相当于是画在一个无限大的画布上的,那就产生了几个问题 画布无限大, ...

  3. 1026. Table Tennis (30)

    题目如下: A table tennis club has N tables available to the public. The tables are numbered from 1 to N. ...

  4. (NO.00005)iOS实现炸弹人游戏(十):游戏主角(三)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面我们来看游戏主角类里面几个播放特殊动画的方法,首先从run ...

  5. expect 简单使用

    简单的登陆脚本 这样就不用每次都输入ssh命令了,使用密码还是有些不安全,谨慎使用. #!/usr/bin/expect -f #filename: auto_login.sh #author: or ...

  6. 【安卓网络请求开源框架Volley源码解析系列】初识Volley及其基本用法

    在安卓中当涉及到网络请求时,我们通常使用的是HttpUrlConnection与HttpClient这两个类,网络请求一般是比较耗时,因此我们通常会在一个线程中来使用,但是在线程中使用这两个类时就要考 ...

  7. Dynamics CRM 电子邮件服务器配置文件Advanced配置中关闭SSL

    在新建电子邮件服务器配置文件时Advanced中的Use SSL for Incoming/Outgoing Connection默认都是启用的而且无法编辑,启用SSL当然是为了安全的考虑,但当客户的 ...

  8. ProgressBar的indeterminateDrawable属性在安卓6.0上的问题

    通过indeterminateDrawable属性去自定义ProgressBar方法: <ProgressBar android:id="@+id/pb" android:l ...

  9. (八十七)AutoLayout的简介与实例

    AutoLayout是继AutoResizing之后的一种自动布局方法,解决了AutoResizing无法处理控件间相互关系的问题. AutoLayout在storyboard中通过底部工具条设置,底 ...

  10. iOS开发之二:UIWindow与UIView

    1.UIWindow UIWindow 继承自UIView,它是整个应用的容器,一般来说一个应用就只有一个UIWindow. 如果不使用storyboard 时,需要我们自己创建UIWindow.实例 ...