文章目录
- 一、元素等待
- 二、隐式等待(重要)
-
- [2.1 隐式等待-案例](#2.1 隐式等待-案例)
- [2.2 隐式等待-总结](#2.2 隐式等待-总结)
- [三、显式等待 (移动端测试多用)](#三、显式等待 (移动端测试多用))
-
- [3.1 显式等待方法](#3.1 显式等待方法)
- [3.2 显式等待-案例](#3.2 显式等待-案例)
- 四、强制等待
- 五、等待对比
一、元素等待
元素等待:在定位页面元素时如果未定位到, 会在指定时间内一直等待的过程;
1、什么是等待?
代码执行过程中,第一次未找到元素,先不抛出异常。激活等待时间,在等待过程中如果找到元素就执行。
2、 为什么要等待?
由于网络速度慢 或 电脑配置低 或者 服务器处理请求慢 等原因,导致元素未加载出来,而代码已执行,会触发异常。
3、元素等待类型
yacas
- 隐式等待
- 显式等待
- 强制等待-->time.seep(秒) 影响运行效率
二、隐式等待(重要)
隐式等待:
- 定位元素时, 如果能定位到元素则直接返回该元素, 不触发等待;
- 如果不能定位到该元素, 则间隔一段时间后再去定位元素;
- 如果在达到最大时长时还没有找到指定元素, 则抛出元素不存在的异常 NoSuchElementException 。
python
- 说明:隐式等待为全局设置(只需要设置一次,就会作用于所有元素)
- 方法:driver.implicitly_wait(timeout) # (timeout:为等待最大时长,单位:秒)
- 提示:在项目中,如果未封装自动化框架时,推荐使用。
2.1 隐式等待-案例
python
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
# 1、获取浏览器驱动对象
driver = webdriver.Chrome()
# 2、将浏览器 最大化
driver.maximize_window()
# 3、设置隐式等待10秒。
driver.implicitly_wait(10)
# 打开一个网页
driver.get("http://www.baidu.com")
# 定位输入框--给一个错误的id,不能找到,如果直接抛出异常,说明等待失效。如果在设置指定时长以外抛出说明等待生效。
# driver.find_element_by_css_selector("#chat-textarea").send_keys("你爱我")
driver.find_element(By.CSS_SELECTOR,"#chat-textarea").send_keys("你爱我")
# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()
2.2 隐式等待-总结
python
方法:driver.implicitly_wait(30) # 一般情况下设置30秒
特色:
1. 针对所有元素生效。
2. 一般情况下为前置必写代码(1.获取浏览器驱动对象;2. 最大化浏览器;3. 设置隐式等待)
三、显式等待 (移动端测试多用)
显式等待:
- 定位指定元素时, 如果能定位到元素则直接返回该元素, 不触发等待;
- 如果不能定位到该元素, 则间隔一段时间后再去定位元素;
- 如果在达到最大时长时还没有找到指定元素, 则抛出超时异常 TimeoutException 。
yacas
说明:针对单个元素生效,可以修改查找频率和超时时间。
特点︰查找并返回元素
3.1 显式等待方法
在Selenium中把显式等待的相关方法封装在WebDriverWait类中 。
python
from selenium.webdriver.common.by import By
# 1.导包 等待类
from selenium.webdriver.support.wait import WebDriverWait
# 2.创建显示等待类对象
WebDriverWait(driver, timeout, poll_frequency=0.5)
1). driver: 浏览器驱动对象
2). timeout: 超时的时长,单位:秒
3). poll_frequency: 检测间隔时间,默认为0.5秒
# 3.调用方法
until(method): 直到...时
1).method: 函数名称, 该函数用来实现对元素的定位
2).一般使用匿名函数来实现: lambda x: x.find_element(By.CSS_SELECTOR,"#chat-textarea")
3)x: x为driver,它是WebDriverWait类将传入的driver赋值给类self._driver,until方法调用了self._driver;
# 4. 整体实现,返回的一个元素。
element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element(By.CSS_SELECTOR,"#chat-textarea"))
element.send_keys("你爱我")
3.2 显式等待-案例
python
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
# 1、获取浏览器驱动对象
driver = webdriver.Chrome()
# 2、将浏览器 最大化
driver.maximize_window()
# 打开一个网页
driver.get("http://www.baidu.com")
"""
# 定位输入框--给一个错误的id,不能找到,如果直接抛出异常,说明等待失效。如果在设置指定时长以外抛出说明等待生效。
# 实例化WebDriverWait()并调用until方法
# 注意:调用until方法返回的一定是一个元素
"""
# 显示等待 -> 返回查找到的元素
# 定位延时加载输入框,当找不到时抛出异常并捕获异常,找到元素则直接输入
try:
el = WebDriverWait(driver, 10, 0.5).until(lambda x: x.find_element(By.CSS_SELECTOR,"#chat-textarea"))
# 注意:此时el 还不是元素,只有代码运行起来才是元素
el.send_keys("你爱我")
except Exception as e:
print("显示等待定位超时")
# 继续抛出异常
raise e
# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()
"""
# 获取 WebDriverWait示例对象
wait= WebDriverWait(driver,timeout=10, poll_frequency=0.5)
# 获取元素
el = wait.until(lambda x:x.find_element_by_id("#chat-textarea"))
# 发送内容
el.send_keys("你爱我")
"""
四、强制等待
- 语法:sleep(10)
- 提示:执行到这句必须等待10秒,不灵活。
python
from time import sleep
sleep(10)
五、等待对比
- 隐式等待:依赖于界面元素的加载影响。比如:第一次打开页面,有时受网络影响,页面始终处于转圈加载的状态(加载界面所有的信息),有可能定位登录按钮已经早都加载显示出来,但是其他元素还没有加载完毕(其它元素没有出来和登录按钮没有关系);登录按钮出来就想做点击,然后跳转到登录页面。
- 原有的隐式等待受整个页面加载的影响,即使出现想要的元素,也不点击,要等待所有的元素加载完毕,这影响了测试用例运行的效率。因此要加上显示等待。
