使用Firefox WebDriver处理“下载”窗口
我正在尝试使用Firefox的WebDriver,想问一下是否可以处理“下载”窗口(也就是接受或拒绝下载请求)?
比如,下面这段简单的代码:
import selenium.firefox.webdriver
dr = selenium.firefox.webdriver.WebDriver()
# Firefox is showed up.
# Let's say I'd want to download python.
dr.get('http://python.org/ftp/python/3.1.3/python-3.1.3.msi')
# Download window is showed up.
# How could I accept the download request?
# As I understand, the method below should return
# two handles but I get only main window's handle.
handles = dr.get_window_handles()
# Seems like WebDriver cannot "see" this popup.
我试过一些方法,但还没有找到解决办法。如果能给点提示,我会非常感激。
非常感谢,
- V
3 个回答
我在用capybara下载文件的时候遇到了这个问题,下载提示框让我停下来了。
SeleniumHQ : Selenium WebDriver
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.dir'] = "/Downloads"
profile['browser.download.folderList'] = 2
profile['browser.helperApps.neverAsk.saveToDisk'] = "audio/wav"
driver = Selenium::WebDriver.for :firefox, :profile => profile
driver.navigate.to('http://www.address.com/file.wav')
这个方法可以直接把文件下载到指定的文件夹里,不会弹出提示框哦 :)
我还发现了另一个选项:
使用Firefox和Watir-WebDriver自动保存文件的MIME类型判断
我之前试过watir,觉得它非常好用。
我觉得这个问题不是WebDriver设计的初衷,但我还是试着给你一些建议。Firefox的WebDriver里没有专门处理这种情况的功能,不过你可以尝试几种方法。
你可以用WebDriver脚本所用的配置文件打开Firefox,然后修改设置,让它总是保存文件,而不是每次都询问(路径是:选项 > 应用程序 > Windows安装包 - 设置为“保存文件”)。不过,这样的话,除非你被重定向到一个404页面,否则你无法知道文件是否正在下载。如果没有重定向,你可以检查一下同一配置文件的下载目录里是否有这个文件(路径是:选项 > 主界面 > 下载)。如果文件还在下载中,文件名会是WhateverFileName.ext.part。
另一个选择是使用不带界面的HTMLUnit驱动,直接访问下载链接,点击它,然后获取页面源代码(这就是文件的内容)。这种方法适用于文本文件,但我不能保证它对二进制文件也能一样有效,也不知道在这种情况下文件会怎么编码。
祝你好运!
一个解决办法是修改WebDriver的Firefox配置,让它自动把某些类型的文件下载到指定的文件夹里。
我不太确定在Python中怎么做(或者是否可以做到),但在Selenium的维基页面上的Ruby绑定页面里有提到这个方法(在“调整Firefox设置”部分)。