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. 以&#开头的是什么编码?

    今天遇到了一个网页时繁体的,它的title和meta信息在浏览器中显示正常,但是查看其源码是却是"最新發"这种. 在网上找了半天资料,终于搞明白了. 以在网页中&#开头的是 ...

  2. fetch和axios区别,摘自Stack Overflow网站答案

    fetch 请求let url = 'https://someurl.com'; let options = { method: 'POST', mode: 'cors', headers: { 'A ...

  3. c++对c的拓展_命名空间_简单使用

    名字的控制:c可使用static关键字使该关键字在本单元内可见,c++则使用命名空间对名字的可见性及产生进行控制 命名空间:控制标识符的作用域(本质上就是一个作用域) 使用特点:1.必须定义在全局范围 ...

  4. 嵌入式Servlet容器

    配置嵌入式Servlet容器 ##Spring Boot里面内置了嵌入式的Servlet容器(tomcat) 点击pom.xml->右键->Diagrams->show Depend ...

  5. For-Each循环(增强型For循环)

    public class Demo077 { public static void main(String[] args) { int[] array ={11,2}; System.out.prin ...

  6. css加载动画(纯css和html)

    从jq官网上摘抄下来的一个简单加载动画,个人比较喜欢使用~存在这里,作为记录 话不多说~上代码 <!DOCTYPE html> <html lang="en"&g ...

  7. js 改变页面元素的内容

    改变页面标签里的内容 (方法) innerText innerHTML (常用)   代码示例 <div></div> <p> 我是文字 <span>1 ...

  8. XCTF练习题---MISC---Hear-with-your-Eyes

    XCTF练习题---MISC---Hear-with-your-Eyes flag:e5353bb7b57578bd4da1c898a8e2d767 解题步骤: 1.观察题目,下载附件 2.打开附件, ...

  9. sa-token client登录逻辑

  10. [笔记] K-D Tree

    一种可以 高效处理 \(k\) 维空间信息 的数据结构. 在正确使用的情况下,复杂度为 \(O(n^{1-\frac{1}{k}})\). K-D Tree 的实现 建树 随机一维选择最中间的点为当前 ...