python+selenium 自动化测试——显式等待详解
1.前言
之前有提到过等待函数,等待函数分为:强制等待(sleep)、隐式等待(implicitly_wait),显示等待(WebDriverWait),这次以显示等待方式专门做一次总结,因为我个人是比较喜欢用这种等待方式。
2.显式等待
显示等待:指定一个等待条件(元素),在一定时间间隔内检测一次元素,程序会判断在等待时间内条件是否满足条件,如果满足则执行下一步,如果不满足会继续等待,超过时间就会抛出异常
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Firefox()
browser.get('https://www.xx.com/')
user = wait.until(EC.presence_of_element_located((By.ID, 'user')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.search')))
print(user, button)
3.显示等待函数
3.1 显示等待函数应用一
WebDriverWai()一般由 unit()或 until_not()方法配合使用
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver=webdriver.Firefox()
driver.get("https://www.xx.com")
#检测元素id:someId出现为止,表示:10秒内每隔0.5毫秒扫描1次页面变化,直到找到指定的元素
WebDriverWait(driver, 10).until(lambda driver:driver.find_element_by_id("someId"))
#检测元素id:someId不再出现为止,表示:10秒内每隔0.5毫秒扫描1次页面变化,直到找不到指定的元素
WebDriverWait(driver, 10).until_not(lambda driver:driver.find_element_by_id("someId"))
3.2 显示等待函数应用二
通常使用WebDriverWait时,我们还会使用到EC即expected_condition,这里展示了显示等待的几种函数之间的区别
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
#打开谷歌浏览器
driver = webdriver.Chore()
#当隐式等待、显示等待都存在时,超时时间取两者较大者的时间
driver.implicitly_wait(6)
#打开网址
driver.get("http://www.xx.com")
#判断标题是否为zn,返回布尔值
WebDriverWait(driver,10).until(EC.title_is("zn"))
#判断标题是否包含zn,返回布尔值
WebDriverWait(driver,10).until(EC.title_contains("zn"))
#判断某个元素是否被加到了dom树里,但并不代表该元素一定可见
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
#判断某个元素是否可见,并传入定位元组locator,且宽和高都大于0
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))
#判断元素是否可见,跟visibility_of_element_located有点类似,只是这个方法要传定位到的element
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))
#判断是否至少有1个元素存在于dom树中,如果存在至少一个就返回列表
WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.zn')))
#判断某个元素中的text属性是否包含了预期的字符串
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'修改'))
#判断某个元素中的value属性是否包含了预期的字符串
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#s'),u'查询'))
#判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,'kw')))
#判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素
WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#Wrap')))
#判断某个元素中是否可见并且是enable的,代表可被点击,只有这样才能被clickable
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='ur']/div[1]/a[1]"))).click()
#等待某个元素从dom树中移除,注意,这个方法也是返回True或False
WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'u')))
#判断某个元素是否被选中了,一般用在下拉列表
WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='ur']/option[2]")))
#判断某个元素的选中状态是否符合预期,这里是传入的是element
WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='ur']/option[1]"),True))
#判断某个元素的选中状态是否符合预期,这里传入的是locator
WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='ur']/option[1]"),True))
#判断页面上是否存在alert,如果有alert,就切换到alert并返回alert的内容
instance = WebDriverWait(driver,10).until(EC.alert_is_present())
#接受alert的内容
instance.accept()
#关闭浏览器
driver.close()
总结:
显示等待的好处就是只需要定位的元素加载完成就能够进行下一步操作,无需全部元素全部加载完成。不仅如此,它还拥有很多定位元素的函数支持,所以我还是比较推荐大家使用这种等待方式。
python+selenium 自动化测试——显式等待详解的更多相关文章
- Python + Selenium操作一:截图详解
在做测试的时候,空口无凭都是白掐,特别是自动化测试的时候,更需要图片来佐证自己发现的问题 话不多说,直接进入主题,技术就是这么直白 Webdriver自带截图功能,get_screenshot_as_ ...
- selenium自动化之显式等待和EC(expected_conditions)模块
很多人都有这种经历,selenium脚本当前运行没问题,过了一段时间再运行就报错了,然后过几天又好了.其中的原因估计60%的人都知道,是因为元素加载这块有问题.通常的解决方案就是加上sleep或者隐式 ...
- selenium 找不到元素 (显式等待 和隐式等待的区别)
selenium自动化页面元素不存在异常发生的原因有一下几点: (1)页面加载时间过慢,需要查找的元素程序已经完成但是页面还未加载成功.此时可以加载页面等待时间. (2)查到的元素没有在当前的ifra ...
- Selenium系列(六) - 强制等待、隐式等待、显式等待
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- selenium(5)-解读强制等待,隐式等待,显式等待的区别
背景 为什么要设置元素等待 因为,目前大多数Web应用程序都是使用Ajax和Javascript开发的:每次加载一个网页,就会加载各种HTML标签.JS文件 但是,加载肯定有加载顺序,大型网站很难说一 ...
- selenium测试(Java)-- 显式等待(九)
转自:https://www.cnblogs.com/moonpool/p/5668571.html 显式等待可以使用selenium预置的判断方法,也可以使用自定义的方法. package com. ...
- 【亲测显式等待】Selenium:元素等待的4种方法
Selenium:元素等待的4种方法 1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用. 2.隐式等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉We ...
- 显式等待-----Selenium快速入门(十)
上一篇说了元素定位过程中的隐式等待,今天我们来探讨一下显示等待.显式等待,其实就是在使用WebDriverWait这个对象,进行等待.显式等待对比隐式等待,多了一些人性化的设置,可以说是更细化的隐式等 ...
- (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待
selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...
随机推荐
- pip 和 Conda 镜像站配置
如果你经常使用 Python,那么你对 pip 和 Conda 一定不陌生,它们作为包管理器,可以非常方便的帮助我们下载需要的 Python 包,但是受限于大多 Python 包的服务器在国外,国内下 ...
- Filebeat和logstash 使用过程中遇到的一些小问题记录
一.filebeat 收集软链文件日志 1.1.场景 由于我们新部署的Nginx 日志都是采用的软链的形式. lrwxrwxrwx 1 root root 72 Apr 6 00:00 jy.baid ...
- 基于Composer的Laravel扩展包开发工作流 ,实现laravle项目的文件管理(记录成长)
PHP Composer包开发 基于Composer的Laravel扩展包开发工作流 实现laravle项目的文件管理,添加文件/文件夹,删除文件,查看代码/文件(代码支持缩进,支持语法高亮) com ...
- mongodb 数据块的迁移流程介绍
1. 基本概念 1.1 Chunk(数据块) 表示特定服务器上面,连续范围的分片键值所包含的一组数据,是一个逻辑概念. 例如,某数据块记录如下: { "_id" : "c ...
- Rancher部署PostgreSQL容器
1.打开工作负载,选择部署服务 2.选择合适的PostgreSQL镜像 镜像地址https://registry.hub.docker.com/_/postgres,也可使用公司内部镜像库 网络模式选 ...
- 软件工程-UML各种图总结-精华
UML(Unified Modeling Language)是一种统一建模语言,为面向对象开发系统的产品进行说明.可视化.和编制文档的一种标准语言.下面将对UML的九种图+包图的基本概念进行介绍以 ...
- Visual Studio之安装(更新,扩展)速度缓慢解决方案
一.背景 小伙伴们在安装visual studio,或者更新,扩展vs功能时,在家里网速正常的情况下,可能出现进度十分缓慢的问题,如何解决呢? 二.解决思路 修改hosts文件 1.地址:默认安装在 ...
- 借助ADB冻结与卸载Android系统应用(免ROOT)
背景: 我妈的手机饱受系统应用广告推送之苦,每天都能在通知栏里收到好几条广告.为了给她个清净,本篇博文应运而生. 目标: 卸载安卓系统应用 所用工具: 硬件:我妈的手机(魅蓝5) PC端:Minima ...
- LVM 逻辑卷学习
一个执着于技术的公众号 前言 每个Linux使用者在安装Linux时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到 当前某个分区需要的容量,还要预 ...
- 论文阅读 Dynamic Graph Representation Learning Via Self-Attention Networks
4 Dynamic Graph Representation Learning Via Self-Attention Networks link:https://arxiv.org/abs/1812. ...