在selenium-webdriver中等待的方式简单可以概括为三种:

1 导入time包,调用time.sleep()的方法传入时间,这种方式也叫强制等待,固定死等一个时间

2 隐式等待,直接调用implicitly_wait()方法,传入等待时间,比如implicitly_wait(10),就代表最长等待10秒

3 显式等待,导入WebDriverWait和expected_conditions包,调用until()者until_not()方法

下面重点介绍后两种方式


一. 隐式等待:表示在自动化实施过程中,为查找页面元素或者执行命令设置一个最长等待时间,如果在规定时间内也没元素被找到或命令被执行完成,则执行下一步,否则继续等待直到设置的最长等待时间截止

下面来看段代码:

from selenium import webdriver
import unittest, time
from selenium.common.exceptions import NoSuchElementException, TimeoutException
import traceback class VisitSogouByChrome(unittest.TestCase):
def setUp(self):
# 启动Chrome浏览器
self.driver = webdriver.Chrome(executable_path="D:\\chromedriver") def test_implictWait(self):
url = 'https://www.baidu.com/'
self.driver.get(url)
# 设置隐式等待时间为10秒
self.driver.implicitly_wait(10)
try:
search = self.driver.find_element_by_id("kw")
search.send_keys("毒")
click = self.driver.find_element_by_id("su")
click.click()
except (NoSuchElementException, TimeoutException):
traceback.print_exc() def tearDown(self):
# 退出谷歌浏览器
self.driver.quit()

这段代码基本就是完成打开百度搜索页,搜索毒的操作。可以看到隐式等待就是调用implicitly_wait()的方法就可以了。

隐式等待的好处是不用像强制等待(time.sleep(n))的方法一样死等固定时间n秒,可以在一定程度上提升测试用例的执行效率。但是这种方法也有一定弊端,就是程序将会一直等待到整个页面加载完成,也就是说浏览器窗口标签栏不再出现小圈圈,才会继续执行下一步,比如某些时候页面元素已经加再好了,但是某个js文件等待资源慢了点,此时程序仍然会等待页面全部加载完成才会执行下一步,这样加长了测试用例的执行时间。

注意:隐式等待时间只需要设置一次,然后他将在driver整个生命周期都起作用


二. 显式等待:通过selenium.webdriver.suppert.ui模块提供的WebDriverWait类,再结合该类的until()和until_not()的方法,并自定义好等待时间,根据判断条件进行灵活等待。显式等待比隐式等待更节约执行时间,因此更推荐使用显式等待方式判断页面元素是否存在

WebDriverWait类解析:WebDriverWait类构造方法:

init(self, driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

参数解释:

driver:WebDriver实例对象(IE,Firefox, Chrome等)

timeout: 最长等待时间,单位微妙

poll_frequency: 调用评率,也就是timeout时间段内,每隔poll_frequency时间执行一次判断条件,默认0.5s

ignored_exceptions: 执行过程中忽略的异常对象,默认只忽略TimeoutException异常类

WebDriverWait类提供方法:

(1)until(method, message='')

在规定时间内,每隔一段时间调用一下method方法,至到期返回值不为False,如果超时抛出带有message的TimeoutException异常信息

(1)until_not(method, message='')

与until()方法相反,表示在规定时间内,每隔一段时间调用一下method方法,至到期返回值为False,如果超时抛出带有message的TimeoutException异常信息

下面这段代码是利用显式等待判断元素是否存在

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
def is_element_exsist2(driver, locator):
'''
结合WebDriverWait和expected_conditions判断元素是否存在,
每间隔1秒判断一次,30s超时,存在返回True,不存返回False
:param locator: locator为元组类型,如("id", "kw")
:return: bool值,True or False
'''
try:
WebDriverWait(driver, 30, 1).until(EC.presence_of_element_located(locator))
return True
except:
return False
if __name__ == '__main__':
loc1 = ("id", "kw") # 元素1
print(is_element_exsist2(driver, loc1))

显式等待期望场景

  • presence_of_element_located(locator)判断某个元素是否出现在DOM中,不一定可见,只要存在返回该页面元素对象使用方法: wait.until(EC.presence_of_element_located((By.ID, "kw")))
  • alert_is_present()判断页面是否出现alert框,显示等待中使用方法:

    wait = WebDriverWait(driver, 10)

    # 打印一下弹框信息

    wait.until(EC.alert_is_present()).text
  • element_to_be_clickable(locator):判断某元素是否可见并能点击,使用方法: wait.until(EC.element_to_be_clickable((By.ID, "kw")))
  • element_to_be_selected(locator):期望某个元素处于选中状态,参数为一个WebDrover实例对象,使用方法:wait.until(EC.element_to_be_selected((By.ID, "kw")))
  • title_is(title_text):判断页面title内容是否与传入的title_text内容完全匹配,是返回Ture,否返回False,使用方法:wait.until(EC.title_is(u"百度一下"))

以上只是简单列举了一下常用的一些方法,如果有其他需要可以阅读官方文档

selenium-webdriver中的显式等待与隐式等待的更多相关文章

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

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

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

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

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

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

  4. Selenium4+Python3系列(六) - Selenium的三种等待,强制等待、隐式等待、显式等待

    为什么要设置元素等待 直白点说,怕报错,哈哈哈! 肯定有人会说,这也有点太直白了吧. 用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了. 如何避免元素未加载 ...

  5. 基于Selenium2+Java的UI自动化(8)- 显式等待和隐式等待

    一.隐式等待 package com.automation.waits; import java.util.concurrent.TimeUnit; import org.openqa.seleniu ...

  6. Selenium 定位元素原理,基本API,显示等待,隐式等待,重试机制等等

    Selenium  如何定位动态元素: 测试的时候会遇到元素每次变动的情况,例如: <div id="btn-attention_2030295">...</di ...

  7. selenium的显示等待和隐式等待的区别

    什么是显示等待和隐式等待?显示等待就是有条件的等待隐式等待就是无条件的等待 隐式等待 当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出 ...

  8. python+selenium显示等待、隐式等待和强制等待的区别

    在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中(a ...

  9. selenium 显示等待、隐式等待、强制等待

    如今大部分web程序使用Ajax技术,当浏览器加载页面时,页面元素可能不是同时加载完成,如果因为加载某个元素超时导致ElementNotVisibleException的情况出现,自动化脚本的稳定性就 ...

随机推荐

  1. Java之多线程(一)

    一,前言 ​ 今天总结一些关于线程方面的知识,说到线程可谓是无人不知,毕竟这东西不管是在工作开发中,还是实际生活中都时时存在着.关于线程方面的内容非常多,从简单的单线程,多线程,线程安全以及到高并发等 ...

  2. 微信小程序实现pdf,word等格式文件上传

    目前微信只支持从聊天记录里面获取文件 一.前言 目前微信提供了一个接口 wx.chooseMessageFile 它能让用户从聊天记录里面选择一个或者多个文件,然后返回它的一些信息,列入文件的path ...

  3. 【Offer】[10-2] 【青蛙跳阶问题】

    题目描述 思路分析 Java代码 代码链接 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 思路分析 其实就是斐波那契 ...

  4. (六十五)c#Winform自定义控件-图标字体

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  5. 【第十六篇】这一次要写的是bootstrap-table

    先上图吧这就是效果图 上代码(这一部分是工具栏的,还包括slider滑动条) <div class="box-body"> <div class="ro ...

  6. Java相关PDF书籍与教程免费下载

    场景 我的CSDN: https://blog.csdn.net/BADAO_LIUMANG_QIZHI 我的博客园: https://www.cnblogs.com/badaoliumangqizh ...

  7. DirectX12 3D 游戏开发与实战第二章内容

    矩阵代数 学习目标 理解矩阵及其相关运算的定义 探究为何能把向量和矩阵的乘法视为一种线性组合 学习单位矩阵.转置矩阵.行列式以及矩阵的逆等概念 逐步熟悉DirectXMath库中提供的关于矩阵计算的类 ...

  8. 控制执行流程之break和continue

    1.在任何迭代语句的主体部分,都可以用break和continue来控制程序执行流程. 2.注意: break:用于强行退出循环, 不执行循环中剩余的语句:continue:停止当前的循环,执行下一次 ...

  9. EF指定更新字段

    使用EF做更新时,若没有进行跟踪会默认全字段更新,那怎么做到只更新我们想要更新的字段呢? /// <summary> /// 修改指定属性的单条数据 /// </summary> ...

  10. [C++] 访问控制与继承详解

      1.访问控制中有三种角色:基类及其友元,派生类,类用户(对象):访问说明符分为public/protected/private,类的成员也相应的分为了3种.   2.访问说明符又分为两种:一个是基 ...