Продолжить сценарий селена после ошибки «Не удалось декодировать ответ от марионетки» - PullRequest
1 голос
/ 14 июня 2019

У меня есть скрипт на python, который перечисляет заголовок длинного списка сайтов. Это занимает много времени, поэтому скрипт должен работать часами. Однако время от времени я получаю сообщение об ошибке «Не удалось декодировать ответ от марионетки».

Учитывая то, что я прочитал, не похоже, что причина ошибки полностью известна. Для меня не является приоритетом избавляться от него, а скорее вообще не останавливать сценарий, когда он происходит, что в настоящее время происходит, когда выдается ошибка.

Как бы я это сделал?

Это код:

from pyvirtualdisplay import Display
from time import sleep
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.firefox.options import Options
display = Display(visible=0, size(800,600))
display.start()
urlsFile = open ("urls.txt", "r")
urls = urlsFile.readLines()
driver = webdriver.Firefox(executable_path='/usr/local/lib/geckodriver/geckodriver')
driver.set_page_load_timeout(60)
for url in urls:
        try:
           driver.get(url)
           sleep(0.8)
           print(driver.title)
        except TimeoutException as e:
           print("Timeout")

1 Ответ

0 голосов
/ 14 июня 2019

Примечание: это моя первая попытка написания Python


. Вам просто нужно собрать способ повторить операцию GET, если она не удалась.Вы по-прежнему хотите отказаться от определенного количества повторных попыток, но по крайней мере это должно отразить одноразовые сбои для URL.

def retryable_get(self, url, max_tries = 5)
  attempts = 0
  while attempts < max_tries
    try:
      self.get(url)
    except Exception:
      puts 'An error occured performing a GET to ' + url
    finally:
      attempts += 1
  raise TimeoutException(f'Failed to GET {url} after {max_tries} attempts')

Вы можете вызвать его, используя:

retryable_get(driver, url)

Или введите тип Firefox, если вам нужен более объектно-ориентированный подход:

webdriver.Firefox.retryable_get = retryable_get

for url in urls:
  try:
    driver.retryable_get(url)
    sleep(0.8)
    print(driver.title)
  except TimeoutException as e:
    print("Timeout")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...