【问题标题】:Maximum Recursion Error with Selenium's driver.get() callSelenium 的 driver.get() 调用的最大递归错误
【发布时间】:2019-09-07 23:10:22
【问题描述】:

我正在使用 selenium 在 Python 中运行自动化脚本。我已经使用该工具三年了,但从未遇到过这个问题。有谁知道这可能是什么原因造成的?我能够确定错误的原因是在 for 循环中对 driver.get() 的引用,但在 7 次迭代后它会出错。看起来很奇怪,想法?

Unhandled exception in thread started by <function crawl_games_and_store_data.<locals>.handle_incoming_request at 0x104659158>
Traceback (most recent call last):
  File "/Users/z003bzf/Documents/personal/python/MLB/src/services/crawler.py", line 160, in handle_incoming_request
    driver.get(game_link)
  File "/Users/z003bzf/.local/share/virtualenvs/MLB-Ei2Ym8vD/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 333, in get
    self.execute(Command.GET, {'url': url})
  File "/Users/z003bzf/.local/share/virtualenvs/MLB-Ei2Ym8vD/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 318, in execute
    params = self._wrap_value(params)
  File "/Users/z003bzf/.local/share/virtualenvs/MLB-Ei2Ym8vD/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 271, in _wrap_value
    converted[key] = self._wrap_value(val)
  File "/Users/z003bzf/.local/share/virtualenvs/MLB-Ei2Ym8vD/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 276, in _wrap_value
    return list(self._wrap_value(item) for item in value)

这是导致问题的代码

for elem in link_lst:
     driver.get(elem)
     time.sleep(.5)

     driver.find_element_by_xpath('//div[@class="box-row batting-row"]')

【问题讨论】:

  • 发布问题所在的实际代码...如minimal reproducible example
  • 我在下面添加了我的代码作为答案,因为 cmets 不支持代码语法。
  • 您应该编辑您的问题并在此处添加代码和任何其他相关详细信息。

标签: python selenium selenium-webdriver error-handling


【解决方案1】:

如果其中一台主机超时,则可能是 link_lst 的内容。您必须处理此异常才能继续前进。一种可能的选择是在超时以及无法定位页面元素时使用 try/except。这既可以作为延迟参数进行调整,也可以在 Firefox 配置文件设置中进行调整。

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


def fetch(driver, link_list, delay)
    for item in link_list:
        try:
            driver.get(item)
        except TimeoutException:
            print("Timeout in link_list item")

        try:
            elem = WebDriverWait(driver, 
            delay).until(EC.presence_of_element_located((By.XPATH '//div[@class="box-row batting-row"]')))
        except TimeoutException:
            print("Locating element took too much time!")

if __name__ == '__main__':

    """ Setup profile """
    fp = webdriver.FirefoxProfile()
    fp.set_preference("http.response.timeout", 10)
    fp.set_preference("dom.max_script_run_time", 10)

    """ Prepare args """
    driver = webdriver.Firefox(firefox_profile=fp)
    link_list = ['http://abcdeftest.com', 'http://test.com']
    delay = 5

    fetch(driver, link_list, delay)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2016-12-10
    • 1970-01-01
    • 2015-02-06
    • 2020-09-30
    • 2018-12-03
    相关资源
    最近更新 更多