Как исправить "WebDriverException: Сообщение: соединение отказано"?

Я использую очень сложную настройку для тестирования различных непубличных веб-страниц. Я использую jenkins для запуска тестов python-selenium в формате docker. Таким образом, я полностью независим от среды jenkins и могу создать свою собственную среду. В этой среде у меня установлено следующее программное обеспечение:

  • Firefox: 57.0.1
  • geckodriver: 0.18.0
  • nosetests: 1.3.7
  • selenium: 3.8.0

Тесты селена создают WebDriver следующим образом:

profile = webdriver.FirefoxProfile()
profile.set_preference("browser.download.dir", self.downloadpath)
profile.set_preference("browser.download.folderList", 2)
profile.set_preference("browser.download.useDownloadDir", True)
profile.set_preference("browser.download.manager.showWhenStarting", False)
profile.set_preference("pdfjs.disabled", True)
profile.set_preference("browser.helperApps.neverAsk.saveToDisk",
"application/force-download, image/png, text/html, text/plain, "
"image/tiff, text/csv, application/zip, application/octet-stream")
profile.set_preference("browser.download.manager.alertOnEXEOpen", False)
profile.set_preference("browser.download.manager.focusWhenStarting", False)
profile.set_preference("browser.helperApps.alwaysAsk.force", False)
profile.set_preference("browser.download.manager.alertOnEXEOpen", False)
profile.set_preference("browser.download.manager.closeWhenDone", True)
profile.set_preference("browser.download.manager.showAlertOnComplete", False)
profile.set_preference("browser.download.manager.useWindow", False)
profile.set_preference("services.sync.prefs.sync.browser.download.manager.showWhenStarting",
False)
self.driver = webdriver.Firefox(profile, log_path = logfile)

где logfile и self.downloadpath - два допустимых пути в настройке докера.

Весь комплект тестов состоит из 6 независимых тестов, каждый из которых имеет ту же настройку, что и выше. Они нормально работают нормально и без проблем.

Но без каких-либо изменений для тестов или общей настройки, тест иногда терпит неудачу со следующим сообщением об ошибке:

  File "/root/tests/bsp_usecase_tests/tools/basicsuite.py", line 210, in set_driver_firefox
    self.driver = webdriver.Firefox(profile, log_path = logfile)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py", line 158, in __init__
    keep_alive=True)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 154, in __init__
    self.start_session(desired_capabilities, browser_profile)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 243, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 311, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 237, in check_response
    raise exception_class(message, screen, stacktrace)
WebDriverException: Message: connection refused

У меня есть два вопроса:

  • Отключена ли здесь связь? В чем смысл сообщения об ошибке
  • Как я могу исправить эту ошибку?

Добавление

  • Когда я использовал time.sleep(10) непосредственно перед строкой webdriver.Firefox, ошибка больше не отображалась. Shoud Я положил эту строку в цикл while-try-except?

Ответ 1

Ошибка, которую вы видите:

WebDriverException: Message: connection refused

В соответствии с документацией WebDriverException является исключением Base webdriver, которое выглядит следующим образом:

exception selenium.common.exceptions.WebDriverException(msg=None, screen=None, stacktrace=None)

Итак, connection is refused here означает, что Selenium не может установить соединение, которое вы хотите установить через:

self.driver = webdriver.Firefox(profile, log_path = logfile)

Возможным решением было бы предоставить полное имя logfile вместе с logical location logfile (от Project Level) следующим образом:

self.driver = webdriver.Firefox(firefox_profile=profile, log_path='./Log/geckodriver.log')

Здесь вы можете найти аналогичный Discussion

Опять же, как вы упомянули When I used a time.sleep(10) just before the webdriver.Firefox line, the error did not show up anymore, поэтому я предполагаю, что ранее существовал экземпляр GeckoDriver и Firefox Browser. Следовательно, так же, как @Florent B. упомянул, что вам нужно защитить свой script от облицовки Состояние гонки, которое может вытекать из одного из следующих:

  • Доступ к тому же файлу журнала с помощью нового сеанса, который ранее не был выпущен предыдущий сеанс.
  • Доступ к тому же номеру порта GeckoDriver или Marionette к новому сеансу, который ранее не был выпущен предыдущий сеанс.
  • Отсутствие доступа к ЦП
  • Отсутствие физической памяти
  • Отсутствие памяти обмена
  • Отсутствие Кэш диска
  • Отсутствие Пропускная способность сети
  • Docker Image вывел из памяти

Здесь вы можете найти аналогичный Discussion.

В соответствии с вышеупомянутыми причинами вам необходимо выполнить следующие шаги:

  • Всегда используйте последнюю выпущенную версию Selenium-Python клиент, WebDriver variant ( GeckoDriver) и Web Browser (Firefox Browser)
  • Всегда используйте quit() в методе tearDown(), чтобы webdriver и webclient оба были правильно уничтожены.
  • Clean Рабочая область проекта из IDE до и после выполнения Test Suite.
  • Clear Браузерный кэш до и после выполнения вашего Tests
  • Регулярно используйте инструмент CCleaner, чтобы стереть операционные системы ОС, включая устаревший rust_mozprofile directories.

Ответ 2

В чем здесь отказано? В чем смысл сообщения об ошибке

Соединение между API-интерфейсом Python и браузером Firefox. Ну, а не само соединение, а единственный запрос, который отправил веб-сервер, был "отклонен" браузером. Обратите внимание, что это работает через протокол JSON Wire - JSON через HTTP.

Как я могу исправить эту ошибку?

Обычно в случае ошибки, как это, наиболее распространенной причиной является проблема совместимости. Другими словами, я подозреваю, что ваша версия geckodriver 0.18.0 слишком устарела для Firefox 57. Обновите geckodriver до последней стабильной версии (в настоящее время 0.19.1).