Контекст просмотра Selenium Python был удален. Использование Firefox и GeckoDriver - PullRequest
0 голосов
/ 25 октября 2019

Я использую Firefox GeckoDriver с Selenium для загрузки нескольких файлов для клиента на веб-сайте.

Установка выполняется в Digital Ocean с Docker.

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

Кажется, что все работает нормально, когда есть только один запрос, что означает только один экземпляр браузера на сервере, но когда их несколькозапросы, которые означают множественные экземпляры браузера на сервере, некоторые из них прерываются, выдавая сообщение об ошибке «контекст просмотра удален».

Это происходит либо во время сканирования, либо сразу после создания экземпляра.

Нет особой картины этой ошибки, она происходит случайным образом и нарушает работу браузера. Я рассмотрел, вероятно, все вопросы и проблемы GitHub по этой теме, но некоторые из них - слишком старые обходные пути, которые не работают в текущей версии, а некоторые вообще не работают.

Здесьэто версия браузера и конфигурации, на которых я работаю в Jenkins.

`
{'browserName': 'firefox', 
'marionette': True, 
'acceptInsecureCerts': True, 
'moz:firefoxOptions': {
    'prefs': {
               'browser.download.folderList': 2, 
               'browser.download.dir': '/home/usr/usr/project/static/785fg7', 
               'browser.download.useDownloadDir': True, 
               'pdfjs.disabled': True, 
               'browser.helperApps.neverAsk.saveToDisk':
                                  'application/vnd.openxmlformats- 
                                   officedocument.spreadsheetml.sheet,
                                   application/pdf,
                                   application/csv,application/excel,
                                   application/vnd.msexcel,
                                   application/vnd.ms-excel,text/anytext,
                                   text/comma-separated-values,
                                   text/csv,application/vnd.ms-excel,
                                   application/octet-stream,
                                   image/tiff'}, 
           'args': ['-headless', 
                    '--no-sandbox', 
                    '--disable-setuid-sandbox', 
                    '--disable-dev-shm-usage', 
                    '--window-size=1920,1080', 
                    '--start-maximized']}} `

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

Вот код Python для запуска браузера.

def get_firefox_driver_for_linux_server(apply_proxy, uuid_user, download_options=False):

    firefox_options = Options()

    firefox_options.set_headless()

    if download_options:
        if not os.path.exists(constants.DOWNLOADS_PATH):
            os.mkdir(constants.DOWNLOADS_PATH)

        download_path = os.path.join(constants.DOWNLOADS_PATH, uuid_user)
        firefox_options.set_preference("browser.download.folderList", 2)
        firefox_options.set_preference("browser.download.dir", download_path)
        firefox_options.set_preference("browser.download.useDownloadDir", True)
        firefox_options.set_preference("pdfjs.disabled", True)
            firefox_options.set_preference("browser.helperApps.neverAsk.saveToDisk",
                                       "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,"
                                       "application/pdf,"
                                       "application/csv,"
                                       "application/excel,"
                                       "application/vnd.msexcel,"
                                       "application/vnd.ms-excel,"
                                       "text/anytext,"
                                       "text/comma-separated-values,"
                                       "text/csv,"
                                       "application/vnd.ms-excel,"
                                       "application/octet-stream,"
                                       "image/tiff")

    firefox_options.add_argument("--no-sandbox")
    firefox_options.add_argument("--disable-setuid-sandbox")
    firefox_options.add_argument('--disable-dev-shm-usage')
    firefox_options.add_argument("--window-size=1920,1080")
    firefox_options.add_argument("--start-maximized")

    if not os.path.exists(constants.LOG_PATH):
        os.mkdir(constants.LOG_PATH)


    import random as r
    global random_id
    random_id = str(r.randint(1, 99999))
    logging.warning("random id...{}".format(random_id))
    with open(os.path.join(constants.LOG_PATH, random_id + '.log'), 'w+') as lf:
        pass

    gecko_driver_path = "/usr/local/bin/geckodriver"
    if apply_proxy:
        proxy = "proxy:24000"
        firefox_capabilities = webdriver.DesiredCapabilities.FIREFOX
        firefox_capabilities['marionette'] = True
        firefox_capabilities['proxy'] = {
            "proxyType": "MANUAL",
            "httpProxy": proxy,
            "ftpProxy": proxy,
            "sslProxy": proxy
        }

        driver = webdriver.Firefox(executable_path=gecko_driver_path, firefox_options=firefox_options,
                                   capabilities=firefox_capabilities,
                                   log_path=os.path.join(constants.LOG_PATH, random_id + '.log'))
        check_gecko_version(driver, firefox_options)
        return driver
    else:
        logging.info("No proxy applied")
        driver = webdriver.Firefox(executable_path=gecko_driver_path, firefox_options=firefox_options)
        check_gecko_version(driver, firefox_options)
        return driver
...