UI自动化学习笔记- Selenium元素等待(强制等待、显示等待、隐式等待)
一、元素等待
1. 元素等待
1.1 什么是元素等待
概念:在定位页面元素时如果未找到,会在指定时间内一直等待的过程
意思就是:等待指定元素已被加载出来之后,我们才去定位该元素,就不会出现定位失败的现象了
1.2 为什么要设置元素等待
- 网络速度慢
- 电脑配置低
- 服务器处理
1.3 元素等待类型
- 强制等待
- 隐式等待
- 显式等待
2. 强制等待
如果我们不设置元素等待,那怎么避免 因元素未加载出来而定位失败 的情况出现呢?
答案很简单,就是调用 sleep() ,也叫强制等待
但是缺点就是:如果指定的时间过长,即使元素已被加载出来了,但还是要继续等,这样会浪费很多时间
例子:
# _*_ coding:utf-8 _*_
# File Name: case02
# Author: Emily
# Date: 2021/7/6 17:24
# Description : 强制等待
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
# 访问网址
driver.get('https://www.baidu.com')
# 最大化浏览器窗口
driver.maximize_window()
# 强制等待3秒才执行下一步
sleep(3)
# 找到搜索框
inputElement = driver.find_element_by_id("kw")
3. 隐式等待
概念:定位元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长还没找到指定元素,则抛出元素不存在的异常 NoSuchElementException
3.1 实现方式
方法:driver.implicitly_wait(timeout)
timeout:为等待最大时长,单位:秒
说明:隐式等待为全局设置(只需要设置一次,就会作用于所有元素)
例子:
# _*_ coding:utf-8 _*_
# File Name: case02
# Author: Emily
# Date: 2021/7/6 17:24
# Description : 隐式等待
from selenium import webdriver
# 加载驱动
driver = webdriver.Chrome()
# 隐式等待20s
driver.implicitly_wait(20)
# 访问网址
driver.get('https://www.baidu.com')
# 最大化浏览器窗口
driver.maximize_window()
# 强制等待3秒才执行下一步
sleep(3)
# 找到搜索框
inputElement = driver.find_element_by_id("kw")
4.显示等待
概念:定位你指定元素时,如果定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出超时异常TimeoutException
在Selenium中把显示等待的相关方法封装在WebDriverWait类中
4.1 实现方式
导包 等待类 --> from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver, timeout, poll_frequency=0.5)
1). driver:浏览器驱动对象
2). timeout:超时的时长。单位:秒
3). poll_frequency:检测间隔时间,默认为0.5秒
调用方法 until(method):直到。。。时
1). method:函数名称,该函数用来实现对元素的定位
2). 一般使用匿名函数来实现:lambda x: x.find_element_by_id('username')
element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id('username'))
例子:
# _*_ coding:utf-8 _*_
# File Name: case02
# Author: Emily
# Date: 2021/7/6 17:24
# Description : 隐式等待
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
# 访问网址
driver.get("https://www.baidu.com")
# ===显式等待===
# 设置元素等待实例,最多等10秒,每0.5秒查看条件是否成立
element = WebDriverWait(driver, 10, 0.5).until(
# 条件:直到元素加载完成
EC.presence_of_element_located((By.ID, "kw"))
)