【UI自动化测试】9_web自动化测试 _元素等待

文章目录

一、元素等待

元素等待:在定位页面元素时如果未定位到, 会在指定时间内一直等待的过程;

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)

五、等待对比

  • 隐式等待:依赖于界面元素的加载影响。比如:第一次打开页面,有时受网络影响,页面始终处于转圈加载的状态(加载界面所有的信息),有可能定位登录按钮已经早都加载显示出来,但是其他元素还没有加载完毕(其它元素没有出来和登录按钮没有关系);登录按钮出来就想做点击,然后跳转到登录页面。
  • 原有的隐式等待受整个页面加载的影响,即使出现想要的元素,也不点击,要等待所有的元素加载完毕,这影响了测试用例运行的效率。因此要加上显示等待。
相关推荐
Never_Satisfied1 小时前
在JavaScript / HTML中,模板克隆并添加监听的注意事项
前端·javascript·html
明月_清风1 小时前
告别视口依赖:Container Queries 开启响应式组件的“后媒体查询”时代
前端·css
明月_清风1 小时前
从样式表到渲染引擎:2026 年前端必须掌握的 CSS 架构新特性
前端·css
阿珊和她的猫10 小时前
前端应用首屏加载速度优化全攻略
前端·状态模式
Mike_jia11 小时前
LiteOps:轻量级CI/CD平台,重塑开发运维新体验
前端
浮游本尊11 小时前
React 18.x 学习计划 - 第十四天:实战整合与进阶收尾
前端·学习·react.js
_Eleven15 小时前
Tailwind CSS vs UnoCSS 深度对比
前端
NEXT0616 小时前
TCP 与 UDP 核心差异及面试高分指南
前端·网络协议·面试