Wie mit sporadischen BadStatusLine, CannotSendRequest-Fehlern in Python WebDriver umzugehen ist
Seit wir damit begonnen haben, Selen-UI-Tests in Jenkins durchzuführen, haben wir eine kleine, aber ärgerliche Fehlerhäufigkeit während der Tests festgestellt. Wir erhalten BadStatusLine - und CannotSendRequest - Fehler bei scheinbar zufälligen Selen - Aktionen (Klicken, Beenden, Besuchen usw
Sie sehen normalerweise so aus:
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)
Dieser spezielle Fall stammt aus dem folgenden Stapel:
Selen == 2,44,0 python == 2.7.3 firefox == 34.0 jenkinsxvfb (Verwenden des Jenkins-Plugins für Headless-Displays)Obwohl wir gesehen haben, dass diese Fehler in vielen verschiedenen Versionspermutationen von Firefox / Selen ständig auftauchten.
Ich habe einen tcpdump ausgeführt, um die tatsächliche Anforderung zu erfassen, die direkt vor dem Auftreten des BadStatusLine-Fehlers gesendet wurde.
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"}
Response kommt mit 0 Bytes zurück. Die BadStatusLine wurde also durch eine leere Antwort verursacht, was Sinn macht.
Die Frage ist, warum der Server von Selenium eine leere Antwort zurückgibt. Wenn der Server ausfällt, erhalten wir dann keinen ConnectionError oder ähnliches?