杰瑞科技汇

Selenium Python延时怎么设置?

强制等待 (time.sleep())

这是最直接、最简单的延时方法,它会告诉脚本“暂停执行 N 秒”,无论页面元素是否已经加载完成。

Selenium Python延时怎么设置?-图1
(图片来源网络,侵删)

如何使用:

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.example.com")
# 强制等待 5 秒
time.sleep(5) 
# 尝试查找元素
element = driver.find_element("id", "some_id")
element.click()
driver.quit()

优点:

  • 简单易用:语法非常简单,一眼就能看懂。
  • 确定性:你确切知道脚本会暂停多长时间。

缺点:

  • 效率低下:即使页面元素 1 秒后就加载好了,脚本也必须等待完整的时间,导致整个测试流程变慢。
  • 不稳定性:如果网络慢或页面加载时间超过了设定的等待时间,脚本就会因为找不到元素而抛出 NoSuchElementException 异常。
  • 不可靠:这是硬编码的等待,无法适应页面动态加载的情况。

适用场景:

  • 调试脚本:当你不确定页面加载需要多长时间时,可以用 time.sleep() 来临时暂停,方便你检查页面状态。
  • 处理特定动画:某些页面上的动画或过渡效果有固定时长,你需要等待它完全结束。

隐式等待 (implicitly_wait())

隐式等待是全局性的设置,当你设置了隐式等待后,Selenium 会在查找任何元素时,等待一段指定的时间,如果在时间内找到了元素,就立即继续执行;如果时间到了还没找到,就抛出 NoSuchElementException 异常。

如何使用:

from selenium import webdriver
# 创建驱动实例后,立即设置隐式等待
driver = webdriver.Chrome()
# 设置隐式等待时间为 10 秒
driver.implicitly_wait(10) 
driver.get("https://www.example.com")
# Selenium 会在这里等待最多 10 秒,直到找到元素
element = driver.find_element("id", "some_id")
element.click()
driver.quit()

工作原理:

隐式等待只对 find_elementfind_elements 这类查找元素的方法有效,它告诉 WebDriver 在轮询(polling)DOM 时,等待一个默认的时间(0.5秒)去查找元素,如果没找到,就等待你设定的总时间(比如10秒),期间会不断重试。

优点:

  • 代码简洁:只需设置一次,后续所有元素查找都会遵循这个规则。
  • 提高稳定性:比 time.sleep() 更稳定,因为它不会因为网络波动而轻易失败。

缺点:

  • 全局性:一旦设置,会影响整个会话中的所有 find_element 调用,可能导致某些本应快速响应的元素也被不必要的等待。
  • 不适用于所有情况:它只等待元素出现在 DOM 中(即可被查找到),但不等待元素可见或可交互,一个元素可能已经加载到页面源码中,但被 CSS 隐藏着,find_element 会成功返回,但后续的 click() 操作可能会失败,因为元素不可见。
  • 精确度低:你无法知道元素具体是什么时候被加载出来的。

适用场景:

  • 作为脚本的基础全局等待,处理大部分页面加载缓慢的情况。
  • 当你只需要元素存在于 DOM 中,而不关心其可见性或状态时。

显式等待 (WebDriverWaitexpected_conditions)

这是 Selenium 推荐的最佳实践,显式等待允许你等待某个特定条件(如元素可见、可点击、包含特定文本等)成立后再继续执行脚本,如果条件在指定时间内成立,脚本继续;如果超时,则抛出 TimeoutException

如何使用:

你需要导入 WebDriverWaitexpected_conditions (通常缩写为 EC)。

Selenium Python延时怎么设置?-图2
(图片来源网络,侵删)
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.common.exceptions import TimeoutException
driver = webdriver.Chrome()
driver.get("https://www.example.com")
try:
    # 等待最多 10 秒,直到 ID 为 "some_id" 的元素变为可点击状态
    element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "some_id"))
    )
    # 当条件满足时,执行点击操作
    element.click()
    # 也可以等待元素可见
    # visible_element = WebDriverWait(driver, 10).until(
    #     EC.visibility_of_element_located((By.ID, "some_id"))
    # )
    # 也可以等待元素包含特定文本
    # text_present = WebDriverWait(driver, 10).until(
    #     EC.text_to_be_present_in_element((By.ID, "status"), "Success")
    # )
except TimeoutException:
    print("在指定时间内未找到符合条件的元素!")
    # 可以在这里添加截图等错误处理逻辑
driver.quit()

常用的 expected_conditions

  • visibility_of_element_located(element): 元素可见(不仅存在于 DOM,displayvisibility 属性都使其可见)。
  • presence_of_element_located(element): 元素存在于 DOM 中(不一定可见)。
  • element_to_be_clickable(element): 元素可见且可被点击(即 enabled)。
  • text_to_be_present_in_element(element, text): 元素的文本包含指定的字符串,contains(title)`: 页面标题包含指定的字符串。

优点:

  • 精确且智能:只等待你真正需要的状态(如可见、可点击),而不是固定的时间。
  • 高效:一旦条件满足,立即继续执行,不会浪费等待时间。
  • 代码可读性强:能清晰地表达你的意图,即“等待某个条件发生”。
  • 非常稳定:是处理动态页面的最可靠方式。

缺点:

  • 代码稍显冗长:需要编写更多的代码来设置等待条件。
  • 需要理解各种条件:你需要了解 expected_conditions 提供的各种等待条件。

适用场景:

  • 几乎所有场景,特别是处理 AJAX 动态加载、单页面应用等现代网页。
  • 当你需要精确控制脚本在页面上的执行流程时。

总结与最佳实践

方法 类型 优点 缺点 推荐度
time.sleep() 强制等待 简单、确定 低效、不稳定、不可靠 ⭐☆☆☆☆ (仅调试用)
implicitly_wait() 隐式等待 代码简洁、全局生效 不精确、不等待元素可交互、可能影响其他元素 ⭐⭐☆☆☆ (可作为基础)
WebDriverWait 显式等待 精确、高效、稳定、可读性强 代码稍长 ⭐⭐⭐⭐⭐ (最佳实践)

最佳实践建议:

  1. 以显式等待为主:在你的自动化测试脚本中,优先使用 WebDriverWaitexpected_conditions,这是编写健壮、可维护脚本的基石。
  2. 慎用隐式等待:可以将隐式等待设置为一个较短的全局默认值(如 3-5 秒),作为对意外延迟的缓冲,但不要依赖它来处理核心的业务逻辑等待。
  3. 避免使用 time.sleep():除非在调试阶段,否则尽量不要在你的正式脚本中使用 time.sleep(),如果使用了,最好加上注释说明原因,并尽快用更智能的等待方式替换它。

一个典型的脚本结构示例:

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
# 1. 初始化驱动
driver = webdriver.Chrome()
# 2. (可选)设置一个较短的隐式等待作为全局保险
# driver.implicitly_wait(3) 
try:
    # 3. 打开页面
    driver.get("https://www.example.com/dynamic-page")
    # 4. 使用显式等待关键元素
    # 等待登录按钮出现并可点击
    login_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "login-btn"))
    )
    # 5. 执行操作
    login_button.click()
    # 6. 等待另一个元素出现以验证操作结果
    # 等待用户名显示出来
    welcome_message = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, "welcome-user"))
    )
    print("登录成功,欢迎信息:", welcome_message.text)
finally:
    # 7. 无论成功与否,最后都关闭浏览器
    driver.quit()

遵循这个原则,你的 Selenium 脚本将变得更加稳定、高效和易于维护。

分享:
扫描分享到社交APP
上一篇
下一篇