selenium WebDriverWait类等待机制的实现


Posted in Python onMarch 18, 2020

在自动化测试脚本的运行过程中,可以通过设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三种:

一、固定等待(time)

  固定待是利用python语言自带的time库中的sleep()方法,固定等待几秒。这种方式会导致这个脚本运行时间过长,不到万不得已尽可能少用。(注:脚本调试过程时,还是可以使用的,方便快捷)

from selenium import webdriver
import time

#驱动浏览器
driver = webdriver.Chrome()

#设置窗口最大化
driver.maximize_window()
driver.get('https://www.baidu.com/')

#设置固定等待
time.sleep(2)

driver.quit()

二、隐式等待(implicitly_wait())

 webdriver类提供了implicitly_wait()方法来配置超时时间。隐式等待表示在自动化实施过程中,为查找页面元素或者执行命令设置一个最长等待时间。如果在规定时间内页面元素被找到或者命令被执行完成,则执行下一步,否则继续等待直到设置的最长等待时间截止

from selenium import webdriver

#驱动浏览器
driver = webdriver.Chrome()

#设置隐式等待
driver.implicitly_wait(30)

#设置窗口最大化
driver.maximize_window()
driver.get('https://www.baidu.com/')

   注:隐式等待的好处是不用像固定等待方法一样死等时间N秒,可以在一定程度上提升测试用例的执行效率。不过这种方法也存在一定的弊端,那就是程序会一直等待整个页面加载完成,也就是说浏览器窗口标签栏中不再出现转动的小圆圈,才会继续执行下一步。

三、显式等待(WebDriverWait)

  显示等待会每个一段时间(该时间一般都很短,默认为0.5秒,也可以自定义),执行自定义的程序判断条件,如果判断条件成立,就执行下一步,否则继续等待,直到超过设定的最长等待时间,然后抛出TimeOutEcpection的异常信息。

alert_is_present():判断页面是否出现alert框

# coding:utf-8
from selenium import webdriver
#导入By类
from selenium.webdriver.common.by import By
#导入显示等待类
from selenium.webdriver.support.ui import WebDriverWait
#导入期望场景类
from selenium.webdriver.support import expected_conditions

driver = webdriver.Chrome()

#alert_is_present():判断页面是否出现alert框
result=WebDriverWait(driver,10).until(expected_conditions.alert_is_present())
print(result.text)

element_located_selection_state_to_be(locator,state):判断一个元素的状态是否是给定的选择状态

第一个传入参数是一个定位器,定位器是一个元组(by,path);第二个传入参数表示期望的元素状态,True表示选中状态,Flase表示未选中

#element_located_selection_state_to_be():判断一个元素的状态是否是给定的选择状态
result=WebDriverWait(driver,10).until(expected_conditions.element_located_selection_state_to_be((By.ID,'kw'),True))

element_selection_state_to_be(driverObject,state):判断给定的元素是否被选中

第一个传入参数是一个webdriver对象,第二个参数是期望的元素的状态,True表示选中状态,Flase表示未选中

#element_selection_state_to_be():判断给定的元素是否被选中
result=WebDriverWait(driver,10).until(expected_conditions.element_selection_state_to_be((driver.find_element_by_id('kw')),True))

element_located_to_be_selected(locator):期望某个元素处于被选中状态

参数传入的是一个定位器

#element_located_to_be_selected():期望某个元素处于被选中状态
result=WebDriverWait(driver,10).until(expected_conditions.element_located_to_be_selected((By.ID,'kw')))

element_to_be_selected():期望某个元素处于选中状态

传入参数是一个webdriver实例对象

#element_to_be_selected():期望某个元素处于选中状态
result=WebDriverWait(driver,10).until(expected_conditions.element_to_be_selected(driver.find_element_by_id('kw')))

element_to_be_clickable():判断元素是否可见并且能被单击,条件满足返回页面元素对象,否则返回Flase

#element_to_be_clickable():判断元素是否可见并且能被单击,条件满足返回页面元素对象,否则返回Flase
result=WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable(driver.find_element_by_id('hh')))

frame_to_be_available_and_switch_to_it(parm):判断frame是否可用

如果可用返回True并切入到该frame,参数parm可以是定位器locator(by,path)组成的元组,或者定位方式:id、name、index(frame在页面上索引号),或者webelement对象。

#frame_to_be_available_and_switch_to_it():判断frame是否可用
#传入ID值‘kk'
result1=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(By.ID,'kw'))
#传入frame的webelement对象
result2=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_id('kw')))
#传入frame在页面中索引号
result3=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(1))

invisibility_of_element_located(locator):希望某个元素不可见或者不存在DOM中

满足条件返回True,否则返回定位到的元素对象

#invisibility_of_element_located():希望某个元素不可见或者不存在DOM中,满足条件返回True,否则返回定位到的元素对象
result8=WebDriverWait(driver,10,0.2).until(EC.invisibility_of_element_located(By.ID,'kw'))

visibility_of_element_located(locator):希望某个元素出现在DOM中并且可见

满足条件返回该元素的页面元素对象

#visibility_of_element_located():希望某个元素出现在DOM中并且可见,满足条件返回该元素的页面元素对象
result9=WebDriverWait(driver,10,0.2).until(EC.visibility_of_element_located(driver.find_element_by_id('kw')))

visibility_of(webelement):希望某个元素出现在页面的DOM中,并且可见,满足条件返回该元素的页面元素对象

#visibility_of():希望某个元素出现在页面的DOM中,并且可见,满足条件返回该元素的页面元素对象
result10=WebDriverWait(driver,10,0.2).until(EC.visibility_of(driver.find_element_by_id('kw'))

visibility_of_any_elements_located(locator):希望某个元素出现在DOM中并且可见

如果满足条件返回该元素的页面元素对象

#visibility_of_any_elements_located():希望某个元素出现在DOM中并且可见
result11=WebDriverWait(driver,10,0.2).until(EC.visibility_of(By.TAG_NAME,'input'))

presence_of_all_elements_located(locator):判断页面至少有一个如果元素出现,如果满足条件,返回所有满足定位表达式的页面元素

#presence_of_all_elements_located():判断页面至少有一个如果元素出现,如果满足条件,返回所有满足定位表达式的压面元素
result12=WebDriverWait(driver,10,0.2).until(EC.presence_of_all_elements_located(By.ID,'kw'))

presence_of_element_located(locator):判断某个元素是否存在DOM中,不一定可见,存在返回该元素对象

#presence_of_element_located():判断某个元素是否存在DOM中,不一定可见,存在返回该元素对象
result12=WebDriverWait(driver,10,0.2).until(EC.presence_of_element_located(By.ID,'kw'))

staleness_of(webelement):判断一个元素是否仍在DOM中,如果在规定时间内已经移除返回True,否则返回Flase

#staleness_of():判断一个元素是否仍在DOM中,如果在规定时间内已经移除返回True,否则返回Flase
result13=WebDriverWait(driver,10,0.2).until(EC.staleness_of(driver.find_element_by_id('kw')))

text_to_be_present_in_element():判断文本内容test是否出现在某个元素中,判断的是元素的text

#text_to_be_present_in_element():判断文本内容test是否出现在某个元素中,判断的是元素的text
result15=WebDriverWait(driver,10,0.2).until(EC.text_to_be_present_in_element(By.TAG_NAME,"p"))

text_to_be_present_in_element_value():判断text是否出现在元素的value属性值中

#text_to_be_present_in_element_value():判断text是否出现在元素的value属性值中
result16=WebDriverWait(driver,10,0.2).until(EC.text_to_be_present_in_element_value((By.ID,'kw'),'随便'))

title_contains():判断页面title标签的内容包含partial_title,只需要部分匹配即可

#title_contains():判断页面title标签的内容包含partial_title,只需要部分匹配即可,包含返回True,不包含返回Flase
result17=WebDriverWait(driver,10,0.2).until(EC.title_contains("你就知道"))

title_is():判断页面title内容是与传入的title_text内容完全匹配

#title_is():判断页面title内容是与传入的title_text内容完全匹配,匹配返回True,否则返回Flase
result18=WebDriverWait(driver,10,0.2).until(EC.title_is("百度一下,你就知道"))

到此这篇关于selenium WebDriverWait类等待机制的实现的文章就介绍到这了,更多相关selenium WebDriverWait内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python使用pymysql实现操作mysql
Sep 13 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
pytorch下大型数据集(大型图片)的导入方式
Jan 08 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
Python爬虫工具requests-html使用解析
Apr 29 Python
Python偏函数Partial function使用方法实例详解
Jun 17 Python
Python logging日志库空间不足问题解决
Sep 14 Python
python boto和boto3操作bucket的示例
Oct 30 Python
python3 sqlite3限制条件查询的操作
Apr 07 Python
Python socket处理client连接过程解析
Mar 18 #Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 #Python
Python如何使用paramiko模块连接linux
Mar 18 #Python
Python selenium页面加载慢超时的解决方案
Mar 18 #Python
Python Selenium 设置元素等待的三种方式
Mar 18 #Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 #Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 #Python
You might like
php explode函数实例代码
2012/02/27 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
react redux入门示例
2018/04/19 Javascript
详解Element-UI中上传的文件前端处理
2019/08/07 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
JS数组splice操作实例分析
2019/10/12 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
实例分析javascript中的异步
2020/06/02 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
Python入门之三角函数sin()函数实例详解
2017/11/08 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
ubuntu上安装python的实例方法
2019/09/30 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
类的核心特性有哪些
2014/01/01 面试题
派出所所长先进事迹
2014/05/19 职场文书
小组名称和口号
2014/06/09 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
民事纠纷协议书
2016/03/23 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL