Как исправить "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).