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 自动化测试——显式等待详解的更多相关文章

  1. Python + Selenium操作一:截图详解

    在做测试的时候,空口无凭都是白掐,特别是自动化测试的时候,更需要图片来佐证自己发现的问题 话不多说,直接进入主题,技术就是这么直白 Webdriver自带截图功能,get_screenshot_as_ ...

  2. selenium自动化之显式等待和EC(expected_conditions)模块

    很多人都有这种经历,selenium脚本当前运行没问题,过了一段时间再运行就报错了,然后过几天又好了.其中的原因估计60%的人都知道,是因为元素加载这块有问题.通常的解决方案就是加上sleep或者隐式 ...

  3. selenium 找不到元素 (显式等待 和隐式等待的区别)

    selenium自动化页面元素不存在异常发生的原因有一下几点: (1)页面加载时间过慢,需要查找的元素程序已经完成但是页面还未加载成功.此时可以加载页面等待时间. (2)查到的元素没有在当前的ifra ...

  4. Selenium系列(六) - 强制等待、隐式等待、显式等待

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  5. selenium(5)-解读强制等待,隐式等待,显式等待的区别

    背景 为什么要设置元素等待 因为,目前大多数Web应用程序都是使用Ajax和Javascript开发的:每次加载一个网页,就会加载各种HTML标签.JS文件 但是,加载肯定有加载顺序,大型网站很难说一 ...

  6. selenium测试(Java)-- 显式等待(九)

    转自:https://www.cnblogs.com/moonpool/p/5668571.html 显式等待可以使用selenium预置的判断方法,也可以使用自定义的方法. package com. ...

  7. 【亲测显式等待】Selenium:元素等待的4种方法

    Selenium:元素等待的4种方法 1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用.   2.隐式等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉We ...

  8. 显式等待-----Selenium快速入门(十)

    上一篇说了元素定位过程中的隐式等待,今天我们来探讨一下显示等待.显式等待,其实就是在使用WebDriverWait这个对象,进行等待.显式等待对比隐式等待,多了一些人性化的设置,可以说是更细化的隐式等 ...

  9. (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待

    selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...

随机推荐

  1. PAT 1048数字加密

    本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余--这里用 J 代表 ...

  2. CSS3中有哪些新特性

    新增各种CSS选择器 (: not(.input):所有 class 不是"input"的节点) 圆角 (border-radius:8px) 多列布局 (multi-column ...

  3. c++对c的拓展_常量引用

    常量引用:不能通过引用去修改引用所指向的内容 const int &ref =val; // const int  *const ref =&val; 注意:可引用常量 (普通引用无法 ...

  4. c语言实现双链表的基本操作—增删改查

    //初始化 Node*InitList() { Node*head=(Node*)malloc(sizeof(Node)); if(NULL==head) { printf("内存分配失败! ...

  5. C++五子棋(四)——走棋原理及权值计算

    原理 计算 计算每个落子点的**"权值"**,找到权值最大的落子点 对于每个空白点,分别计算周围的八个方向 不妨以该空白点作为参照原点,以水平向右作为X轴正方向,以竖直向下为Y轴正 ...

  6. Grafana中文汉化

    可视化图表 Grafana是一个通用的可视化工具.通过Grafana可以管理用户权限,数据分析,查看,导出,设置告警等. 仪表盘Dashboard 通过数据源定义好可视化的数据来源之后,对于用户而言最 ...

  7. vue3跳转路由3步曲

    import { useRouter } from 'vue-router';   // 1. 引入路由export default {   setup() {      const $router ...

  8. js 查找数组中某个字符出现的次数

    1. js 查找数组中某个字符出现的次数 代码示例 let arr = ['asd', 'green', 'yeadt', 'red', 'wati', 'red', 'red'] let index ...

  9. 开源框架YiShaAdmin如何使用任务计划

    1.在Startup添加 new JobCenter().Start();(红色字体,下同) // This method gets called by the runtime. Use this m ...

  10. Python学习之路——类-面向对象编程

    类 面向对象编程 通过类获取一个对象的过程 - 实例化 类名()会自动调用类中的__init__方法 类和对象之间的关系? 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值 ...