【Python】SeleniumでIEを使ってWebアクセスすると「ConnectionResetError: [WinError 10054] 既存の接続はリモート ホストに強制的に切断されました。」

ConnectionResetErrorが発生

SeleniumでInternet Explorerを操作するコードをPythonで書いていたところ、「ConnectionResetError: [WinError 10054] 既存の接続はリモート ホストに強制的に切断されました。」が発生しました。

同じコードをGoogle Chromeで動かすと問題なく動くのでIEと(Edge)だけがこの問題に直面していました。

GitHubもStack Overflowもヒットはするんですけど、有益な情報なしとかなり厳しい状況。そもそもIEを使ってる人なんていないんでしょうね。。。うちはクソ企業なので、社内システムがIEとEdgeのみに対応なので立ち向かう必要がありますが・・・

ソースコードと実行結果

ソースコード

ドライバを指定してWebアクセスをするというだけのシンプルな実装です。

# webdriver の情報
from selenium import webdriver

# ドライバの設定
driver = webdriver.Ie(r"C:\01_programs\webdriver\IEDriverServer.exe")
driver.get('https://google.com')


# ドライバの終了
driver.close()

実行結果ログ

>>>
================= RESTART: C:/Users/userName/Desktop/testCode.py =================
Traceback (most recent call last):
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 601, in urlopen
chunked=chunked)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 387, in _make_request
six.raise_from(e, None)
File "", line 2, in raise_from
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 383, in _make_request
httplib_response = conn.getresponse()
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\http\client.py", line 1331, in getresponse
response.begin()
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\http\client.py", line 297, in begin
version, status, reason = self._read_status()
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\http\client.py", line 258, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\socket.py", line 586, in readinto
return self._sock.recv_into(b)
ConnectionResetError: [WinError 10054] 既存の接続はリモート ホストに強制的に切断されました。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:/Users/userName/Desktop/testCode.py", line 5, in 
driver = webdriver.Ie(r"C:\01_programs\webdriver\IEDriverServer64.exe")
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\ie\webdriver.py", line 89, in __init__
desired_capabilities=capabilities)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 156, in __init__
self.start_session(capabilities, browser_profile)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 250, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 317, in execute
response = self.command_executor.execute(driver_command, params)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 375, in execute
return self._request(command_info[0], url, body=data)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 402, in _request
resp = http.request(method, url, body=body, headers=headers)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\request.py", line 70, in request
**urlopen_kw)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\request.py", line 148, in request_encode_body
return self.urlopen(method, url, **extra_kw)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\poolmanager.py", line 321, in urlopen
response = conn.urlopen(method, u.request_uri, **kw)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 639, in urlopen
_stacktrace=sys.exc_info()[2])
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\util\retry.py", line 357, in increment
raise six.reraise(type(error), error, _stacktrace)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\packages\six.py", line 685, in reraise
raise value.with_traceback(tb)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 601, in urlopen
chunked=chunked)
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 387, in _make_request
six.raise_from(e, None)
File "", line 2, in raise_from
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 383, in _make_request
httplib_response = conn.getresponse()
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\http\client.py", line 1331, in getresponse
response.begin()
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\http\client.py", line 297, in begin
version, status, reason = self._read_status()
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\http\client.py", line 258, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "C:\Users\userName\AppData\Local\Continuum\anaconda3\lib\socket.py", line 586, in readinto
return self._sock.recv_into(b)
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, '既存の接続はリモート ホストに強制的に切断されました。', None, 10054, None))
>>>

原因と解決方法

原因

実行環境がWidows10(64bi)とIE(64bit)とWebDriver(64bit用)を使用していたのが原因でした。

64bit環境で動作していたので、何も考えずに64bitのWebDriver入れてました。何がいけないのかさっぱりですが、どうも相性が悪い場合があるらしい。他のPCで同じことを試してみたら64bitのWebDriverで普通に動いたので、本当によくわかりません。

解決方法

IEのWebDriverを32bitのものに差し替えるだけです。

公式サイトからダウンロードして、パスを差し替えましょう。

これで無事に動くようになりました。

情報少ない上に、ログやソース読んでもわからない系の問題って厄介ですよね。