——为什么要设置元素等待:
目前大多数web应用程序都是使用AJAX和JavaScript开发,每次加载一个网页,包括静态网页和动态网页,也就是加载各种HTML标签和JS文件。在网页中进行元素定位时,有可能打开了网页但是元素未加载出来,这时进行元素定位可能会出现错误。所以,设置元素等待(等待元素加载完成再去定位)是非常有必要的。
(1)隐式等待(相当于全局变量)
隐式等待会告诉webdriver等待一段时间后查找元素。默认等待时间为0,一旦设置了隐式等待,它会对整个webdriver周期起作用。如果在规定时间内,整个网页都加载完成,就执行下一步,否则抛出异常。
缺点:无论需要定位的元素是否被加载完成,都会等待整个网页完全加载出来。
1 from selenium import webdriver
2
3 driver = webdriver.Chrome() # 创建有界面的浏览器对象
4 driver.implicitly_wait(10) # 设置隐式等待时间为10秒
5 driver.get("https://www.baidu.com/") # 请求页面
6 input = driver.find_element_by_id("kw") # 根据id值定位输入框
(2)显示等待(推荐 相当于局部变量)
显示等待只对指定元素有效,不再是对整个webdriver周期起作用。根据需要定位的元素来设置显示等待,无需等待整个网页加载完成,节省加载时间。(只需要等待定位元素加载完成)
设置显示等待的方法:
WebDriverWait(driver, 超时时间,调用频率,可忽略的异常).until(要采用的方法,超时情况下返回信息)
调用WebDriverWait方法时,大多情况下只需要设置前两个参数:第一个参数时申明的浏览器对象;第二个参数时设置的最大显示等待时间。调用频率默认0.5s,可忽略的异常默认NoSuchElementException。
excepted_conditions是selenium中的一个模块,包含一系列用于判断的条件类,一共26个类。其中presence_of_element_located((tuple))
传入参数是一个tuple,用于定位元素。
1 from selenium import webdriver
2 from selenium.webdriver.common.by import By # 用于定位元素
3 from selenium.webdriver.support.wait import WebDriverWait # 用于设置显示等待
4 from selenium.webdriver.support import expected_conditions as EC # 用于判断定位元素是否被加载完成
5
6 driver = webdriver.Chrome() # 创建有界面的浏览器对象
7 driver.get("https://www.zhihu.com/explore") # 请求页面
8 # 设置元素等待实例,最多等待10s,每隔0.5s查看条件是否成立
9 wait = WebDriverWait(driver, 10)
10 input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
11 button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
12 print(input, button)
——如果不设置元素等待,可以使用强制等待(调用time模块的sleep方法):
缺点:无论网页、元素是否被加载完成,都会等待指定时间。
1 from selenium import webdriver
2 import time
3
4 driver = webdriver.Chrome() # 创建有界面的浏览器对象
5 driver.get("https://www.baidu.com/") # 请求页面
6 input = driver.find_element_by_id("kw") # 根据id值定位输入框
7 input.send_keys("动物") # 输入搜索关键字
8 time.sleep(3) # 强制等待3秒
9 input.clear() # 删除输入内容
10 input.send_keys("孔雀") # 重新输入搜索关键字
11 button = driver.find_element_by_id("su") # 根据id值定位搜索按钮
12 button.click() # 点击
13 driver.close() # 关闭页面
总结:
(不推荐)强制等待:无论网页、定位元素是否加载完成,都必须等待设置的时长;
(不推荐)隐式等待:无论定位元素是否加载完成,都必须等待整个网页加载完成;
(推荐) 显示等待:只需要等待定位元素加载完成。
selenium学习之元素等待(四)的更多相关文章
-
Selenium 3----设置元素等待
在做Web应用的自动化测试时,定位元素必不可少,这个过程经常出现定位不到元素的情况,常见原因有哪些呢? 1.描述错误 提高编写水平.细心 2.Frame/Iframe框架原因 在元素所在框架里定位该元 ...
-
selenium webdriver——设置元素等待
如今大多数Web应用程序使用ajax技术,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给定位元素的定位增加了困难, 如果因为在加载某个元素时延迟而造成ElementNotVisibl ...
-
selenium - webdriver - 设置元素等待
隐式等待:implicitly_wait(value), value默认是0 from selenium import webdriverfrom selenium.common.exceptions ...
-
selenium - 三种元素等待
1.sleep 休眠方法 sleep()由python的time模块提供. 当执行到sleep()方法时,脚本会定时休眠所设置的时长,sleep()方法默认参数是s(秒),sleep(2) 表示休眠2 ...
-
Python +selenium之设置元素等待
注:本文转载http://www.cnblogs.com/mengyu/p/6972968.html 当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给元素的定位增加了困难.如果因为在加 ...
-
UI自动化学习笔记- Selenium元素等待(强制等待、显示等待、隐式等待)
一.元素等待 1. 元素等待 1.1 什么是元素等待 概念:在定位页面元素时如果未找到,会在指定时间内一直等待的过程 意思就是:等待指定元素已被加载出来之后,我们才去定位该元素,就不会出现定位失败的现 ...
-
Python+Selenium笔记(十):元素等待机制
(一) 前言 突然的资源受限或网络延迟,可能导致找不到目标元素,这时测试报告会显示测试失败.这时需要一种延时机制,来使脚本的运行速度与程序的响应速度相匹配,WebDriver为这种情况提供了隐式等待 ...
-
Appium+python自动化(二十四)- 白素贞千年等一回许仙 - 元素等待(超详解)
简介 许仙小时候最喜欢吃又甜又软的汤圆了,一次一颗汤圆落入西湖,被一条小白蛇衔走了.十几年后,一位身着白衣.有青衣丫鬟相伴的美丽女子与许仙相识了,她叫白娘子.白娘子聪明又善良,两个人很快走到了一起.靠 ...
-
『心善渊』Selenium3.0基础 — 23、Selenium元素等待
目录 1.什么是元素等待 2.为什么要设置元素等待 3.Selenium中常用的等待方式 4.强制等待 5.隐式等待 (1)隐式等待介绍 (2)示例 6.显式等待 (1)显式等待介绍 (2)语法 (3 ...
随机推荐
-
浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
-
javascript的执行和预解析
很久以前遇到过一个面试题目,的的确确是面试官问我的问题,下面是这个问题的代码部分.由于年少无知,没有回答上,被无情pass了. var u ='hello world'; ;(function(){ ...
-
Delphi 多步操作产生错误,请检查每一步的状态值
需检查是否是以下这些情况: 1. 字段是不是精度不够. 2. 无主键 3. 字段允许为空 4. 字段类型不匹配 5. ADO控件 CursorLocation的属性,默认值为"cl ...
-
C# winform程序怎么打包成安装项目(图解)
1:新建安装部署项目 打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点击确定.(详细见下图) 此主题相关图片如下: 2:安装向导 关闭后打开安 ...
-
centos下的防火墙配置
1,查看防火墙文件: vim /etc/sysconfig/iptables # Generated by iptables-save v1. :: *filter :INPUT ACCEPT [:] ...
-
Java字面常量与常量池
Java中的字面常量(区别于final创建的有名常量)通常会保存在常量池中,常量池可以理解为像堆一样的内存区域.但是常量池有一个特性就是,如果常量池中已存在该常量将不会再次为该常量开辟内存 还是看个程 ...
-
JavaScript 中的继承(读书笔记思维导图)
继承是 OO 语言中的一个最为人津津乐道的概念.许多 OO 语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.由于函数没有签名,在 ECMAScript ...
-
docker的一些常用命令整理
docker清除命令: 杀掉所有容器:docker kill $(docker ps -q) ; 清除所有容器:docker rm $(docker ps -a -q) ; 清除所有镜像:docker ...
-
Visual Studio 20周年软件趋势随想
从2002年开始,.net让开发人员能快速构建和部署应用程序,便捷的开发windows和web服务器应用,同时著名的hacker Miguel de Icaza ,Miguel 为了GNOME项目启动 ...
-
mongo中常用的增删改查
db.students.find();//按性别分组,并显示每组的姓名db.students.aggregate({ $group:{ _id:'$sex', name:{$push:'$name'} ...