Максимальная ошибка рекурсии при вызове Selenium's driver.get () - PullRequest
1 голос
/ 17 апреля 2019

Я использую селен для запуска автоматических скриптов в Python.Я использовал инструмент в течение трех лет, но никогда не сталкивался с этой проблемой.Кто-нибудь знает, что может быть причиной этого?Мне удалось определить, что причиной ошибки была ссылка на driver.get() внутри цикла for, но она выдает ошибку после 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"]')

1 Ответ

0 голосов
/ 18 апреля 2019

Это может быть содержимое link_lst, если на одном из хостов есть тайм-аут. Вы должны обработать это исключение, чтобы продолжить. Один из возможных вариантов - использовать попытку / исключение по таймауту, а также не иметь возможности найти элемент страницы. Это можно настроить как в качестве параметра задержки, так и в настройках профиля 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)
...