【发布时间】:2020-03-21 06:33:34
【问题描述】:
我正在关注此处的示例(在 Python 选项卡下):https://www.selenium.dev/documentation/en/
代码在这里:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
#This example requires Selenium WebDriver 3.13 or newer
with webdriver.Firefox() as driver:
wait = WebDriverWait(driver, 10)
driver.get("https://google.com/ncr")
driver.find_element_by_name("q").send_keys("cheese" + Keys.RETURN)
first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
print(first_result.get_attribute("textContent"))
我已经运行了这段代码并让它工作,显示第一个结果“显示更多”。但是,有时当我运行此代码时,这不起作用,并且会给出随机超时错误而没有消息:
Traceback (most recent call last):
File "c:\Users\User\PyCharm_Projects\Project\sample_test.py", line 12, in <module>
first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
File "C:\Program Files\Python38\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
我的问题是:如果不是每次都发生超时错误,是什么原因导致的?我尝试使用其他方法(XPATH、链接文本)定位元素。我查看了以下其他示例,但他们发布的任何内容似乎都无法解决此问题:
试过了,没用 - Selenium random timeout exceptions without any message
不适用的解决方案 - Instagram search bar with selenium - Selenium Timeoutexception Error - Random TimeoutException even after using ui.WebDriverWait() chrome selenium python
我使用的是 Python 3.8、Firefox 68.6.0,这里是来自 'pip freeze' 的相关包 - 美丽的汤4==4.8.2 - 请求==2.22.0 - 硒==3.141.0 - urllib3==1.25.8 - webencodings==0.5.1
谢谢!
【问题讨论】:
-
您好,我在过去的一个项目中也遇到过同样的问题。我发现的唯一解决方法是实现 try/except 逻辑并在重试之前使用 time.sleep(x)。
-
嗨!只是要明确一点:问题是否与服务器时间慢有关?如果是这样,会做类似
wait = WebDriverWait(driver, 1000)的事情来确保所有内容都已加载。我想我只是不确定根本原因是什么。 -
就我而言,问题是网站刷新了我的网络元素,使其在短时间内不存在。因为 web 驱动程序已经为这个元素分配了一个 id,所以它找不到它。所以这个 try/exception 逻辑对我很有效
-
这似乎对我很有效!在我获取的每个元素周围都有 try/except 很烦人,但它似乎有效! (也许问题还在于我没有在所有内容的末尾包含 finally: driver.quit() 块)。您可以对此进行总结,我可以将其作为公认的答案!谢谢!
标签: python selenium web-scraping