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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage