1、什么是元素等待

WebDriver定位页面元素时如果未找到,会在指定时间内一直等待的过程。为了保证脚本运行的稳定性,需要脚本中添加等待时间。

2、为什么要设置元素等待

在元素定位的时,可能出现脚本已经运行到定位某个元素的时候,但该元素尚未加载到页面,此时脚本会因无法定位到该元素而导致执行失败。换句话说就是代码执行的速度,快于页面元素加载的速度,我们需要等待页面元素全部加载完成之后,再做定位元素。元素等待本质是为了解决元素定位时序上不匹配的问题。

页面加载速度慢的原因

  1. 由于网络速度原因。
  2. 电脑配置原因。
  3. 服务器处理请求原因。

3、Selenium中常用的等待方式

Selenium中常用的等待时间方式有三种:

  1. 强制等待:time.sleep()
  2. 隐式等待:implicitly_wait()
  3. 显式等待: WebDriverWait()

4、强制等待

设置等待最简单的方法就是强制等待,其实就是time.sleep()方法。不管它什么情况,让程序暂停运行一定时间,时间过后继续运行。缺点是不智能,如果设置的时间太短,元素还没有加载出来一样会报错。设置的时间太长,则会浪费时间。因而在实际UI自动化脚本开发中,这个方式一般比较少用。

5、隐式等待

(1)隐式等待介绍

WebDriver提供了mplicitly_wait()方法来实现隐式等待。隐式等待相当于设置全局等待,在定位元素时,对所有元素设置的超时时间。implicitly_wait()默认参数的单位为秒,默认设置超时时间为0,设置后这个隐式等待会在WebDriver对象实例的整个生命周期起作用。

从等待作用上看,是可以满足需要的,但是考虑到实际应用场景,Driver(浏览器)要等待的元素和脚本要操作的元素未必相同,也就是说,脚本要操作的元素已经出现,但因为设置了全局等待,Driver(浏览器)也会继续等待页面上其他无关元素,直至整个页面加载完毕。所以与显式等待相比,可能会出现一些无效等待的情况。

如果超出了设置的时长,元素还没有被加载,则抛NoSuchElementException异常(可自己指定异常或自定义异常)。

(2)示例

"""
1.学习目标:
掌握selenium隐式等待方法使用
2.操作
2.1 隐式等待方法
driver.implicitly_wait(最大等待时间,单位:秒)
2.2 隐式等待作用
在规定的时间内等待页面所有元素加载;
2.3 使用场景:
在有页面跳转的时候,可以使用隐式等待。
3.需求
实现selenium隐式等待方法
"""
# 1.导入selenium
from selenium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException # 2.打开浏览器
driver = webdriver.Chrome() # 3.打开页面
url = "https://www.jd.com/"
driver.get(url) # 4. 添加隐式等待
print("等待开始时间", time.time())
# 等待5秒钟,最多等待5秒。
# 如果在5秒内加载完成,加载完就继续执行。
driver.implicitly_wait(5)
print("等待结束时间", time.time()) # 5. 定位元素,点击链接
try:
driver.find_element_by_link_text("秒杀").click()
except NoSuchElementException as e:
print(e)
finally:
# 6.关闭浏览器
time.sleep(3)
driver.quit() """
输出结果:
等待开始时间 1590511914.654972
等待结束时间 1590511914.6569717
"""

说明:

在上面的案例中implicitly_wait()设置等待时长为5秒。这个5秒的设置并不针对页面上的某一个元素进行等待,也不是一个固定的等待时间。如果页面全部元素提前加载完,不用等待全部时间。如果直到超出设置时长(5秒)还没有定位到元素,则抛出异常。

6、显式等待

(1)显式等待介绍

显示等待是一种更智能的等待方式。显示等待比隐式等待更节省测试时间,个人更推荐使用显示等待的方式来判断页面元素是否出现。程序会每隔一段时间(默认为0.5秒,可自定义)执行一下判断条件,等待某个条件成立时继续执行,否则在达到最大时长抛出超时异常TimeoutException(实际上是until()抛出的TimeoutException异常,这里注意一下)。

WebDriverWait()类是由WebDirver提供的等待方法。在设置时间内,通过配合until()until_not()ExpectedCondition等条件的使用,默认每隔一段时间,轮询检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。这样的等待方式可避免无效等待,在实际应用中推荐使用该方法。

(2)语法

# 导包WebDriverWait
from selenium.webdriver.support.wait import WebDriverWait # 显示等待方法
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

说明:

  • driverWebDriver的驱动程序(IEFirefoxChrome等)。
  • timeout:最长超时时间,默认以秒为单位。
  • poll_frequency:休眠时间的间隔(步长)时间,默认为0.5秒(轮询频率)
  • ignored_exceptions:超时后的异常信息,默认值ignored_exceptions=None,因为通常配合until()方法使用,until()方法默认情况下抛TimeoutException异常。

(3)until()until_not()方法

WebDriverWait()方法一般会和until()until_not()方法配合使用。

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

  • method:在等待期间,每隔一段时间调用这个传入的方法,直到返回值为True;
  • message:如果超时,抛出TimeoutException,将message位置传入异常。

@2、until_not(method, message=’ ’)

  • method:在等待期间,每隔一段时间调用这个传入的方法,直到返回值为False。
  • message:如果超时,抛出TimeoutException,将message位置传入异常。

注:until_not是当某元素消失或什么条件不成立则继续执行。

(4)具体调用方式示例

调用方式如下

WebDriverWait(driver, 超时时长, 调用频率(可选,有默认值), 忽略异常(可选,有默认值)).until(可执行方法, 超时时返回的信息)

示例

"""
1.学习目标
必须掌握selenium中显式等待使用方法
2.操作步骤(语法)
2.1导入WebDriverWait类
2.2使用方法
WebDriverWait(driver,timeout,pol1_frequency=0.5).until(method)
driver:浏览器
timeout:最大等待时间,单位:秒(和隐式显示是一样的)
po11_frequency:轮询时间 until(method,message)
method:将一个方法作为参数传入 3.需求
在注册A页面中,使用显示等待来定位账号A输入相
"""
# 1.导入selenium
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import NoSuchElementException # 2.打开浏览器
driver = webdriver.Chrome() # 3.打开页面
url = "https://www.jd.com/"
driver.get(url) # 4.使用显示等待,定位元素,点击链接
try:
print("等待开始时间", time.time())
"""
lambda x: x.find_element_by_link_text("秒杀")
是Python的匿名函数,主要记得这里要传入一个方法。
x = driver
不过以后在我们的实际开发中,不这样传入一个方法。
"""
login = WebDriverWait(driver, 5).until(lambda x: x.find_element_by_link_text("秒杀"))
print("等待结束时间", time.time())
login.click()
except NoSuchElementException as e:
print(e)
finally:
# 5.关闭浏览器
time.sleep(3)
driver.quit() """
输出结果:
等待开始时间 1590511979.5245922
等待结束时间 1590511979.5725648
"""

参考:https://www.testclass.cn/selenium_elements_wait.html

『心善渊』Selenium3.0基础 — 23、Selenium元素等待的更多相关文章

  1. 『心善渊』Selenium3.0基础 — 24、Selenium的expected_conditions模块详细介绍

    目录 1.EC模块介绍 2.EC模块常用类 3.EC模块的使用 4.EC模块综合使用 (1)title_is(title)示例 (2)presence_of_element_located(locat ...

  2. 『心善渊』Selenium3.0基础 — 11、Selenium对元素常用操作

    目录 1.Selenium对元素常用操作 2.Selenium对元素的其他操作 1.Selenium对元素常用操作 操作 说明 click() 单击元素 send_keys() 模拟输入 clear( ...

  3. 『心善渊』Selenium3.0基础 — 12、Selenium操作鼠标和键盘事件

    目录 (一)对鼠标的操作 1.鼠标事件介绍 2.ActionChains 类鼠标操作的常用方法 3.perform()方法 4.鼠标事件操作步骤 5.示例 (1)右键单击.左键双击 (2)鼠标拖拽动作 ...

  4. 『心善渊』Selenium3.0基础 — 1、Selenium自动化测试框架介绍

    目录 1.Selenium介绍 2.Selenium的特点 3.Selenium版本说明 4.拓展:WebDriver与Selenium RC的区别 5.Webdriver工作原理 1.Seleniu ...

  5. 『心善渊』Selenium3.0基础 — 4、Selenium基础元素定位详解

    目录 1.什么是元素定位 2.Selenium元素定位常用API (1)By_id 定位 (2)by_name 定位 (3)by_class_name 定位 (4)by_tag_name 定位 (5) ...

  6. 『心善渊』Selenium3.0基础 — 2、Selenium测试框架环境搭建(Windows)

    目录 1.浏览器安装 2.浏览器驱动下载 (1)ChromeDriver for Chrome (2)Geckodriver for Firefox (3)IEDriverServer for IE ...

  7. 『心善渊』Selenium3.0基础 — 3、使用Selenium操作浏览器对象的基础API

    目录 1.导入Selenium库 2.创建浏览器对象 3.浏览器窗口大小设置 4.浏览器位置设置 5.请求访问网址 6.浏览器页面前进.后退和刷新 7.关闭浏览器 相比于高大上的各种Selenium进 ...

  8. 『心善渊』Selenium3.0基础 — 19、使用Selenium操作文件的上传和下载

    目录 1.Selenium实现文件上传 (1)页面中的文件上传说明 (2)文件上传示例 (3)总结 2.Selenium实现文件下载 (1)Firefox浏览器文件下载 1)操作步骤: 2)文件下载示 ...

  9. 『心善渊』Selenium3.0基础 — 20、Selenium对Cookie的操作

    目录 1.Cookie介绍 2.Session介绍 3.Cookie工作原理图解 4.Cookie内容参数说明 5.Selenium操作Cookie的API 6.Selenium操作Cookie的示例 ...

随机推荐

  1. python3 xlrd包的用法

    一.xlrd的安装 pip install xlrd 二.xlrd使用介绍 1.导入模块 import xlrd 2.打开Excel文件,实例化为readbook readbook = xlrd.op ...

  2. 端口映射(socket应用)

    # coding=gb2312 import sys import time import socket import thread import subprocess ############### ...

  3. 使用Typora编写Markdown你真的会了吗

    目录 Typora 介绍 使用 常用快捷键 概述 标题 一级标题 二级标题 方式(推荐) 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 段落 粗体斜体删除线 下划线 注释 分割线 脚注 ...

  4. IDEA2021.1 安装教程

    工欲善其事必先利其器. 一.下载 IDEA 官方下载地址: https://www.jetbrains.com/zh-cn/idea/download/ 二.安装 IDEA 注:安装IDEA之前需要我 ...

  5. THINKPHP_(2)_TP模型的多表关联查询和多表字段的关键字搜索。

    问题: 上述内容中,标题和学年属于一个数据表.分类则属于另外一个数据表,并且是利用id关联后,另外一个数据表中的title字段. 需要设置关键字搜索,实现多表关联查询和多表字段的关键字搜索. 解决方法 ...

  6. BLO

    BLO 内存限制:162 MiB 时间限制:1000 ms 标准输入输出     题目描述 Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ...

  7. xshell连接时报错:Could not connect to '192.168.2.125' (port 22): Connection failed.

    解决思路: 1.首先用主机ping下虚拟机IP,看是否能ping通 2.如果ping不通就看虚拟机防火墙是否开启,service iptables status [root@mysql ~]# ser ...

  8. Pandas高级教程之:category数据类型

    目录 简介 创建category 使用Series创建 使用DF创建 创建控制 转换为原始类型 categories的操作 获取category的属性 重命名categories 使用add_cate ...

  9. Linux常用命令详解下

    Linux常用命令详解 目录 一.Linux常用命令 1.1.查看及切换目录(pwd.cd.ls.du) 1.2.创建目录和文件(mkdir.touch.ln) 1.3.复制.删除.移动目录和文件(c ...

  10. 『无为则无心』Python序列 — 17、Python字符串操作常用API

    目录 1.字符串的查找 @1.find()方法 @2.index()方法 @3.rfind()和rindex()方法 @4.count()方法 2.字符串的修改 @1.replace()方法 @2.s ...