在自动化测试脚本的运行过程中,webdriver操作浏览器的时候,对于元素的定位是有一定的超时时间,大致应该在1-3秒的样子,如果这个时间内仍然定位不到元素,就会抛出异常,中止脚本执行。我们可以通过在脚本中设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三种:

一、强制等待

强制等待是利用python语言自带的time库中的sleep()方法:

from time import sleep
sleep(10)

sleep()顾明思义就是睡觉的意思,就是脚本一旦执行到这条语句sleep(10)就睡10s,再执行后面的语句,他是一个强制等待的方式,使得整个脚本暂停。但是这种方式会导致这个脚本运行时间过长,不到万不得已尽可能少用,特殊情况下,时间设置最好不超过1秒,一般0.5秒。

二、隐式等待

隐式等待相比强制等待更智能,顾明思义,在脚本中我们一般看不到等待语句,但是它会在每个页面加载的时候自动等待;隐式等待只需要声明一次,一般在打开浏览器后进行声明。声明之后对整个drvier的生命周期都有效,后面不用重复声明。

driver = webdriver.Chrome()
driver.implicitly_wait(10)

implicitly_wait()方法用来等待页面加载完成(直观的就是浏览器tab页上的小圈圈转完),implicitly_wait(10),超时时间10s,10秒内一旦加载完成,就执行下一条语句;如果10秒内页面都没有加载完,就超时抛出异常。隐式等待在自动化测试中的运用,看代码:

from selenium import webdriver
import unittestclass TestBase(unittest.TestCase):def setUp(self):self.driver=webdriver.Chrome()   #驱动浏览器self.driver.implicitly_wait(10)  #设置隐式等待self.driver.maximize_window()    #最大化浏览器def test(self):print('这是一个测试用例')def tearDown(self):self.driver.quit()if __name__=='__main__':unittest.main()

但是隐式等待依然存在一个问题,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步。所以,这里webdriver提供了一种更加智能的等待方式:显示等待

三、显示等待

显示等待与隐式等待相对,显示等待必须在每个需要等待的元素前面进行声明。

#引入WebDriverWait
from selenium.webdriver.support.ui import WebDriverWait
#引入expected_conditions类,并重命名为EC
from selenium.webdriver.support expected_conditions as EC
#引入By类
from selenium.webdriver.common.by import By#设置等待
wait = WebDriverWait(driver,10,0.5)
wait.until(EC.presence_of_element_located((By.ID,'KW')))

显示等待需要用到两个类:

WebDriverWait和expected_conditions两个类。

1、WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver:浏览器驱动

timeout:最长超时时间,默认以秒为单位

poll_frequency:检测的间隔步长,默认为0.5s

ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

WebDriverWait()中的until()和until_not()方法:

until

method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常

until_not

与until相反,until是当某元素出现或什么条件成立则继续执行,
 until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。

2、expected_conditions类

各种类,达到某种条件,返回True和False

常用条件:

关于显示等待,也可以自己写条件:

#设置等待
wait = WebDriverWait(driver,10,0.5)
#使用匿名函数
wait.until(lambda diver:driver.find_element_by_id('kw'))

显示等待是一种智能程度较高的等待方式,可以有效的增强脚本的健壮性,以下条件适用:

  • 当打开一个新页面,执行第一个元素操作的时候
  • 当某一步操作会引发页面的加载,并且加载的内容包含了下一步需要操作的元素。一句话,就是当某个元素有加载过程的时候,就需要加上显示等待。

webdriver 的三种等待方式(强制等待,隐式等待,显示等待)相关推荐

  1. CSS的三种链接方式(内联式、嵌入式、外部式)

    内联式CSS样式 其实就是用html中style属性 <p style="color:blue">示例</p> 嵌入式CSS样式 嵌入式css样式,就是可以 ...

  2. 【App自动化测试】(八)三种等待方式——强制等待、隐式等待、显示等待

    目录 1. 为什么要添加等待? 2. 三种等待方式 3. 强制(直接)等待 4. 隐式等待 4.1 隐式等待说明 4.2 隐式等待无法解决的问题 5. 显式等待 5.1 为什么要使用显示等待机制? 5 ...

  3. Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

    阅读目录 一.MVC与MTV 二.多对多表的创建 三.ajax,前后端传输编码格式contentType 四.批量插入数据与自定义分页器 摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端 ...

  4. memcached 分布式锁 java_分布式锁的三种实现方式

    分布式锁的三种实现方式 一.zookeeper 1.实现原理: 基于zookeeper瞬时有序节点实现的分布式锁,其主要逻辑如下(该图来自于IBM网站).大致思想即为:每个客户端对某个功能加锁时,在z ...

  5. vue.js三种安装方式

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...

  6. Verilog HDL三种描述方式

    一.数据流建模方式 在组合逻辑电路中,数据不会存储,因此输入信号经过电路变为输出信号类似于数据流动.可以通过连续赋值语句这种特性进行建模,这种建模方式通常被称为数据流建模. 连续赋值语句只能用来对连线 ...

  7. xml的三种解析方式

    本篇博客重点介绍Android中三种解析XML的方式,包括PULL.SAX.DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧.再顺便介绍一下Androi ...

  8. 数据传输的三种交换方式

    电路交换,报文交换,分组交换 首先我们来看看三种交换方式的示意图 对照上面的图,给出三种交换方式在数据传输阶段的主要特点: 电路交换:整个报文的比特流连续的从源点直达终点,好像在一个管道中传送. 报文 ...

  9. 计算机网络基础三种交换,数据传输的三种交换方式

    电路交换,报文交换,分组交换 首先我们来看看三种交换方式的示意图 对照上面的图,给出三种交换方式在数据传输阶段的主要特点: 电路交换:整个报文的比特流连续的从源点直达终点,好像在一个管道中传送. 报文 ...

  10. KALI的三种安装方式

    前言 在本文中,我将详细的讲述kali的三种实现方式的优缺点(虚拟机.便携式存储介质.物理机),以及安装方式,文中所使用的工具和镜像链接也会放在开头. 链接 kali镜像包下载地址: Get Kali ...

最新文章

  1. 获取DataTable前几条数据
  2. pythonis啥意思-Python基础:is和==的区别
  3. unity 继承了 获取_获取继承链
  4. osg中实现HUDAxis功能
  5. mvc filter 的用法
  6. eclipse项目一直显示有错,但是一直找不到错误在哪里
  7. 攻防世界 适合做桌面_网络安全工程师教你:如何使用Kali Linux进行渗透测试与攻防实战...
  8. 十五天数据分析-笔记
  9. 使用Notepad3替代Notepad++
  10. 产品介绍丨世炬5G一体化基站
  11. Python 爬虫 scrapy 反 反爬虫策略
  12. 利用echarts做堆积折线图
  13. 可验证随机函数(Verifiable Random Function, VRF)
  14. 科技云报道:服务数字中国,青云十周年迎来“成年礼”
  15. 【Scratch】青少年蓝桥杯_每日一题_6.25_加密
  16. Mybatis 学习笔记
  17. Linux Load Averages: Solving the Mystery
  18. 基础篇章:React Native之 ScrollView 的讲解
  19. CANON佳能I6100故障错误代码和清零方法
  20. 大话算法 -- 粒子群算法

热门文章

  1. 只需要一点点C++基础,新手也可以制作单机游戏内存修改器
  2. c语言数组求欧几里得距离,如何计算由包含x,y的矩阵定义的两点之间的欧几里得距离?...
  3. android 获取properties文件路径,读取local.properties文件
  4. 计算机辅助制造实验二,计算机辅助制造上机实验报告..doc
  5. 安装《中国大学MOOC》的包
  6. Cisco学习一:安装GNS3模拟器
  7. linux查看cpu的负载
  8. Android删除手机文件,联系人,通话记录
  9. js点一个不行时,点两个:
  10. iptable 理解