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

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

import time

time.sleep(3)

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

二、 隐式等待(全局)driver.implicitly_wait(20)

隐式等待相比强制等待更智能,顾明思义,在脚本中我们一般看不到等待语句,但是它会在每个页面加载的时候自动等待;隐式等待只需要声明一次,一般在打开浏览器后进行声明。声明之后对整个drvier的生命周期都有效,后面不用重复声明。 implicitly_wait()方法用来等待页面加载完成(直观的就是浏览器tab页上的小圈圈转完),implicitly_wait(10),超时时间10s,10秒内一旦加载完成,就执行下一条语句;如果10秒内页面都没有加载完,就超时抛出异常。

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

隐式等待的运用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()

三、显示等待 WebDriverWait(driver,30,0.1)

显示等待与隐式等待相对,显示等待必须在每个需要等待的元素前面进行声明。是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException

用法例1:
#引入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')))用法例2:
loc = ("xpath", "//*[@text='允许']")
e = WebDriverWait(driver, 1, 0.5).until(EC.presence_of_element_located(loc))
e.click()

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

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

presence_of_element_located 判断某个元素是否被加到了DOM树里,并不代表该元素一定可见

visibility_of_element_located判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0

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

#设置等待

wait = WebDriverWait(driver,10,0.5)

#使用匿名函数

wait.until(lambda diver:driver.find_element_by_id('kw'))

Appium+PythonUI自动化之webdriver 的三种等待方式(强制等待、隐式等待、显示等待)相关推荐

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

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

  2. grub安装的 三种安装方式

    1. 引言 grub是什么?最常态的理解,grub是一个bootloader或者是一个bootmanager,通过grub可以引导种类丰富的系统,如linux.freebsd.windows等.但一旦 ...

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

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

  4. Hive metastore三种配置方式

    Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适合生产环境.Hive官方wiki详细介绍了这三种方式,链接为:Hive Metastore. 一.本地d ...

  5. python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)

    树的实现采用queue的形式: 树的三种遍历方式(广度优先白能力法):先序遍历(根左右),中序遍历(左根右)以及后序遍历(左右根) ######################P6.4 数据结构### ...

  6. FPGA之道(41)HDL的三种描述方式

    文章目录 前言 三种描述方式 结构化描述方式 数据流描述方式 行为级描述方式 前言 常编写Verilog代码的就会知道,我们对于某一功能的描述,可以通过门电路来描述,也可以直接描述其功能等,这就牵扯到 ...

  7. 【 Verilog HDL 】HDL的三种描述方式

    当我们使用HDL代码描述硬件功能的时候,主要有三种基本描述方式,即结构化描述方式.数据流描述方式和行为级描述方式.通过本次总结,我们将明白到底我们描述的电路是什么方式描述的. 结构化描述方式 结构化描 ...

  8. oracle if=,oracle中if/else的三种实现方式详解

    1.标准sql规范 1.单个IF IF v=... THEN END IF; 2.IF ... ELSE IF v=... THEN ELSE t....; END IF; 3.多个IF IF v=. ...

  9. oracle Hash Join及三种连接方式

    在Oracle中,确定连接操作类型是执行计划生成的重要方面.各种连接操作类型代表着不同的连接操作算法,不同的连接操作类型也适应于不同的数据量和数据分布情况. 无论是Nest Loop Join(嵌套循 ...

最新文章

  1. 杂谈人工智能说大数据
  2. 物理化学 焓变的计算和相变焓
  3. HashMap与HashTable联系与区别
  4. JDK中这些常用方法也有Bug
  5. 送30块树莓派PICO 开发板!
  6. Sklearn 损失函数如何应用到_机器学习大牛最常用的5个回归损失函数,你知道几个?...
  7. nuc972的ramfs的配置yaffs2,ubi文件系统
  8. java获取字符串第一位_Java程序员经典面试题集大全 (十一)
  9. 7 FI配置-财务会计-定义字段状态变式(总账科目组)
  10. 关系数据库查看器应用程序-ASP.NET Core
  11. zabbix系列(八)zabbix添加对web页面url的状态监控
  12. 【分享】电子科大第一位以第一作者在CVPR上发文的本科生,这个小哥哥用奋斗诠释优秀!...
  13. Java:高级类特性
  14. 小米手机怎么设置鸿蒙开机动画,小米9开机动画太酷炫了!还不知道怎么设置赶紧来看看!...
  15. MySql常见数据类型及五大约束
  16. phpstudy的安装教程
  17. Int相乘为负数问题
  18. 小程序开发:调用百度文字识别接口实现图文识别,Node.js开发
  19. 算法总结 — 并查集
  20. 【深圳VS台湾】真正的无人驾驶还要等75年?在台湾已运行大半年(附台湾和深圳无人驾驶公交对比表)...

热门文章

  1. linux 远程拒绝服务,Linux Kernel SCTP远程拒绝服务漏洞
  2. php 三个点 三角形面积,知道三角形三个顶点坐标,求面积,我觉得我的没错,但未通过,麻烦大佬帮忙看下...
  3. Android日志[基础篇]二 Android Studio修改LogCat日志的颜色
  4. 构造函数和实例化原理
  5. iso图像测试卡_4700万像素 五轴防抖 徕卡正式发布SL2无反相机
  6. MySQL 基础 ———— 存储过程与函数
  7. css grid布局增加边框,CSS Grid中每行之后的边框
  8. 单片机按键控制数码管c语言程序,基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文).doc...
  9. (stl排序+检索)大理石在哪
  10. eq值 推荐算法_C++实现十种排序算法