三种等待方式:sleep

  • 强制等待, sleep,设置等待多长时间,就要等待多长时间。等待完成后,才会继续下一步:
from selenium import webdriver
# 导入sleep
from time import sleep# 创建谷歌浏览器对象
chrome_driver = webdriver.Chrome()
# 访问百度
chrome_driver.get("http://www.baidu.com")
# 定位登录按钮并进行点击
chrome_driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()
# 设置等待时间,单位是秒
sleep(3)

  • 相比较于sleep的强制等待,selenium中还有种等待,可以称之为智能等待:implicitly_wait。所谓智能等待,就是在我设置的等待时间范围内,只要满足了我的条件,就会立即结束等待,继续往下进行,如果超时,则抛出异常。
    implicitly_wait也称之为隐性等待,不需要导入,直接使用webdriver对象调用。它主要执行两件事情,等待元素找到,执行命令。还以刚才的代码为例子,如果我们创建了webdriver对象之后,直接设置implicitly_wait等待,等待一旦设置,那么这个等会在浏览器对象的整个生命周期起作用:
# 创建谷歌浏览器对象
chrome_driver = webdriver.Chrome()
# 智能等待,在设置时间范围内,只要条件成立,马上结束等待, implicitly_wait
chrome_driver.implicitly_wait(5)
# 访问百度
chrome_driver.get("http://www.baidu.com")
# 定位登录按钮并进行点击,在5s之内,找到元素,会立即点击
chrome_driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()# 设置一个找不到的元素,会进行等待,等待5s后,依旧找不带,会抛出异常
chrome_driver.find_element_by_xpath('//*[@id="s-top-loginbtn1"]').click()

效果:

  • 最后一种等待,显性等待。相较于隐性等待,这个显性等待要明确等待条件和等待上限。比如隐性等待,只要元素存在,可找到就可以,但显性等待,我要明确条件是我的元素可见。而元素存在,并不一定是元素可见。
    显性等待的场景:操作引起了页面的变化,而接下来要操作变化的元素的时候,就需要使用显性等待。
    显性等待导入:
from selenium.webdriver.support.wait import WebDriverWait

WebDriverWait在创建对象时,需要传入三个参数:

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver:浏览器驱动
timeout:等待上限,单位是秒
poll_frequency:检测的轮询间隔,默认值是0.5秒
ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

创建WebDriverWait()对象后,要结合until()或者until_not()和expected_conditions类使用。
比如,等待元素id="TANGRAM__PSP_11__changeSmsCodeItem"加载到dom树中:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By# 使用显性等待, 等待元素id="TANGRAM__PSP_11__changeSmsCodeItem"加载到dom树中,等待上限是10s,每0.8秒去验证一下条件是否成立.
WebDriverWait(chrome_driver, 10, 0.8).until(EC.presence_of_element_located((By.ID,'TANGRAM__PSP_11__changeSmsCodeItem')))

还是以百度首页登录界面为例子,比如点击登录后,在登录界面点击短信登录进行切换:

当我们不点击登录时,发现在dom树中,根本没有短信登录的元素,所以,我们要想点击这个元素,那就需要等待这个元素加载到dom树中,可以找到才行:

用显性等待,代码:

from selenium import webdriver
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By# 创建谷歌浏览器对象, 会话开始
chrome_driver = webdriver.Chrome()# 访问百度
chrome_driver.get("http://www.baidu.com")
# 定位登录按钮并进行点击
chrome_driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()sleep(5)
# 使用显性等待, 等待元素id="TANGRAM__PSP_11__changeSmsCodeItem"加载到dom树中,等待上限是10s,每0.8秒去验证一下条件是否成立.
WebDriverWait(chrome_driver, 10, 0.8).until(EC.presence_of_element_located((By.ID,'TANGRAM__PSP_11__changeSmsCodeItem')))chrome_driver.find_element_by_id('TANGRAM__PSP_11__changeSmsCodeItem').click()

效果:

下面继续基于这一行代码解释:

WebDriverWait(chrome_driver, 10, 0.8).until(EC.presence_of_element_located((By.ID,'TANGRAM__PSP_11__changeSmsCodeItem')))

By.ID,By是webdriver定义好的一个类,这个类只有8个常量,定义了八种元素定位的方式,一般当我们要传入一个元素定位时,会使用到,比如上面的presence_of_element_located的方法,要传入的参数要求是一个定位:

presence_of_element_located是等待元素加载到dom树中的方法,属于expected_conditions类。expected_conditions还有提供了很多的条件判断方法:

方法 说明
title_is 判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值
title_contains 判断当前页面的 title 是否包含预期字符串,返回布尔值
presence_of_element_located 判断元素是否被加到了 dom 树里(注意,加载到dom树中,并不代表这个元素可见)
visibility_of_element_located 判断元素是否可见
visibility_of 同visibility_of_element_located方法,只是visibility_of_element_located方法参数为locator,这个方法参数是 定位后的元素
presence_of_all_elements_located 判断是否至少有 1 个元素存在于 dom 树中。举例:如果页面上有 n 个元素的 class 都是’wp’,那么只要有 1 个元素存在,这个方法就返回 True
text_to_be_present_in_element 判断某个元素中的 text 是否 包含 了预期的字符串
text_to_be_present_in_element_value 判断某个元素中的 value 属性是否包含 了预期的字符串
frame_to_be_available_and_switch_to_it 判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False
invisibility_of_element_located 判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable 判断某个元素中是否可见并且可点击
staleness_of 等某个元素从 dom 树中移除,注意,这个方法也是返回 True或 False
element_to_be_selected 判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be 判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be 跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator
alert_is_present 判断页面上是否存在 alert

selenium中三种等待方式:sleep,implicitly_wait,WebDriverWait相关推荐

  1. selenium的三种等待方式介绍及优缺点

    等待的作用 UI自动化中,运行的时候页面是需要有加载时间的. 等待作为ui自动化中极其核心的技术,是因为通过等待,才可以更好地保障自动化测试的稳定性. 三类等待机制 1.强制等待 就是time库下的s ...

  2. selenium的三种等待方式(显示等待,隐式等待,强制等待)简单了解与总结

    1.强制等待(无条件等待) 使用方法:time.sleep(delay) delay的单位为秒,delay设置多少秒页面就会等待多少秒(死等),这个方法很容易让线程挂掉,使程序抛异常,所以要慎用此方法 ...

  3. selenium中的三种等待方式以及显示等待和隐式等待区别

    selenium的三种等待方式 selenium中一般分为三种等待方式:显示等待.隐式等待.sleep强制等待 1.显示等待(有条件) 程序提前指定等待条件和等待时间,在查找元素时,判断规定时间内是否 ...

  4. selenium中三大切换 三种等待方式

    前言 ui自动化测试,就是通过代码模拟手工操作,通过点击.拖拽.输入等方式,进行浏览器页面的操作,我们常用的web自动化测试工具,是selenium:同时在我们日常操作中,由于需要创建链接,加载页面, ...

  5. Selenuim 三种等待方式解读

    很多情况下写代码时不加等待时间容易出现定位不到元素的情况,可见等待时间的重要性,下面介绍一下selenium的三种等待方式 1.强制等待----sleep() 不管浏览器是否加载完了,程序都得等待所设 ...

  6. python的等待代码是什么_Python selenium 三种等待方式详解

    1.目的背景 解决问题:下拉框定位不到.弹框定位不到-各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加等待. 原因:代码运行速度快,而浏览器加载渲染速度慢 解决办法:加等待,目 ...

  7. Python selenium —— 一定要会用selenium的等待,三种等待方式解

    转自  http://lib.csdn.net/article/48/50937?knId=1313 Python selenium -- 一定要会用selenium的等待,三种等待方式解 发现太多人 ...

  8. 【Selenium】Selenium的3种等待方式

    一.等待是做什么的,为什么需要等待 在做自动化测试,设计测试用例的时候,有时下一步的操作会依赖上一步的结果或者内容,上一步操作成功之后才能进行下一步操作等,这时候,我们就需要使用等待,来判断上一步操作 ...

  9. 【App自动化测试】(八)三种等待方式——强制等待、隐式等待、显示等待

    目录 1. 为什么要添加等待? 2. 三种等待方式 3. 强制(直接)等待 4. 隐式等待 4.1 隐式等待说明 4.2 隐式等待无法解决的问题 5. 显式等待 5.1 为什么要使用显示等待机制? 5 ...

最新文章

  1. 动态更新 AGS Cache
  2. 3D鸟类重建—数据集、模型以及从单视图恢复形状
  3. 应用层之E-mail服务及javaMail邮件发送的知识总结
  4. 校内网用户为什么那么多?
  5. linux下软件的基本安装和卸载 法一
  6. vba执行linux命令,如何使用vba的shell()运行参数的.exe?
  7. 同一表单内设置两个或两个以上的提交按钮 Two submit buttons in one form
  8. 2017年度IT168技术卓越奖名单:服务器类
  9. 网页中打开msn窗口方法
  10. mysql 通达信公式_公式选股--均线黏合(更多公式关注公众号“斯达克逻辑”)...
  11. python 高性能编程 AOT VS JIT
  12. jupyter 下进行markdown
  13. [整理][VBA]Excel合并表格
  14. Context-Aware Zero-Shot Recognition 论文翻译
  15. 几款好用播放器ijkplayer、vlc、SmartPlayer、ExoPlayer
  16. 【汇正财经】金融股有什么投入优势?
  17. Spring/SpringBoot 过滤器修改、获取http 请求request中的参数 和 response返回值,比如修改请求体和响应体的字符编码
  18. 微信小程序 — 保存文件到本地
  19. 2.5野兔和山猫的种群动态变化
  20. 运行JS脚本的几种方式

热门文章

  1. 面试新东方,java集合框架把我问懵了
  2. 高考成绩现在还能查询吗2021,每年的高考成绩什么时候出来 2021几号查分
  3. Linux系统安装QQ最新版 2023-06-30
  4. SQL SERVER 2005数据库镜像搭建
  5. Hadoop 入门—hadoop和jdk安装配置
  6. (转)鲁 白 (2002年9月25日在复旦大学上海医学院的讲课录音记录)——如何在顶级科学杂志上发表论文
  7. 面试|static 关键字有什么作用
  8. 专接本计算机英语大纲,2019年河北专接本公共课英语考试大纲
  9. Qt通过setProperty来达到设置控件的不同样式表
  10. Android内容提供者ContentProvider总结