You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python Selenium WebDriver需用time.sleep配合find_element_by_xpath

问题原因解析

1. 页面异步加载与Selenium执行时序不匹配

调用driver.get(link)后,Selenium仅等待页面document.readyState变为complete就会执行后续代码,但现代网站常用客户端渲染(如React、Vue)或AJAX异步请求,此时基础DOM结构虽加载完成,但目标元素#page-number可能还未被JavaScript渲染到页面中,直接执行find_element_by_xpath自然找不到元素。

添加time.sleep(1)相当于给浏览器留出了JS渲染目标元素的时间,因此能成功获取内容。

2. 首次与二次运行的缓存差异

首次运行时,浏览器需要从零下载所有静态资源(JS、CSS、图片等),页面整体加载耗时久,目标元素出现时间晚于Selenium执行查找的时间;二次运行时,浏览器已缓存这些资源,页面渲染速度大幅提升,目标元素能更快出现在DOM中,所以无time.sleep也能成功。

但这种情况完全依赖缓存,稳定性极差——一旦缓存过期、网络波动或网站资源更新,还是会出现找不到元素的问题。

补充:更可靠的替代方案

time.sleep是固定时长等待,灵活性不足。更专业的做法是使用Selenium的显式等待,通过设置等待条件(如元素可见、可点击),让代码自动等待到元素满足条件后再执行,既保证可靠性又避免不必要的等待:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver.get(link)
# 最多等待10秒,直到目标元素可见
info = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.ID, "page-number"))
).text
print(info)

附用户提供的代码示例

无time.sleep的代码:

driver.get(link)

info = driver.find_element_by_xpath('//*[@id="page-number"]').text
print(info)

带time.sleep的代码:

driver.get(link)
time.sleep(1)

info = driver.find_element_by_xpath('//*[@id="page-number"]').text
print(info)

内容的提问来源于stack exchange,提问作者user3077008

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:16:06