自动化测试中,三种常用的等待方式,强制式(sleep) 、 隐式 ( implicitly_wait ) 、显式(expected_conditions)
在自动化测试总,主要有三种常用的等待方式,强制式(sleep) 、 隐式 ( implicitly_wait ) 、显式(expected_conditions)。
一、强制式(sleep)
sleep()是线程类(Thread)的方法,直接强制等待设置的秒数,静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”,当睡眠时间到期,则返回到可运行状态。
缺点:由于web加载的速度取决于测试的硬件、网速、服务器的响应时间等因素。如果时间设置太长,容易造成时间浪费,如果设置太短又可能会造成在web还没有加载完所需要定位的element,而出现报错。由于等待时间无法确定,使用太多的sleep会影响运行速度,大大地降低效率。
例: web完整加载需要 6秒,如果设置 sleep(10) ,就浪费了4秒。
二、隐式 ( implicitly_wait )
implicitly_wait() 是Object类的方法,设置超时时间,它的作用的全局的,也就是在一个脚本中只需要使用一次,作用范围是针对整个webdriver对象实例。在每次进行 find_element时起作用,implicitly_wait()会将一个超时的时间阀值传递给 WebDriver,在findelement或者findelements的时候,首先去找 web element,如果没有找到,判断时间否超超过 implicitlyWait()传递进来的阀值,如果没有超过,则再次找这个element,直到找到 element 或者时间超过最大阀值。
缺点:当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM(Document Object Model)中找到element,将继续等待,超出设定时间后则抛出找不到element的异常。那就是当查找element或element并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0,一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式等待会让一个正常响应的应用的测试变慢,它将会在寻找每个element的时候都进行等待,这样会增加整个测试执行的时间。
总的来说,相对 sleep()来说,即使在不确定web完整加载的时间情况下,虽然只要web加载完成就可以操作下一步的代码,或许可以节省部分的时间,但当页面某些 js无法加载,但是想找的element已经出来了,它还是会继续等待,直到页面加载完成(浏览器标签左上角圈圈不再转),才会执行下一步,这样也会影响运行速度。
例: 同样web完整加载需要 6秒,假设所需的element在最后才出现,如果设置 implicitly_wait (10) ,6秒后就运行下一步代码,相比 sleep(10) 就节省了4秒。
但如果由于web 的部分 js 加载比较慢,如果所需的 element 已经在第2秒出现了,但由于 web 如果还没完成完整加载,在等待完整加载后(那就是6秒后),这样就浪费了4秒的时间。
三、显式(expected_conditions)
显式等待能自定义等待条件,只要满足等待条件即可执行下一步代码操作,一般需要配合该类的until()和until_not()方法一起用,表示程序每隔一定时间就检查一遍条件是否成立,如果成立了就执行下一步,否则就继续等。直到超过设置的最长时间,然后抛出超时错误TimeoutException,以下介绍几个最常用的方法。
1. presence_of_element_located(locator) 判断某个element是否被加到了 dom 树里,并不代表该element一定可见
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Bytarget = EC.presence_of_element_located(By.ID,'user')
2.visibility_of_element_located(locator) 判断element是否可见(可见代表element非隐藏,并且element宽和高都不等于 0)
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Bytarget = EC.visibility_of_element_located(By.ID,'user')
3. element_to_be_clickable(locator) 判断某个element中是否可见并且可点击
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Bytarget = EC.element_to_be_clickable(By.CSS_SELECTOR, '.form-users-search')
4. element_to_be_selected(element) 判断某个element是否被选中了,一般用在下拉列表
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Byelement = driver.find_element_by_class_name('selector')
EC.element_to_be_selected(element)
5. invisibility_of_element_located (locator) 判断某个element中是否不存在于dom树或不可见。 可见的element返回False,不存在的element见返回True;隐藏的element返回WebElement
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Bylocator = (By.ID, 'button')
target = EC.invisibility_of_element_located(locator)
四、WebDriverWait 与 expected_conditions结合使用
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWaittarget = WebDriverWait(driver,5,1).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR,"div[id='wrapper_wrapper']>div[id='container']>div[id='content_left']"">div[class='result-op c-container new-pmd']"">h3[class='t c-gap-bottom-small']>a")))target.click()
其中 WebDriverWait(driver,5,1) 的 5表示 最长超时时间,默认以秒为单位; 1表示检测的间隔步长,在等待期间,每隔一定时间(默认0.5秒),调用until或until_not里的方法,直到它返回True或False.
自动化测试中,三种常用的等待方式,强制式(sleep) 、 隐式 ( implicitly_wait ) 、显式(expected_conditions)相关推荐
- 如何在 C# 中使用隐式和显式操作符
C# 有一个鲜为人知的特性是通过定义 显式和隐式操作符 实现类型之间的转换,这篇文章我们将会讨论如何使用这些 显式 和 隐式 操作符. 什么是显式,什么是隐式 隐式类型转换 它是运行时自动帮你完成的, ...
- 直播预告 | 斯坦福助理教授马腾宇:深度学习中的隐式和显式正则化
人工智能作为科技领域最具代表性的技术,日益成为国际竞争的新焦点.当下,我国正逐步开展全民智能教育普及,设置人工智能相关课程,致力于建设人工智能的人才高地. 在此背景下,中关村海华信息技术前沿研究院立足 ...
- 【转】-【Python】- 【selenium】 -selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())
-- 学习Python自动化测试的菜鸡,现在是selenium库webdriver的学习时间 [问题] 在获取页面元素的文本的时候,总是获取不到,或者显示为空: [分析] 页面加载不完全: [解决措施 ...
- selenium中的三种等待方式以及显示等待和隐式等待区别
selenium的三种等待方式 selenium中一般分为三种等待方式:显示等待.隐式等待.sleep强制等待 1.显示等待(有条件) 程序提前指定等待条件和等待时间,在查找元素时,判断规定时间内是否 ...
- Selenium中的三种等待方式
在写ui自动化的脚本过程中,如果没有加入等待方式,网络不好的时候通常页面元素没有加载出来,脚本就执行操作定位了,很容易找不到元素,这时候,脚本就会出现异常,还有一种页面是异步加载的,也需要用到等待方式 ...
- 【转】【翻译】实体框架中的POCO支持 - 第二部分 - 复杂类型,延迟装载和显式装载...
[原文地址]POCO in the Entity Framework : Part 2 – Complex Types, Deferred Loading and Explicit Loading [ ...
- CAE 分析中 隐式和显式时间积分算法的python程序实现
前两天,同事研究Dyna的显/隐式时间积分的差异和基本原理.想来自己也有三.四年没做这方面的编程了,对同事问的一些问题也一时犯迷瞪,索性就又看了一遍书,网上找了些资料,写了点代码,理了理思路,以备不时 ...
- selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())---基于python...
前一篇文章我们知道了,如何去封装几个简单的Selenium方法到我们自定义的类,这次我们编写一个类,叫浏览器引擎类,通过更改一个字符串的值,利用if语句去判断和控制启动那个浏览器.这里我们暂时,支持三 ...
- java为什么复制数组会减一_如果从数组中复制了Java,为什么Java需要对最终变量进行显式强制转换?...
从以下代码开始- byte foo = 1; byte fooFoo = foo + foo; 当我尝试编译此代码时,会得到以下错误- Error:(5, 27) java: incompatible ...
最新文章
- S5PV210开发 -- 烧写/启动模式
- 2.1 CPU 上下文切换(上)
- 关于MyEclipse对Struts2配置文件较检异常 Invalid result location value/parameter
- 第5讲++创建管理数据库
- 什么是激光雷达技术?
- 一位 90 后程序员的自述:如何从年薪 3W 到 30W
- grafana中国地图插件
- 修改数据文件和日志文件路径
- 2019中国五大新兴制造业迁徙路径及产业发展趋势全景
- uRPF Unicast Reverse Path Forwarding
- 30首唐诗,道尽人生苦乐
- 滴滴 iOS 动态化方案 DynamicCocoa 的诞生与起航
- 我是怎么画架构图的?
- 移动端ui设计,移动端界面
- 基于STC98C52RD+的51MCU学习流水账--->串口通讯学习(汇编版)
- windows无法格式化u盘_2019 SD卡、U盘无法格式化怎么办的解决方法
- 微软首席建筑师 查尔斯—西蒙尼
- docker管理mysql风险_不要再问了,数据库不建议上Docker
- java面试题成都_成都汇智动力-java面试——多线程面试题
- WIN10+VS2015+PCL1.8.1的配置