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 webdriver

driver = 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 EC

driver = 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 time

driver = 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中的等待机制。如果你有更多的等待策略或技巧,欢迎在评论区分享!

相关推荐

  1. Selenium - 设置元素等待策略

    2024-07-19 07:04:02       17 阅读
  2. selenium元素等待

    2024-07-19 07:04:02       21 阅读
  3. 指定元素

    2024-07-19 07:04:02       40 阅读
  4. Selenium自动化测试入门:设置等待时间

    2024-07-19 07:04:02       24 阅读
  5. Selenium 等待

    2024-07-19 07:04:02       20 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 07:04:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 07:04:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 07:04:02       58 阅读
  4. Python语言-面向对象

    2024-07-19 07:04:02       69 阅读

热门阅读

  1. RabbitMq

    RabbitMq

    2024-07-19 07:04:02      16 阅读
  2. vite + vue3 + uniapp 项目从零搭建

    2024-07-19 07:04:02       22 阅读
  3. React中Hooks几个有用的 ref

    2024-07-19 07:04:02       19 阅读
  4. Android RecyclerView实现Item单条滑动,一屏滑动

    2024-07-19 07:04:02       17 阅读
  5. crc、ecc、 uboot和 boot的原理分析及详解

    2024-07-19 07:04:02       22 阅读
  6. React Hook 总结(React 萌新升级打怪中...)

    2024-07-19 07:04:02       21 阅读
  7. linux路由基础知识(一)

    2024-07-19 07:04:02       16 阅读
  8. Activiti7+ SpringBoot+SpringMVC 开发

    2024-07-19 07:04:02       19 阅读
  9. AWS backup服务和 RDS snapshot的关系

    2024-07-19 07:04:02       22 阅读