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
766 views
in Technique[技术] by (71.8m points)

python - ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine

For some reason I get the following error only when I open up a nested webdriver instance. No idea what is happening here.

I am using Windows 10, geckodriver 0.21.0, and Python 3.7.

ConnectionAbortedError: [WinError 10053]

An established connection was aborted by the software in your host machine

Part of Script That Is Working Fine

tab_backers = ff.find_element_by_xpath('//a[@gogo-test="backers_tab"]')

try:
    funding_backers_count = int(''.join(filter(str.isdigit, str(tab_backers.text))))
except ValueError:
    funding_backers_count = 0

if funding_backers_count > 0:
    tab_backers.click()

    see_more_backers = WebDriverWait(ff, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//ui-view//a[text()="See More Backers"]'))
    )
    clicks = 0
    while clicks < 0:
        clicks += 1
        ff.WebDriverWait(ff, 5).until(
            see_more_backers.click()
        )

    for container in ff.find_elements_by_xpath('//ui-view//div[@class="campaignBackers-pledge ng-scope"]'):
        backers_profile = container.find_elements_by_xpath('./*/div[@class="campaignBackers-pledge-backer-details"]/a')
        if len(backers_profile) > 0:
            backers_profile = backers_profile[0].get_attribute('href') 
        else:
            backers_profile = 'Unknown'
        backers_name = safe_encode(container.find_element_by_xpath('(./*/div[@class="campaignBackers-pledge-backer-details"]/*)[1]').text)
        backers_timestamp = container.find_element_by_xpath('./*/div[@class="campaignBackers-pledge-backer-details"]/div[contains(@class, "campaignBackers-pledge-backer-details-note")]').text
        backers_contribution = container.find_element_by_xpath('./*//*[contains(@class, "campaignBackers-pledge-amount-bold")]').text
        if backers_contribution != 'Private':
            backers_contribution = int(''.join(filter(str.isdigit, str(backers_contribution))))
        if backers_profile != 'Unknown':

Part of Script Causing System to Abort Connection

            _ff = create_webdriver_instance()
            _ff.get(backers_profile)
            _ff.quit()

Traceback

Traceback (most recent call last):
  File "C:UsersAnthonyDesktopest.py", line 271, in <module>
    backers_profile = container.find_elements_by_xpath('./*/div[@class="campaignBackers-pledge-backer-details"]/a')
  File "C:UsersAnthonyAppDataLocalProgramsPythonPython37libsite-packagesseleniumwebdriver
emotewebelement.py", line 381, in find_elements_by_xpath
    return self.find_elements(by=By.XPATH, value=xpath)
  File "C:UsersAnthonyAppDataLocalProgramsPythonPython37libsite-packagesseleniumwebdriver
emotewebelement.py", line 680, in find_elements
    {"using": by, "value": value})['value']
  File "C:UsersAnthonyAppDataLocalProgramsPythonPython37libsite-packagesseleniumwebdriver
emotewebelement.py", line 628, in _execute
    return self._parent.execute(command, params)
  File "C:UsersAnthonyAppDataLocalProgramsPythonPython37libsite-packagesseleniumwebdriver
emotewebdriver.py", line 318, in execute
    response = self.command_executor.execute(driver_command, params)
  File "C:UsersAnthonyAppDataLocalProgramsPythonPython37libsite-packagesseleniumwebdriver
emote
emote_connection.py", line 472, in execute
    return self._request(command_info[0], url, body=data)
  File "C:UsersAnthonyAppDataLocalProgramsPythonPython37libsite-packagesseleniumwebdriver
emote
emote_connection.py", line 495, in _request
    self._conn.request(method, parsed_url.path, body, headers)
  File "C:UsersAnthonyAppDataLocalProgramsPythonPython37libhttpclient.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:UsersAnthonyAppDataLocalProgramsPythonPython37libhttpclient.py", line 1275, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:UsersAnthonyAppDataLocalProgramsPythonPython37libhttpclient.py", line 1224, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:UsersAnthonyAppDataLocalProgramsPythonPython37libhttpclient.py", line 1055, in _send_output
    self.send(chunk)
  File "C:UsersAnthonyAppDataLocalProgramsPythonPython37libhttpclient.py", line 977, in send
    self.sock.sendall(data)
ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine

geckodriver.log

Here it is in a codepen, since it is wayyy too long!

create_webdriver_instance Function

def create_webdriver_instance():
    options = Options()
    options.add_argument('-headless')
    try:
        ua_string = random.choice(ua_strings)
        profile = webdriver.FirefoxProfile()
        profile.set_preference('general.useragent.override', ua_string)
        return webdriver.Firefox(profile) # profile, firefox_options=options
    except IndexError as error:
        print('
Section: Function to Create Instances of WebDriver
Culprit: random.choice(ua_strings)
IndexError: {}
'.format(error))
        return webdriver.Firefox() # firefox_options=options


Does anybody have any idea whatsoever what might be causing the connection to abort?


See Question&Answers more detail:os

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

1 Reply

0 votes
by (71.8m points)

This error message...

ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine

...implies that the initialization of a new WebBrowsing Session i.e. Firefox Browser session was aborted.


An established connection was aborted by the software in your host machine

As per your code attempt the error is clearly coming out create_webdriver_instance() function which contains:

try:
    ua_string = random.choice(ua_strings)
    profile = webdriver.FirefoxProfile()
    profile.set_preference('general.useragent.override', ua_string)
    return webdriver.Firefox(profile)

And:

except IndexError as error:
    print('
Section: Function to Create Instances of WebDriver
Culprit: random.choice(ua_strings)
IndexError: {}
'.format(error))
    return webdriver.Firefox()

So it is not exactly clear from which function you are facing this issue among return webdriver.Firefox(profile) or webdriver.Firefox().

Perhaps a closer look at the logs within codepen suggests the error is coming out from webdriver.Firefox(profile).


Reasons

There can be multiple reason behind this error:

  • Presence of anti-virus softwares.
  • Firewall blocking the ports.
  • Network Configuration.
  • Problem can be caused by CORS.
  • Due to enabling of HTTP keep-alive connections

Solution

The initial step would be find out if any software is blocking the connection to/from the server in your computer. Apart from that the probable solutions are:

  • Disable anti-virus softwares.
  • Disable firewall.
  • Ensure that /etc/hosts on your system contains the following entry:

    127.0.0.1   localhost.localdomain localhost
    
  • As per Connection was aborted by the software in your host machine you need to allow localhost routes like http://localhost:8080/reactive-commands

  • As per Keep-Alive connection to geckodriver 0.21.0 dropped after 5s of inactivity without re-connection using Selenium Python client

    • AutomatedTester: This issue is not because we are not connected at the time of doing a request. If that was the issue we would be getting a httplib.HTTPConnection exception being thrown. Instead a BadStatusLine is thrown when we do a connection and close it and try parse the response. Now this could be the python stdlib bug, httplib bug or selenium bug. A Python client to replace urllib with something else that does not exhibit the same defect with Keep-Alive connections is WIP.

    • andreastt: The geckodriver team is working on extending the server-side timeout value to something more reasonable. As I said, this would help mitigate this issue but not fundamentally fix it. In any case it is true that five seconds is probably too low to get real benefit from persistent HTTP connections, and that increasing it to something like 60 seconds would have greater performance.


Conclusion

Selenium 3.14.0 has just been released. If you are affected by this issue please upgrade accordingly.


References:


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

...