<errno 32 =“” broken =“” pipe =“”>通过远程WebDriver上传大文件时

时间:2019-01-09 15:45:54

标签: python selenium

我必须使用1GB上传较大的文件(大小超过remote selenium server,但出现urllib.error.URLError <urlopen error [Errno 32] Broken pipe>错误。

这是python代码,包括remote驱动程序设置,如下所示:

from selenium.webdriver import ChromeOptions, Remote

options = ChromeOptions()
options.add_argument("--start-maximized")
remote = Remote(command_executor="http://localhost:9515",
                desired_capabilities=options.to_capabilities())
remote.find_element_by_css_selector('input[name="file"]'
                ).send_keys('path/to/file.iso'))

这是我有一个追溯示例错误:

ERROR:   File "/home/user/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py", line 475, in send_keys
ERROR:     value = self._upload(local_file)
ERROR:   File "/home/user/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py", line 692, in _upload
ERROR:     return self._execute(Command.UPLOAD_FILE, {'file': content})['value']
ERROR:   File "/home/user/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py", line 628, in _execute
ERROR:     return self._parent.execute(command, params)
ERROR:   File "/home/user/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 312, in execute
ERROR:     response = self.command_executor.execute(driver_command, params)
ERROR:   File "/home/user/.local/lib/python3.6/site-packages/selenium/webdriver/remote/remote_connection.py", line 472, in execute
ERROR:     resp = opener.open(request, timeout=self._timeout)
ERROR:   File "/usr/lib/python3.6/urllib/request.py", line 526, in open
ERROR:     response = self._open(req, data)
ERROR:   File "/usr/lib/python3.6/urllib/request.py", line 544, in _open
ERROR:     '_open', req)
ERROR:   File "/usr/lib/python3.6/urllib/request.py", line 504, in _call_chain
ERROR:     result = func(*args)
ERROR:   File "/usr/lib/python3.6/urllib/request.py", line 1346, in http_open
ERROR:     return self.do_open(http.client.HTTPConnection, req)
ERROR:   File "/usr/lib/python3.6/urllib/request.py", line 1320, in do_open
ERROR:     raise URLError(err)
ERROR: urllib.error.URLError: <urlopen error [Errno 32] Broken pipe>

请注意,文件大小为70mb以下的文件已成功上传,但是当我尝试上传较大的文件时,文件失败。

我使用python 3.6selenium 3.12.0chromedriver 2.42Chrome 71。我确实尝试过使用不同的硒,chromedriver和Chrome版本,但是出现了相同的错误。

我怀疑我可以使用某些 chromeoptions 来解决此问题,但还没有找到确切的解决方法。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果您使用Remote WebDriver,它将尝试将要上传的文件传输到远程主机(在您的情况下是从localhostlocalhost;但是,一般逻辑是从正在运行测试的主机到正在运行浏览器的主机)。

当您上传大文件时,在上传整个文件之前,对等方的套接字已关闭。这就是为什么您看到urllib.error.URLError: <urlopen error [Errno 32] Broken pipe>的原因。

解决方案:,您需要通过指定UselessFileDetector

来禁用文件传输
remote = Remote(
    command_executor="http://localhost:9515",
    desired_capabilities=options.to_capabilities(),
    file_detector=UselessFileDetector()
)

请注意,如果您的浏览器不在localhost上,则在使用Selenium上传文件之前,您必须注意传输文件。

编辑:您可以详细了解Selenium如何在https://extsoft.pro/selenium-large-files-upload/上上传文件