一、selenium的三种等待

当执行python的selenium代码时,如果需要定位一个元素或者点击一个元素,需要考虑到网速等多方面原因,导致页面加载速度慢,元素还未加载出来,这样就会导致找不到对应元素,从而报错的问题,所以要设置等待条件,等待元素加载出来后才执行相应的代码。

其中,selenium中有三种等待方式,下面一一进行介绍。

1、强制等待

最简单的一种方式,直接引入time模块,设置等待时间,但这种方式实用性不高,设置时间太短元素仍未找到,设置时间过长影响效率。

import time

time.sleep(5) 

2、显式等待

原理:指定一个等待条件,和一个最长等待时间,程序会判断在等待时间内条件是否满足,如果满足则返回,如果不满足会继续等待,超过时间就会抛出异常。

(简而言之,就是直到元素出现才去操作,如果超时则报异常)from selenium.webdriver import Chromefrom selenium.webdriver.support.wait import WebDriverWait

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC browser = Chrome() # 浏览器对象 browser.get('http://www.baidu.com') # 访问百度页面 e = browser.find_element_by_id('kw') # 发送数据,输入文本
e.send_keys('柠檬班') # 快速点击,查找父节点如果有form表单就会直接提交
e.submit() wait = WebDriverWait(browser, ) e = wait.until(EC.visibility_of_element_located((By.XPATH, "//a[contains(text(), 'lemon.ke.qq.com/' )]"))) e = browser.find_element_by_xpath("//a[contains(text(), 'lemon.ke.qq.com/' )]") print(e) WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
 
driver:浏览器驱动

timeout:最长超过时间,默认以秒为单位

poll_frequency:监测的时间间隔,默认为0.5

ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常

WebDriverWait一般有until和until_not方法配合使用

until(method,message)

until_not(method ,message)
 

until中的所有方法:

title_is 标题是某内容
title_contains 标题包含某内容
presence_of_element_located 元素加载出,传入定位元组,如(By.ID, 'p')
visibility_of_element_located 元素可见,传入定位元组
visibility_of 可见,传入元素对象
presence_of_all_elements_located 所有元素加载出
text_to_be_present_in_element 某个元素文本包含某文字
text_to_be_present_in_element_value 某个元素值包含某文字
frame_to_be_available_and_switch_to_it frame加载并切换
invisibility_of_element_located 元素不可见
element_to_be_clickable 元素可点击
staleness_of 判断一个元素是否仍在DOM,可判断页面是否已经刷新
element_to_be_selected 元素可选择,传元素对象
element_located_to_be_selected 元素可选择,传入定位元组
element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False
element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
alert_is_present 是否出现Alert

3、隐式等待

原理:隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。

当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常,换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0。

缺点:局限性高,只能用来等元素出现,或者是某个指令没有完成,并不能等待所有情况,只能等待很少的一部分。

from selenium.webdriver import Chrome

browser = Chrome() # 浏览器对象

# 开启隐式等待,全局只需放一次
browser.implicitly_wait(30) browser.implicitly_wait(10) # 等待十秒加载不出来就会抛出异常,10秒内加载出来正常返回
browser.get('http://www.baidu.com')
e = browser.find_element_by_id('kw')
print(e)

implicity_wait()默认参数的单位为秒,本例中设置等待时长为10秒,首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行,如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第六秒定位到了元素则继续执行,若直到超出设置的时长10秒还没有定位到元素,则抛出异常。

二、selenium的三种切换

1、窗口切换

原理:获取打开新窗口之前的句柄(列表),然后在获取打开新窗口之后的句柄,使用browser.switch_to.window(handles[-1])方法切换到最新窗口。

from selenium.webdriver import Chrome
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC browser = Chrome() # 浏览器对象 # 开启隐式等待,全局只需放一次
browser.implicitly_wait(30) # 30S之内只要元素出现就结束,每一个元素都有30S browser.get('http://www.baidu.com') e = browser.find_element_by_id('kw') # 类型e WebElement # 发送数据,输入文本
e.send_keys('柠檬班') # 快速点击,查找父节点如果有form表单就会直接提交
e.submit() # 定定位百度一下
# e_submit = browser.find_element_by_id('su')
# e_submit.click() # time.sleep(10) # 定时器
wait = WebDriverWait(browser, 20) e = wait.until(EC.visibility_of_element_located((By.XPATH, "//a[contains(text(), 'lemon.ke.qq.com/' )]"))) e = browser.find_element_by_xpath("//a[contains(text(), 'lemon.ke.qq.com/' )]") handles = browser.window_handles # 是一个列表 获取句柄的动作一定要放到click之前,因为new_window_is_opened是要比较句柄数量 e.click() print(browser.window_handles)
# 切换窗口,可能窗口没打开,也是需要等待的,必须要用显示等待
# 定时器
wait = WebDriverWait(browser, 20)
e = wait.until(EC.new_window_is_opened(handles))
browser.switch_to.window(handles[-1])

wait = WebDriverWait(browser, 20)
e = wait.until(EC.visibility_of_element_located((By.XPATH, "//h4[text()='华华老师']")))
# 找到华华 huahua = browser.find_element_by_xpath("//h4[text()= '华华老师' ]")

print(huahua)  

注意:获取句柄的动作一定要放到click之前,因为new_window_is_opened是要比较句柄数量。

2、iframe切换

from selenium.webdriver import Chrome
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC browser = Chrome() # 浏览器对象 # 开启隐式等待,全局只需放一次
browser.implicitly_wait(30) # 30S之内只要元素出现就结束,每一个元素都有30S browser.get('http://www.baidu.com') # iframe 等待
wait = WebDriverWait(browser, 20)
e = wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//iframe[@name="iframe2"]')))
# 会自动进行切换,不用再单独进行切换 # browser.switch_to.frame('iframe2')
e = browser.find_element_by_id('kw')
print(e)
"""
:Usage:
driver.switch_to.frame('frame_name')
driver.switch_to.frame(1) 索引
driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0]) webelement对象切换
"""
iframe_e = browser.find_element_by_xpath('//iframe[@name="iframe2"]')
browser.switch_to.frame(iframe_e) 

3、弹框切换

Web自动化测试 五 ----- selenium的等待和切换的更多相关文章

  1. 开源Web自动化测试工具Selenium IDE

    Selenium IDE(也有简写SIDE的)是一款开源的Web自动化测试工具,它实现了测试用例的录制与回放. Selenium IDE目前版本为 3.6 系列,支持跨浏览器运行,所以IDE的UI从原 ...

  2. 《零成本实现Web自动化测试--基于Selenium》 第五章 Selenium-RC

    一. 简介 Selenium-RC可以适应更复杂的自动化测试需求,而不仅仅是简单的浏览器操作和线性执行.Selenium-RC能够充分利用编程语言来构建更复杂的自动化测试案例,例如读写文件.查询数据库 ...

  3. .NET项目web自动化测试实战——Selenium 2.0

    PS:这次用公司的项目来练手,希望公司不会起诉我,因为我绝对是抱着学习的态度,没有任何恶意.仅供交流学习. 该项目是基于SharePoint平台所开发的门户网站,为了切身感受一下Selenium 2. ...

  4. 《零成本实现Web自动化测试--基于Selenium》第二章 Selenium简介和基础

    第一部分 Selenium简介 1.Selenium 组建 1.1 Selenium-IDE Selenium-IDC是开发Selenium测试案例的集成开发环境.它像FireFox插件一样的工作,支 ...

  5. 《零成本实现Web自动化测试--基于Selenium》 第四章 Selenium 命令

    Selenium 命令,通常被称为Selenese,由一系列运行测试案例所需要的命令构成.按顺序排列这些命令就构成了测试脚本. 一. 验证颜面元素 1.Assertion或者Verification ...

  6. 自动化测试-9.selenium多窗口句柄的切换

    前言 有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了. 一.认识多窗 ...

  7. 《零成本实现Web自动化测试--基于Selenium》第一章 自动化测试基础

    第一篇 Selenium 和WebDriver工具篇 第一章 自动化测试基础 1.1    初识自动化测试 自动化测试有两种常见方式 1.1.1 代码驱动测试,又叫测试驱动开发(TDD) 1.1.2 ...

  8. 《零成本实现Web自动化测试--基于Selenium》第三章 Selenium-IDE

    1.简介 Selenium-IDE(集成开发环境)是一种开发selenium测试案例的工具.是一种易用的Firefox插件.你可以通过文字菜单,在当前页面上选择一个UI元素,接着挑选与UI元素相关的s ...

  9. web自动化测试python+selenium学习总结----selenium安装、浏览器驱动下载

    一.安装selenium 命令安装selenium库 :pip  install -U selenium 查看selenium是否安装成功:pip list PS:有时会有异常,安装失败,可以尝试去s ...

随机推荐

  1. UWP 设置控件样式四种方法

    1.隐式方法,通过仅指定 Style 的 TargetType.(设置全部的Button样式) <Page.Resources > <Style TargetType="B ...

  2. Android源码中编译出指定jar包

    今天想把android源码/vendor/letv/frameworks/base/java下的源码编译成 framework-letv.jar供乐乐语音客户端使用,编译完后,发现jar包文件虽然生成 ...

  3. Qt5.5.0在Windows下静态编译(修改参数以后才能支持XP)good

    测试系统环境: windows 7 编译软件环境: vs2013 + QT5.5.0 [源码地址:http://download.qt.io/official_releases/qt/5.5/5.5. ...

  4. mac下 编译php的 openssl

    编译openssl.so tar zxvf php-7.2.8.tar.gz# 进入PHP的openssl扩展模块目录cd php-7.2.8/ext/openssl/brew install ope ...

  5. 零基础配置Hadoop集群——Ambari安装及配置详解

    1. 准备工作 1.1. 系统环境 主机列表: IP地址 HostName 描述 192.168.610.153 ambari.server Ambari服务器 192.168.10.152  had ...

  6. sentinel 滑动窗口统计机制

    sentinel的滑动窗口统计机制就是根据当前时间,获取对应的时间窗口,并更新该时间窗口中的各项统计指标(pass/block/rt等),这些指标被用来进行后续判断,比如限流.降级等:随着时间的推移, ...

  7. Django之用户认证auth模块使用

    Auth认证模块 执行数据库迁移的那两条命令时,即使我们没有建表,django是不是也会创建好多张表?我们创建之后去看一下里面的一个叫auth_user表,既然是表,那肯定应该有对应的操作改表的方法 ...

  8. spring boot 2.x 系列 —— actuator 服务监控与管理

    文章目录 一.概念综述 1.1 端点 1.2 启用端点 1.3 暴露端点 1.4 健康检查信息 二.项目说明 1.1 项目结构说明 1.2 主要依赖 1.3 项目配置 1.4 查看监控状态 三.自定义 ...

  9. Ubuntu 配置docker镜像加速器

    1. 安装/升级Docker客户端 推荐安装1.10.0以上版本的Docker客户端,参考文档 docker-ce 2. 配置镜像加速器 针对Docker客户端版本大于 1.10.0 的用户 您可以通 ...

  10. Akka-CQRS(14)- Http标准安全解决方案:OAuth2-资源使用授权

    上一篇讨论了SSL/TLS安全连接,主要是一套在通信层面的数据加密解决方案.但我们更需要一套方案来验证客户端.要把不能通过验证的网络请求过滤掉. OAuth2是一套行业标准的网络资源使用授权协议,也就 ...