当前位置: 首页 > news >正文

Selenium - 设置元素等待及加载策略

7月18日资源分享:

耿直哥三部曲全——机器学习,强化学习,深度学习 

链接: https://pan.baidu.com/s/1c_eVVeqCZmB6zszHt6ZXiw?pwd=tf2a

在使用Selenium进行网页自动化测试时,一个常见的问题是页面加载速度和元素的可见性问题。为了确保脚本的稳定性和可靠性,我们需要设置合适的等待策略来处理这些问题。本文将详细介绍Selenium中常用的元素等待和加载策略,并提供详细的代码案例。

1. 为什么需要等待策略?

网页的加载速度和元素的加载时间可能会因网络状况、服务器响应时间等因素而变化。如果不考虑这些因素,直接操作网页元素可能会导致​​NoSuchElementException​​、​​ElementNotVisibleException​​等错误。因此,合理的等待策略是确保Selenium脚本稳定运行的关键。

2. Selenium中的等待类型

Selenium提供了三种主要的等待方式:

  1. 隐式等待(Implicit Wait)
  2. 显式等待(Explicit Wait)
  3. 流式等待(Fluent Wait)

2.1 隐式等待(Implicit Wait)

隐式等待告诉Selenium WebDriver在查找一个元素时,如果元素没有立即出现,则等待一段时间。在等待的这段时间内,Selenium WebDriver会每隔一段时间重新尝试查找元素。

from selenium import webdriverdriver = webdriver.Chrome()
driver.get("http://example.com")# 设置隐式等待
driver.implicitly_wait(10)  # 等待最长10秒# 尝试查找元素
element = driver.find_element_by_id("myElement")

2.2 显式等待(Explicit Wait)

显式等待是在代码中指定条件的等待,可以在指定的时间内等待某个条件成立。最常用的显式等待是WebDriverWait。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.get("http://example.com")# 设置显式等待
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "myElement")))print(element.text)

2.3 流式等待(Fluent Wait)

流式等待是显式等待的一种扩展,允许我们定义等待的最大时长、轮询间隔以及忽略的异常类型。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import FluentWait
from selenium.common.exceptions import NoSuchElementException
import timedriver = webdriver.Chrome()
driver.get("http://example.com")# 设置流式等待
wait = FluentWait(driver)
wait.with_timeout(10)  # 最长等待10秒
wait.polling_every(2)  # 每2秒检查一次
wait.ignoring(NoSuchElementException)element = wait.until(lambda x: x.find_element_by_id("myElement"))print(element.text)

3. 综合案例:使用等待策略进行页面操作

接下来,我们将结合上述等待策略编写一个综合案例。在这个案例中,我们将访问一个模拟登录页面,输入用户名和密码,并点击登录按钮。我们将使用显式等待确保页面元素在操作之前已经加载完成。

示例网页结构

假设我们有一个简单的登录页面,其HTML结构如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Login Page</title>
</head>
<body><form id="loginForm"><input type="text" id="username" name="username" placeholder="Username"><input type="password" id="password" name="password" placeholder="Password"><button id="loginButton">Login</button></form><div id="message"></div>
</body>
</html>

Selenium脚本

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 初始化WebDriver
driver = webdriver.Chrome()
driver.get("http://localhost:8000")  # 假设本地启动了一个服务try:# 显式等待用户名输入框加载完成wait = WebDriverWait(driver, 10)username_field = wait.until(EC.presence_of_element_located((By.ID, "username")))# 输入用户名username_field.send_keys("testuser")# 显式等待密码输入框加载完成password_field = wait.until(EC.presence_of_element_located((By.ID, "password")))# 输入密码password_field.send_keys("password123")# 显式等待登录按钮加载完成login_button = wait.until(EC.element_to_be_clickable((By.ID, "loginButton")))# 点击登录按钮login_button.click()# 显式等待登录结果消息显示message = wait.until(EC.presence_of_element_located((By.ID, "message")))print("Login message:", message.text)finally:# 关闭浏览器driver.quit()

运行脚本

确保在本地启动一个包含上述HTML结构的服务,然后运行上述Selenium脚本。该脚本将自动打开浏览器,访问指定的URL,输入用户名和密码,并点击登录按钮。通过显式等待确保每一步操作中的元素都已加载完成。

4. 总结

等待策略在Selenium自动化测试中至关重要,可以有效提高脚本的稳定性和可靠性。本文介绍了隐式等待、显式等待和流式等待的用法,并通过一个综合案例展示了如何在实际项目中应用这些等待策略。希望这篇博客能帮助你更好地理解和使用Selenium中的等待机制。如果你有更多的等待策略或技巧,欢迎在评论区分享!

http://www.lryc.cn/news/402941.html

相关文章:

  • 【数据结构】线性结构——数组、链表、栈和队列
  • json将列表字典等转字符串,然后解析又转回来
  • 记录|.NET上位机开发和PLC通信的实现
  • 微服务实战系列之玩转Docker(二)
  • Linux:信号的概念与产生
  • 云监控(华为) | 实训学习day2(10)
  • 数据结构第35节 性能优化 算法的选择
  • 每天一个数据分析题(四百三十六)- 正态分布
  • 跟我学C++中级篇——虚函数的性能
  • trl - 微调、对齐大模型的全栈工具
  • GuLi商城-商品服务-API-品牌管理-品牌分类关联与级联更新
  • 【linux】服务器ubuntu安装cuda11.0、cuDNN教程,简单易懂,包教包会
  • 在 Apifox 中如何高效批量添加接口请求 Body 参数?
  • 专业PDF编辑工具:Acrobat Pro DC 2024.002.20933绿色版,提升你的工作效率!
  • 车载音视频App框架设计
  • StarRocks on AWS Graviton3,实现 50% 以上性价比提升
  • VUE中setup()
  • 【单元测试】SpringBoot
  • 分布式搜索引擎ES-elasticsearch入门
  • TCP三次握手与四次挥手详解
  • 【Windows】操作系统之任务管理器(第一篇)
  • 图同构的必要条件
  • Django获取request请求中的参数
  • kotlin compose 实现应用内多语言切换(不重新打开App)
  • 记录些MySQL题集(16)
  • 【算法基础】Dijkstra 算法
  • 使用 Flask 3 搭建问答平台(三):注册页面模板渲染
  • pycharm如何debug for循环里面的错误值
  • 解决网页中的 video 标签在移动端浏览器(如百度访问网页)视频脱离文档流播放问题
  • .Net--CLS,CTS,CLI,BCL,FCL