Селен на Heroku Celery Chrome Безголовый сбой после нескольких заданий - PullRequest
1 голос
/ 11 марта 2020

Я настроил селен с chrome на heroku и настроил его на обработку сельдерея. Однако после выполнения ряда задач (возможно, задач с ошибками) происходит сбой на любом сайте, который нужно очистить. Если я перезапущу работника сельдерея, он снова начнет работать на тех же сайтах, на которых он только что разбился.

Вот ошибка:

File "/app/cheetahiq_selenium/browser.py", line 18, in chrome
'CHROMEDRIVER_PATH', ''), chrome_options=chrome_options)
File "/app/.heroku/python/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
desired_capabilities=desired_capabilities)
File "/app/.heroku/python/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
self.start_session(capabilities, browser_profile)
File "/app/.heroku/python/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "/app/.heroku/python/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/app/.heroku/python/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.SessionNotCreatedException: Message: session not created
from tab crashed
(Session info: headless chrome=80.0.3987.122)

Вот флаги, которые я устанавливаю:


    chrome_options = webdriver.ChromeOptions()

    prefs = {
        "download.open_pdf_in_system_reader": False,
        "download.prompt_for_download": True,
        "plugins.always_open_pdf_externally": False
    }
    chrome_options.add_experimental_option(
        "prefs", prefs
    )
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('--window-size=1280x1696')
    chrome_options.add_argument('--hide-scrollbars')
    chrome_options.add_argument('--single-process')
    chrome_options.add_argument('--ignore-certificate-errors')
    chrome_options.add_argument('--disable-dev-shm-usage')
    if os.environ.get('ON_HEROKU', False):
        chrome_options.binary_location = os.environ.get(
            'GOOGLE_CHROME_BIN', '')
        driver = webdriver.Chrome(executable_path=os.environ.get(
            'CHROMEDRIVER_PATH', ''), chrome_options=chrome_options)
    else:
        driver = webdriver.Chrome(chrome_options=chrome_options)
    chrome_options.add_argument("--example-flag")
    driver.delete_all_cookies()
    return driver

Для сельдерея я также задаю

--concurrency=1 --max-tasks-per-child=1

, поэтому он создает нового дочернего элемента для каждой задачи, но что-то все еще передается на будущие сеансы.

Я предполагаю, что есть некоторый объем памяти, который драйвер chrome сохраняет на машине, который не очищается каждый раз, но я думаю, что я установил флаги, чтобы отключить как можно больше. Я что-то там пропускаю?

У меня есть возможность принудительно перезапускать работника сельдерея каждый раз, но я ищу, как правильно настроить драйвер селена.

Я тестирую несколько флагов и способов закрытия драйверов, но пока не увенчались успехом (это не легко воспроизвести, так как это происходит только после обработки нескольких сайтов или, возможно, появления какой-либо ошибки в драйвере).

...