title: How to fix python-selenium error "connection refused" when initializing a selenium webdriver?
body: <p>I am running very complex python-selenium tests on non-public webpages. In most cases these tests run fine, but sometimes one of these tests fail during the initialization of the webdriver itself. </p>
  
  <p>Hint: This error happens when trying to initialize a webdriver, i.e. when doing something like this:</p>
  
  <pre><code># Start of the tests
  mydriver =  webdriver.Firefox(firefox_profile=profile, log_path=logfile)
  # ERROR HAPPENS HERE
  
  # Doing other stuff here
  ....
  # Doing tests here
  ....
  # Doing shutdown here
  mydriver.quit()
  </code></pre>
  
  <p>Here is a full example of such an error:</p>
  
  <pre><code>___________ ERROR at setup of TestSuite.test_synaptic_events_fitting ___________
  
  &gt;   lambda: ihook(item=item, **kwds),
      when=when,
              )
  
  /usr/local/lib/python2.7/dist-packages/flaky/flaky_pytest_plugin.py:273: 
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
  conftest.py:157: in basedriver
      mydriver = firefox.get_driver(*args)
  bsp_usecase_tests/tools/firefox.py:44: in get_driver
      driver = webdriver.Firefox(firefox_profile=profile, log_path=logfile)  #### INITIALIZING OF WEBDRIVER HERE
  /usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py:158: in __init__
      keep_alive=True)
  /usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:154: in __init__
      self.start_session(desired_capabilities, browser_profile)
  /usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:243: in start_session
      response = self.execute(Command.NEW_SESSION, parameters)
  /usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:311: in execute
      self.error_handler.check_response(response)
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
  
  self = &lt;selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7efd3b702f90&gt;
  response = {'status': 500, 'value': '{"value":{"error":"unknown error","message":"connection refused","stacktrace":"stack backtra...s::imp::thread::{{impl}}::new::thread_start\n                        at /checkout/src/libstd/sys/unix/thread.rs:84"}}'}
  
      def check_response(self, response):
          """
              Checks that a JSON response from the WebDriver does not have an error.
  
              :Args:
               - response - The JSON response from the WebDriver server as a dictionary
                 object.
  
              :Raises: If the response contains an error message.
              """
          status = response.get('status', None)
          if status is None or status == ErrorCode.SUCCESS:
              return
          value = None
          message = response.get("message", "")
          screen = response.get("screen", "")
          stacktrace = None
          if isinstance(status, int):
              value_json = response.get('value', None)
              if value_json and isinstance(value_json, basestring):
                  import json
                  try:
                      value = json.loads(value_json)
                      if len(value.keys()) == 1:
                          value = value['value']
                      status = value.get('error', None)
                      if status is None:
                          status = value["status"]
                          message = value["value"]
                          if not isinstance(message, basestring):
                              value = message
                              message = message.get('message')
                      else:
                          message = value.get('message', None)
                  except ValueError:
                      pass
  
          exception_class = ErrorInResponseException
          if status in ErrorCode.NO_SUCH_ELEMENT:
              exception_class = NoSuchElementException
          elif status in ErrorCode.NO_SUCH_FRAME:
              exception_class = NoSuchFrameException
          elif status in ErrorCode.NO_SUCH_WINDOW:
              exception_class = NoSuchWindowException
          elif status in ErrorCode.STALE_ELEMENT_REFERENCE:
              exception_class = StaleElementReferenceException
          elif status in ErrorCode.ELEMENT_NOT_VISIBLE:
              exception_class = ElementNotVisibleException
          elif status in ErrorCode.INVALID_ELEMENT_STATE:
              exception_class = InvalidElementStateException
          elif status in ErrorCode.INVALID_SELECTOR \
                  or status in ErrorCode.INVALID_XPATH_SELECTOR \
                  or status in ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPER:
              exception_class = InvalidSelectorException
          elif status in ErrorCode.ELEMENT_IS_NOT_SELECTABLE:
              exception_class = ElementNotSelectableException
          elif status in ErrorCode.ELEMENT_NOT_INTERACTABLE:
              exception_class = ElementNotInteractableException
          elif status in ErrorCode.INVALID_COOKIE_DOMAIN:
              exception_class = InvalidCookieDomainException
          elif status in ErrorCode.UNABLE_TO_SET_COOKIE:
              exception_class = UnableToSetCookieException
          elif status in ErrorCode.TIMEOUT:
              exception_class = TimeoutException
          elif status in ErrorCode.SCRIPT_TIMEOUT:
              exception_class = TimeoutException
          elif status in ErrorCode.UNKNOWN_ERROR:
              exception_class = WebDriverException
          elif status in ErrorCode.UNEXPECTED_ALERT_OPEN:
              exception_class = UnexpectedAlertPresentException
          elif status in ErrorCode.NO_ALERT_OPEN:
              exception_class = NoAlertPresentException
          elif status in ErrorCode.IME_NOT_AVAILABLE:
              exception_class = ImeNotAvailableException
          elif status in ErrorCode.IME_ENGINE_ACTIVATION_FAILED:
              exception_class = ImeActivationFailedException
          elif status in ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS:
              exception_class = MoveTargetOutOfBoundsException
          elif status in ErrorCode.JAVASCRIPT_ERROR:
              exception_class = JavascriptException
          elif status in ErrorCode.SESSION_NOT_CREATED:
              exception_class = SessionNotCreatedException
          elif status in ErrorCode.INVALID_ARGUMENT:
              exception_class = InvalidArgumentException
          elif status in ErrorCode.NO_SUCH_COOKIE:
              exception_class = NoSuchCookieException
          elif status in ErrorCode.UNABLE_TO_CAPTURE_SCREEN:
              exception_class = ScreenshotException
          elif status in ErrorCode.ELEMENT_CLICK_INTERCEPTED:
              exception_class = ElementClickInterceptedException
          elif status in ErrorCode.INSECURE_CERTIFICATE:
              exception_class = InsecureCertificateException
          elif status in ErrorCode.INVALID_COORDINATES:
              exception_class = InvalidCoordinatesException
          elif status in ErrorCode.INVALID_SESSION_ID:
              exception_class = InvalidSessionIdException
          elif status in ErrorCode.UNKNOWN_METHOD:
              exception_class = UnknownMethodException
          else:
              exception_class = WebDriverException
          if value == '' or value is None:
              value = response['value']
          if isinstance(value, basestring):
              if exception_class == ErrorInResponseException:
                  raise exception_class(response, value)
              raise exception_class(value)
          if message == "" and 'message' in value:
              message = value['message']
  
          screen = None
          if 'screen' in value:
              screen = value['screen']
  
          stacktrace = None
          if 'stackTrace' in value and value['stackTrace']:
              stacktrace = []
              try:
                  for frame in value['stackTrace']:
                      line = self._value_or_default(frame, 'lineNumber', '')
                      file = self._value_or_default(frame, 'fileName', '&lt;anonymous&gt;')
                      if line:
                          file = "%s:%s" % (file, line)
                      meth = self._value_or_default(frame, 'methodName', '&lt;anonymous&gt;')
                      if 'className' in frame:
                          meth = "%s.%s" % (frame['className'], meth)
                      msg = "    at %s (%s)"
                      msg = msg % (meth, file)
                      stacktrace.append(msg)
              except TypeError:
                  pass
          if exception_class == ErrorInResponseException:
              raise exception_class(response, message)
          elif exception_class == UnexpectedAlertPresentException and 'alert' in value:
              raise exception_class(message, screen, stacktrace, value['alert'].get('text'))
  &gt;       raise exception_class(message, screen, stacktrace)
  E       WebDriverException: Message: connection refused
  
  /usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py:237: WebDriverException
  </code></pre>
  
  <p>These tests are running as part of a jenkins plan inside a docker container, to ensure the exact same environment all the time. Here is a list of the used packages and their versions:</p>
  
  <ul>
  <li>python 2.7.12</li>
  <li>pytest 3.6.1</li>
  <li>selenium 3.8.0</li>
  <li>geckodriver 0.19.1</li>
  <li>firefox 62.0</li>
  <li>flaky 3.4.0</li>
  </ul>
  
  <p>The error roughly appears in about 1% of all tests. There are about 15 different tests, and the error seem to appear randomly (i.e. not always the same test). </p>
  
  <p>Is this a bug in firefox/selenium/geckodriver? And is there a way to fix this?</p>
  
  <p>The following code snippet <strong>is not some code I am using</strong>! It is just an idea of how to fix my problem described above. Is this maybe a good way to solve my original problem, or not?</p>
  
  <pre><code>while counter&lt;5:
      try:
          webdriver = webdriver.Firefox(firefox_profile=profile, log_path=logfile) 
          break
      except WebDriverException:
          counter +=1
  </code></pre>
  
  <p>Is there a better way to do this?</p>