Selenium 使用远程 Web 驱动程序下载文件
Posted
技术标签:
【中文标题】Selenium 使用远程 Web 驱动程序下载文件【英文标题】:Selenium Downloading Files using Remote Web Driver 【发布时间】:2012-08-17 07:30:10 【问题描述】:我正在使用 python 和 selenium 中的远程 Web 驱动程序来尝试从 Google Mini 生成和下载报告(xml 文件)。我生成文件很好,并且能够选择导出链接。但是有没有一种简单的方法可以指示远程 webdriver 将该链接下载到文件中?
【问题讨论】:
为什么不urllib.urlretrieve()
?
因为虽然我可以选择要单击以导出文件的元素,但如果我 urlretrieve url,我实际上会得到一个 html 页面而不是我期望的 xml 页面。但是当 selenium 点击元素时,webdriver 服务器报告它得到了一个 xml 页面。
如果您已经下载了,只需将页面保存到本地文件:with open(filename, "wb") as file: file.write(driver.page_source)
不幸的是,如果我尝试执行 driver.get(url),它会抛出一个错误:15:41:20.275 WARN - Failed parsing XML document search.example.com:8443/…: Element type "topQuery"必须后跟属性规范“>”或“/>”。所以我认为它正在尝试解析我不需要的 XML 文件 - Google Mini 有时会像“Accept
标头以使用 urllib2 获取 XML 而不是 HTML?您可以使用网络嗅探器(例如 wireshark)来找出使用 urllib2 和 webdriver 的请求有何不同。
【参考方案1】:
好吧,我没有找到让 Chrome 不将 xml 显示为页面而不是下载为文件的方法。似乎取决于How to download an XML without the browser opening it in another tab 的页面设计。
但是,我们可以为远程 Web 驱动程序设置首选项。 Remote() 包含一个 desired_capabilities 参数,可以传递与文件下载相关的首选项:options.to_capabilities()
from selenium import webdriver
options = webdriver.ChromeOptions()
prefs = 'profile.default_content_settings.popups': 0,
'download.default_directory': download_path
options.add_experimental_option('prefs', prefs)
pprint(options.to_capabilities())
driver = webdriver.Remote(command_executor='http://camutil_selenium_1:4444/wd/hub',
desired_capabilities=options.to_capabilities())
上面的 pprint 输出:
'browserName': 'chrome',
'chromeOptions': 'args': [],
'extensions': [],
'prefs': 'download.default_directory': '/some/path/',
'profile.default_content_settings.popups': 0,
'javascriptEnabled': True,
'platform': 'ANY',
'version': ''
现在您可以使用 driver.get(dl_url) 开始下载 Chrome 未显示扩展名的文件,该文件将保存到 download_path。注意:这只会开始下载,您可能需要添加逻辑以等待下载完成。
【讨论】:
这对我不起作用。检查文件是否存在会出错。不使用 remote Web 驱动程序也可以正常工作...以上是关于Selenium 使用远程 Web 驱动程序下载文件的主要内容,如果未能解决你的问题,请参考以下文章
Selenium 3.0 Firefx 驱动程序失败并出现 org.openqa.selenium.SessionNotCreatedException:无法创建新的远程会话
带有Python的Selenium Webdriver - 无法使用Selenium Web驱动程序在Web应用程序中提供输入(Date)