繁体   English   中英

为什么 Python Selenium Webdriver 对于 find_element_by_xpath 需要时间睡眠

[英]Why does Python Selenium Webdriver needs time sleep for find_element_by_xpath

我一直在尝试抓取网页并发现一些奇怪的东西。 当我在没有 time.sleep 的情况下尝试 Python selenium webdriver 的find_element_by_xpath time.sleep ,我从命令中什么也得不到。 但是如果我添加time.sleep ,我会突然得到我打算得到的信息。

我首先注意到这种模式,当我第一次运行没有time.sleep的代码时,我什么也没得到。 但是当我再次运行相同的代码时,我得到了结果。 所以我尝试添加一个短暂的休息时间,突然代码完美运行。

这是没有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

我知道我应该提供一个实际的网站地址以获得最佳答案。 但我不想透露我正在尝试 web 抓取哪个网站。

有人可以从理论上向我解释为什么会发生这种情况吗?

当您使用.sleep() 时,您实际上是在暂停代码 x 秒。 由于存在它允许您的代码运行,因此网页的加载速度可能不如计算机尝试处理的速度。

.sleep() 适用于已知的时间差异,但您可能希望查看使用 selenium 的显式等待 function ,它可以等待 x 秒,直到特定元素“出现”,而不管超时之前的原因。 这样一来,您就不必在搜索每个元素时在硬睡眠时间内编写代码,除非您知道它们需要等待的特定时间量。 请参阅下面的链接。

https://www.geeksforgeeks.org/explicit-waits-in-selenium-python/

睡眠有助于找到元素的原因可能有很多。 Selenium 在等待页面完成加载时阻止代码进度(浏览器返回document.readyState等于complete )。 页面加载完成后,页面上可能仍在运行任何数量的进程,这些进程会阻止页面的某些部分完全加载。

注意:使用睡眠是一种不好的做法。 您应该改用WebDriverWait来等待元素位于所需的 state 中。 对于您的示例代码,您将使用

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.get(link)
info = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "page-number")).text
print info

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM