Как бороться со спорадическими ошибками BadStatusLine, CannotSendRequest в python WebDriver

С тех пор как мы начали тестировать UI-тесты селена у дженкинсов, мы заметили небольшую, но раздражающую частоту ошибок во время тестов. Мы получаем ошибки BadStatusLine и CannotSendRequest на кажущиеся случайными действия селена (нажмите, закройте, зайдите и т. Д.).

Они обычно выглядят примерно так:

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) 

Этот конкретный случай исходил из следующего стека:

  • Селен == 2.44.0
  • питон == 2.7.3
  • светлячок == 34,0
  • Дженкинс
  • xvfb (с использованием плагина jenkins для безголовых дисплеев)

хотя мы видели, что эти ошибки возникали все время в разных версиях переименования firefox / selenium.

Я запустил tcpdump, чтобы захватить фактический запрос, отправленный непосредственно перед ошибкой BadStatusLine, и получил следующее.

  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"} 

Ответ возвращается с 0 байтами. Таким образом, BadStatusLine был вызван пустым ответом, что имеет смысл.

Вопрос в том, почему сервер селена вернет пустой ответ. Если сервер умер, разве мы не получим ConnectionError или что-то подобное?

One Solution collect form web for “Как бороться со спорадическими ошибками BadStatusLine, CannotSendRequest в python WebDriver”

Некоторое время у меня не было никакого реплики, и я не знал, в чем причина. Наконец, я смог воспроизвести, выполнив:

 import requests import json while True: requests.post('http://127.0.0.1/hub/session/', data=json.dumps({"url": "http://example.com/login", "sessionId": "ab64574a-4a17-447a-b2e8-5b0f5ed5e923"})) 

Пока это было запущено, я покинул браузер и получил ошибку BadStatusLine! Когда я попробовал повторить этот запрос, я получил ожидаемое «ConnectionError», которое вы увидите на любом мертвом сервере.

Я подозреваю, что когда браузер отправляется сигнал kill, во время его закрытия появляется короткое окно, где любой ответ все равно будет возвращен, но с 0 байтами. Вот почему вы получаете разные типы исключений по существу одной и той же проблемы (браузер умирает). Оказывается, у нас был cron, который убивал наши браузеры в фоновом режиме.

  • Многопоточность в selenium python
  • Как исправить Selenium WebDriverException: браузер, кажется, вышел, прежде чем мы могли подключиться?
  • Webdriver / Selenium: Как найти элемент, когда он не имеет имени класса, id или css селектор?
  • Python Selenium WebDriver drag-and-drop
  • Где я могу получить FirefoxDriver для WebDriver?
  • Подождите, пока перенаправление страницы Selenium WebDriver (Python)
  • Как навести указатель мыши на python Webdriver
  • Сценарий Selenium / WebDriver прерывается предупреждением - исключение «Сообщение: u'Modal dialog present»
  • Настроить реальный тайм-аут для загрузки страницы в Selenium WebDriver?
  • Чтение скрытого значения в div с использованием Selenium Python binding
  • Selenium python find_element_by_class_name () перестает работать с версии 2.2 до 2.21 - не может использовать 'Compound Class Name'
  • Python - лучший язык программирования в мире.