python - instalar - ¿Cómo arreglar "WebDriverException: Mensaje: conexión rechazada"?
how to install selenium in python (3)
¿Qué conexión se rechaza aquí? ¿Cuál es el significado del mensaje de error?
La conexión entre la API del controlador web Python y su navegador web Firefox. Bueno, no la conexión en sí, sino que una sola solicitud que envió el controlador web fue "rechazada" por el navegador. Tenga en cuenta que esto funciona a través del protocolo JSON Wire : JSON sobre HTTP.
¿Cómo puedo solucionar este error?
Por lo general, en caso de error como este, la razón más común es un
problema de compatibilidad
.
En otras palabras, sospecho que su
geckodriver
versión 0.18.0 es demasiado antigua para Firefox 57
.
Actualice
geckodriver
a la última versión estable (actualmente
GeckoDriver
).
Estoy usando una configuración muy compleja para probar varias páginas web no públicas.
Utilizo
jenkins
para ejecutar las pruebas de
python-selenium
dentro de una imagen
docker
.
De esa manera, soy completamente independiente del entorno jenkins y puedo crear mi propio entorno.
En este entorno tengo instalado el siguiente software:
- Firefox: 57.0.1
- Geckodriver: 0.18.0
- pruebas de nariz: 1.3.7
- selenio: 3.8.0
Las pruebas de selenio crean el
WebDriver
la siguiente manera:
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)
donde
logfile
y
self.downloadpath
son dos rutas válidas en la configuración de la
self.downloadpath
acoplable.
Todo el conjunto de pruebas consta de 6 casos de prueba independientes, cada uno con la misma configuración que la anterior. Normalmente funcionan bien y se completan sin problemas.
Pero sin ningún cambio en las pruebas o la configuración general, una prueba a veces falla con el siguiente mensaje de error:
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
Tengo dos preguntas:
- ¿Qué conexión se rechaza aquí? ¿Cuál es el significado del mensaje de error?
- ¿Cómo puedo solucionar este error?
Anexo :
-
Cuando usé
time.sleep(10)
justo antes de la líneawebdriver.Firefox
, el error ya no apareció. ¿Debería poner esa línea en un bucle while-try-except?
El error que estás viendo es:
WebDriverException: Message: connection refused
Según la documentación,
WebDriverException
es la
excepción Webdriver base
que es la siguiente:
exception selenium.common.exceptions.WebDriverException(msg=None, screen=None, stacktrace=None)
Entonces, la
connection is refused here
significa que
Selenium
no puede establecer la conexión que desea establecer a través de:
self.driver = webdriver.Firefox(profile, log_path = logfile)
Una posible solución sería proporcionar el nombre completo del
logfile
de
logfile
junto con la
logical location
del
logfile
de
logfile
(desde el
Project Level
) de la siguiente manera:
self.driver = webdriver.Firefox(firefox_profile=profile, log_path=''./Log/geckodriver.log'')
Aquí puedes encontrar una
Discussion
similar
Nuevamente, como mencionó
When I used a time.sleep(10) just before the webdriver.Firefox line, the error did not show up anymore
, por lo que supongo que hubo una instancia de
GeckoDriver
y el cliente
Firefox Browser
activo anteriormente.
Por lo tanto, de manera similar a como lo mencionó @Florent B., debe proteger su script de enfrentar la
Condición Race Around
que puede derivarse de cualquiera de los siguientes:
- Accediendo al mismo archivo de registro por la nueva sesión que la sesión anterior aún no ha lanzado.
-
Accediendo al mismo
número de puerto
por
GeckoDriver
oMarionette
por la nueva sesión que la sesión anterior aún no ha lanzado. - Falta de acceso a la CPU
- Falta de memoria física
- Falta de memoria de intercambio
- Falta de caché de disco
- Falta de ancho de banda de red
-
Docker Image
quedó sin memoria
Aquí puede encontrar una
Discussion
similar.
Según las causas mencionadas anteriormente, debe seguir algunos pasos de la siguiente manera:
-
Utilice siempre la última versión lanzada del
cliente
Selenium-Python
, laWebDriver variant
(GeckoDriver
) yWeb Browser
(Firefox Browser
) -
Utilice siempre
quit ()
en el método
tearDown()
para que tanto elwebdriver
webclient
como elwebclient
se destruyan correctamente. -
Clean
el Project Workspace de suIDE
antes y después de ejecutar suTest Suite
. -
Clear
la memoria caché del navegador antes y después de la ejecución de susTests
-
Use la herramienta
CCleaner
regularmente para borrar las tareas del sistema operativo, incluidos losrust_mozprofile directories
obsoletosrust_mozprofile directories
.
Una solución rápida para probar para cualquier otra persona que esté luchando con este u otros errores similares: descubrí que al eliminar mi archivo
geckodriver.log
este error.
Esto está implícito en la parte "Limpiar el espacio de trabajo del proyecto" de la respuesta de DebanjanB, pero solo quería compartir la acción concreta que lo arregló para mí. Tenga en cuenta que no estaba usando un conjunto de pruebas como el póster original.
Me imagino que lo que me sucedió fue que tenía un
webdriver.Firefox
anterior
webdriver.Firefox
Instancias de
webdriver.Firefox
que nunca llegaron a
driver.close()
en mi código debido a un error en otra parte de mi código, que todavía estaba depurando, y no habían lanzado archivo de registro
geckodriver.log
.
Por lo tanto, me imagino que este problema también podría resolverse cambiando el nombre del archivo de registro o escribiendo en un archivo de registro diferente.