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. ...
随机推荐
- vue-cropper裁剪上传
效果图: 全部代码: npm install vue-cropper //首先 安装vue-cropper main.js全局引用: import VueCropper from 'vue-cropp ...
- 攻防世界——stegano
分析 1. 一个pdf,里边都是英文. 打开pdf "ctrl + F",检查flag 然活这里边直接告诉你,flag不在这里,一般都这么说了那就是真的不在了. 2. txt打开, ...
- MyBatis起步搭建
1 步骤 数据库环境 创建Maven项目 导入依赖 编写MyBatis配置文件 编写MyBatis工具类 编写实体类 编写Mapper 测试 2 数据库环境 MySQL 8.0版本 create da ...
- Linux---必备命令(2)
进程相关命令 # 查看系统所有的进程 ps -ef ps -ef | grep vim # 过滤出vim有关的进程 ps -ef | grep vim # 过滤出22端口的信息 ps -tunlp | ...
- Python-术语对照表
>>> 交互式终端中默认的 Python 提示符.往往会显示于能以交互方式在解释器里执行的样例代码之前. ... 具有以下含义: 交互式终端中输入特殊代码行时默认的 Python 提 ...
- Vue快速入门(一)
目录 Vue快速入门(一) 介绍 Vue.js 是什么 M-V-VM思想 安装 CDN引入 下载到本地 快速使用 双向数据绑定测试 模板语法 插值语法 指令 文本指令 v-html:让HTML渲染成页 ...
- 关于Android安装apk出现解析包异常问题情况总结
原文地址:关于Android安装apk出现解析包异常问题情况总结 | Stars-One的杂货小窝 说之前,可以推荐下各位使用这个开源库AndroidUtilCode,下面提及到的工具类,都是在此库中 ...
- 2021.07.17 P3177 树上染色(树形DP)
2021.07.17 P3177 树上染色(树形DP) [P3177 HAOI2015]树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.dp思想是需要什么,维护 ...
- DevExpress控件与VS和.NET各个版本的支持情况
如下图所示,绿色Yes代表支持,红色No代表不支持.对于有些人觉得装了dev后,vs工具箱没有,一般都是以下两大问题: 1.要么你的Dev的版本不支持你当前的VS版本,没有很正常. 2.要么你的项目的 ...
- 我向PostgreSQL社区贡献的功能:空闲会话超时
经过约八个月的努力,终于完成了 PostgreSQL 空闲会话超时断开的功能. 该功能将在版本 14 中发布. 这是我第一次向 PostgreSQL 提供功能,虽然之前也有向社区提供过补丁,但是这次整 ...