Cómo lidiar con errores esporádicos de BadStatusLine, CannotSendRequest en Python WebDriver
Desde que comenzamos a realizar pruebas de IU de selenio en jenkins, notamos una frecuencia pequeña pero molesta de errores durante las pruebas. Obtenemos errores BadStatusLine y CannotSendRequest en acciones de selenio aparentemente aleatorias (hacer clic, salir, visitar, etc.).
Por lo general, se verían algo así como:
File "/usr/lib/python2.7/unittest/case.py", line 327, in run
testMethod()
File "/home/jenkins/workspace/Create and Upload Functional Testing/shapeways/test_suite/Portal/CreateAndUpload/TestUploadWhenNotLoggedIn_ExpectLoginModal.py", line 22, in runTest
self.dw.visit(ShapewaysUrlBuilder.build_model_upload_url())
File "/home/jenkins/workspace/Create and Upload Functional Testing/webdriver/webdriverwrapper/WebDriverWrapper.py", line 212, in visit
return self.execute_and_handle_webdriver_exceptions(lambda: _visit(url))
File "/home/jenkins/workspace/Create and Upload Functional Testing/webdriver/webdriverwrapper/WebDriverWrapper.py", line 887, in execute_and_handle_webdriver_exceptions
return function_to_execute()
File "/home/jenkins/workspace/Create and Upload Functional Testing/webdriver/webdriverwrapper/WebDriverWrapper.py", line 212, in <lambda>
return self.execute_and_handle_webdriver_exceptions(lambda: _visit(url))
File "/home/jenkins/workspace/Create and Upload Functional Testing/webdriver/webdriverwrapper/WebDriverWrapper.py", line 205, in _visit
return self.driver.get(url)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 185, in get
self.execute(Command.GET, {'url': url})
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 171, in execute
response = self.command_executor.execute(driver_command, params)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/remote_connection.py", line 349, in execute
return self._request(command_info[0], url, body=data)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/remote_connection.py", line 380, in _request
resp = self._conn.getresponse()
File "/usr/lib/python2.7/httplib.py", line 1030, in getresponse
response.begin()
File "/usr/lib/python2.7/httplib.py", line 407, in begin
version, status, reason = self._read_status()
File "/usr/lib/python2.7/httplib.py", line 371, in _read_status
raise BadStatusLine(line)
Este caso particular vino de la siguiente pila:
selenio == 2.44.0python == 2.7.3firefox == 34.0jenkinsxvfb (usando el complemento jenkins para pantallas sin cabeza)aunque hemos visto estos errores aparecer todo el tiempo en muchas versiones diferentes de permutaciones de firefox / selenium.
Ejecuté un tcpdump para capturar la solicitud real enviada justo antes de que apareciera el error BadStatusLine y obtuve lo siguiente.
POST /hub/session/ab64574a-4a17-447a-b2e8-5b0f5ed5e923/url HTTP/1.1
Host: 127.0.0.1:41246
Accept-Encoding: identity Content-Length: 102
Connection: keep-alive
Content-type: application/json;charset="UTF-8"
POST: /hub/session/ab64574a-4a17-447a-b2e8-5b0f5ed5e923/url
Accept: application/json
User-Agent: Python http auth
{"url": "http://example.com/login", "sessionId": "ab64574a-4a17-447a-b2e8-5b0f5ed5e923"}
La respuesta vuelve con 0 bytes. Entonces BadStatusLine fue causado por una respuesta vacía, lo cual tiene sentido.
La pregunta es, ¿por qué el servidor de selenium devolvería una respuesta vacía? Si el servidor muriera, ¿no obtendríamos un ConnectionError o algo por el estilo?