在自动化测试总,主要有三种常用的等待方式,强制式(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)相关推荐

  1. 如何在 C# 中使用隐式和显式操作符

    C# 有一个鲜为人知的特性是通过定义 显式和隐式操作符 实现类型之间的转换,这篇文章我们将会讨论如何使用这些 显式 和 隐式 操作符. 什么是显式,什么是隐式 隐式类型转换 它是运行时自动帮你完成的, ...

  2. 直播预告 | 斯坦福助理教授马腾宇:深度学习中的隐式和显式正则化

    人工智能作为科技领域最具代表性的技术,日益成为国际竞争的新焦点.当下,我国正逐步开展全民智能教育普及,设置人工智能相关课程,致力于建设人工智能的人才高地. 在此背景下,中关村海华信息技术前沿研究院立足 ...

  3. 【转】-【Python】- 【selenium】 -selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())

    -- 学习Python自动化测试的菜鸡,现在是selenium库webdriver的学习时间 [问题] 在获取页面元素的文本的时候,总是获取不到,或者显示为空: [分析] 页面加载不完全: [解决措施 ...

  4. selenium中的三种等待方式以及显示等待和隐式等待区别

    selenium的三种等待方式 selenium中一般分为三种等待方式:显示等待.隐式等待.sleep强制等待 1.显示等待(有条件) 程序提前指定等待条件和等待时间,在查找元素时,判断规定时间内是否 ...

  5. Selenium中的三种等待方式

    在写ui自动化的脚本过程中,如果没有加入等待方式,网络不好的时候通常页面元素没有加载出来,脚本就执行操作定位了,很容易找不到元素,这时候,脚本就会出现异常,还有一种页面是异步加载的,也需要用到等待方式 ...

  6. 【转】【翻译】实体框架中的POCO支持 - 第二部分 - 复杂类型,延迟装载和显式装载...

    [原文地址]POCO in the Entity Framework : Part 2 – Complex Types, Deferred Loading and Explicit Loading [ ...

  7. CAE 分析中 隐式和显式时间积分算法的python程序实现

    前两天,同事研究Dyna的显/隐式时间积分的差异和基本原理.想来自己也有三.四年没做这方面的编程了,对同事问的一些问题也一时犯迷瞪,索性就又看了一遍书,网上找了些资料,写了点代码,理了理思路,以备不时 ...

  8. selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())---基于python...

    前一篇文章我们知道了,如何去封装几个简单的Selenium方法到我们自定义的类,这次我们编写一个类,叫浏览器引擎类,通过更改一个字符串的值,利用if语句去判断和控制启动那个浏览器.这里我们暂时,支持三 ...

  9. java为什么复制数组会减一_如果从数组中复制了Java,为什么Java需要对最终变量进行显式强制转换?...

    从以下代码开始- byte foo = 1; byte fooFoo = foo + foo; 当我尝试编译此代码时,会得到以下错误- Error:(5, 27) java: incompatible ...

最新文章

  1. S5PV210开发 -- 烧写/启动模式
  2. 2.1 CPU 上下文切换(上)
  3. 关于MyEclipse对Struts2配置文件较检异常 Invalid result location value/parameter
  4. 第5讲++创建管理数据库
  5. 什么是激光雷达技术?
  6. 一位 90 后程序员的自述:如何从年薪 3W 到 30W
  7. grafana中国地图插件
  8. 修改数据文件和日志文件路径
  9. 2019中国五大新兴制造业迁徙路径及产业发展趋势全景
  10. uRPF Unicast Reverse Path Forwarding
  11. 30首唐诗,道尽人生苦乐
  12. 滴滴 iOS 动态化方案 DynamicCocoa 的诞生与起航
  13. 我是怎么画架构图的?
  14. 移动端ui设计,移动端界面
  15. 基于STC98C52RD+的51MCU学习流水账--->串口通讯学习(汇编版)
  16. windows无法格式化u盘_2019 SD卡、U盘无法格式化怎么办的解决方法
  17. 微软首席建筑师 查尔斯—西蒙尼
  18. docker管理mysql风险_不要再问了,数据库不建议上Docker
  19. java面试题成都_成都汇智动力-java面试——多线程面试题
  20. WIN10+VS2015+PCL1.8.1的配置

热门文章

  1. java程序变成exe可执行文件
  2. 刘赖简介——同泰国医馆专家介绍
  3. 我的阿里Offer之路(一):不忘初心,重拾Java
  4. 查询每个快递物流状态,并给部分单号标色
  5. ChatGPT神奇应用:无需美术功底快速生成高清艺术插图
  6. 基于Python实现的手机基站信息经济分析系统 课程报告+源码及数据
  7. CSS移动端适配方案
  8. 趣味题:求两个日期之间的相隔天数
  9. 最小二乘法与伪逆矩阵
  10. Qt之实现360安全卫士主界面(转)