Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
383 views
in Technique[技术] by (71.8m points)

python - MaxRetryError: HTTPConnectionPool: Max retries exceeded (Caused by ProtocolError('Connection aborted.', error(111, 'Connection refused')))

I have one question:I want to test "select" and "input".can I write it like the code below: original code:

 12 class Sinaselecttest(unittest.TestCase):
 13 
 14     def setUp(self):
 15         binary = FirefoxBinary('/usr/local/firefox/firefox')
 16         self.driver = webdriver.Firefox(firefox_binary=binary)
 17 
 18     def test_select_in_sina(self):
 19         driver = self.driver
 20         driver.get("https://www.sina.com.cn/")
 21         try:
 22             WebDriverWait(driver,30).until(
 23                 ec.visibility_of_element_located((By.XPATH,"/html/body/div[9]/div/div[1]/form/div[3]/input"))
 24             )
 25         finally:
 26             driver.quit()
 # #测试select功能
 27         select=Select(driver.find_element_by_xpath("//*[@id='slt_01']")).select_by_value("微博")
 28         element=driver.find_element_by_xpath("/html/body/div[9]/div/div[1]/form/div[3]/input")
 29         element.send_keys("杨幂")
 30         driver.find_element_by_xpath("/html/body/div[9]/div/div[1]/form/input").click()
 31         driver.implicitly_wait(5)

 32    def tearDown(self):
 33        self.driver.close()

I want to test Selenium "select" function.so I choose sina website to select one option and input text in textarea.then search it .but when I run this test,it has error:

 Traceback (most recent call last):
      File "test_sina_select.py", line 32, in tearDown
        self.driver.close()
      File "/usr/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 688, in close
        self.execute(Command.CLOSE)
      File "/usr/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 319, in execute
        response = self.command_executor.execute(driver_command, params)
      File "/usr/lib/python2.7/site-packages/selenium/webdriver/remote/remote_connection.py", line 376, in execute
        return self._request(command_info[0], url, body=data)
      File "/usr/lib/python2.7/site-packages/selenium/webdriver/remote/remote_connection.py", line 399, in _request
        resp = self._conn.request(method, url, body=body, headers=headers)
      File "/usr/lib/python2.7/site-packages/urllib3/request.py", line 68, in request
        **urlopen_kw)
      File "/usr/lib/python2.7/site-packages/urllib3/request.py", line 81, in request_encode_url
        return self.urlopen(method, url, **urlopen_kw)
      File "/usr/lib/python2.7/site-packages/urllib3/poolmanager.py", line 247, in urlopen
        response = conn.urlopen(method, u.request_uri, **kw)
      File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 617, in urlopen
        release_conn=release_conn, **response_kw)
      File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 617, in urlopen
        release_conn=release_conn, **response_kw)
      File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 617, in urlopen
        release_conn=release_conn, **response_kw)
      File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 597, in urlopen
        _stacktrace=sys.exc_info()[2])
      File "/usr/lib/python2.7/site-packages/urllib3/util/retry.py", line 271, in increment
        raise MaxRetryError(_pool, url, error or ResponseError(cause))
    MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=51379): Max retries exceeded with url: /session/2e64d2a1-3c7f-4221-96fe-9d0b1c102195/window (Caused by ProtocolError('Connection aborted.', error(111, 'Connection refused')))
    
    ----------------------------------------------------------------------
    Ran 1 test in 72.106s

who can tell me why?thanks

Question&Answers:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This error message...

MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=51379): Max retries exceeded with url: /session/2e64d2a1-3c7f-4221-96fe-9d0b1c102195/window (Caused by ProtocolError('Connection aborted.', error(111, 'Connection refused')))

...implies that the call to self.driver.close() method failed raising MaxRetryError.


A couple of things:

  • First and foremost as per the discussion max-retries-exceeded exceptions are confusing the traceback is somewhat misleading. Requests wraps the exception for the users convenience. The original exception is part of the message displayed.

  • Requests never retries (it sets the retries=0 for urllib3's HTTPConnectionPool), so the error would have been much more canonical without the MaxRetryError and HTTPConnectionPool keywords. So an ideal Traceback would have been:

      ConnectionError(<class 'socket.error'>: [Errno 1111] Connection refused)
    
  • But again @sigmavirus24 in his comment mentioned ...wrapping these exceptions make for a great API but a poor debugging experience...

  • Moving forward the plan was to traverse as far downwards as possible to the lowest level exception and use that instead.

  • Finally this issue was fixed by rewording some exceptions which has nothing to do with the actual connection refused error.


Solution

Even before self.driver.close() within tearDown(self) is invoked, the try{} block within test_select_in_sina(self) includes finally{} where you have invoked driver.quit()which is used to call the /shutdown endpoint and subsequently the web driver & the client instances are destroyed completely closing all the pages/tabs/windows. Hence no more connection exists.

You can find a couple of relevant detailed discussion in:

In such a situation when you invoke self.driver.close() the client is unable to locate any active connection to initiate a clousure. Hence you see the error.

So a simple solution would be to remove the line driver.quit() i.e. remove the finally block.


tl; dr

As per the Release Notes of Selenium 3.14.1:

* Fix ability to set timeout for urllib3 (#6286)

The Merge is: repair urllib3 can't set timeout!


Conclusion

Once you upgrade to Selenium 3.14.1 you will be able to set the timeout and see canonical Tracebacks and would be able to take required action.


References

A couple of relevent references:


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...