在Firefox中访问文件下载对话框
有没有什么API可以让我操纵Firefox中的文件下载对话框? (我想访问用户做某事时出现的那个,而不是自己发起一个)。
我想要做的就是从Selenium访问这个对话框(以及Selenium“特权模式”是否足以访问chrome接口,这是我不太确定的事情)。
从来没听说过。 但是,您可以将Firefoxconfiguration为自动启动下载并将文件保存在特定位置。 然后您的testing可以检查文件是否真的到达。
我有这个问题的解决scheme,检查代码:
FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("browser.download.folderList",2); firefoxProfile.setPreference("browser.download.manager.showWhenStarting",false); firefoxProfile.setPreference("browser.download.dir","c:\\downloads"); firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv"); WebDriver driver = new FirefoxDriver(firefoxProfile);//new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability); driver.navigate().to("http://www.myfile.com/hey.csv");
我被困在同样的问题,但我find了一个解决scheme。 我做了这个博客一样的方式。
当然这是Java,我把它翻译成Python:
fp = webdriver.FirefoxProfile() fp.set_preference("browser.download.folderList",2) fp.set_preference("browser.download.manager.showWhenStarting",False) fp.set_preference("browser.download.dir",getcwd()) fp.set_preference("browser.helperApps.neverAsk.saveToDisk","text/csv") browser = webdriver.Firefox(firefox_profile=fp)
在我的例子中,它是一个CSV文件。 但是当你需要更多的时候,存储在~/.mozilla/$USER_PROFILE/mimeTypes.rdf
Web应用程序生成3种不同types的popup窗口; 即,
1| JavaScript PopUps 2| Browser PopUps 3| Native OS PopUps [eg, Windows Popup like Upload/Download]
通常,JavaScriptpopup窗口由Web应用程序代码生成。 Selenium提供了一个API来处理这些JavaScriptpopup窗口,比如Alert
。
最后,忽略浏览器popup和下载文件的最简单方法是通过使用浏览器configuration文件来完成; 有几种方法可以做到这一点:
- 手动修改浏览器属性(或)
- 使用configuration文件setPreference自定义浏览器属性
方法1
在开始使用浏览器configuration文件的popup窗口之前,请确保将“下载”选项设置为“保存文件”。
(打开Firefox)工具>选项>应用程序
方法2
利用下面的代码片段,并在必要时进行编辑。
FirefoxProfile profile = new FirefoxProfile(); String path = "C:\\Test\\"; profile.setPreference("browser.download.folderList", 2); profile.setPreference("browser.download.dir", path); profile.setPreference("browser.download.manager.alertOnEXEOpen", false); profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream"); profile.setPreference("browser.download.manager.showWhenStarting", false); profile.setPreference("browser.download.manager.focusWhenStarting", false); profile.setPreference("browser.download.useDownloadDir", true); profile.setPreference("browser.helperApps.alwaysAsk.force", false); profile.setPreference("browser.download.manager.alertOnEXEOpen", false); profile.setPreference("browser.download.manager.closeWhenDone", true); profile.setPreference("browser.download.manager.showAlertOnComplete", false); profile.setPreference("browser.download.manager.useWindow", false); profile.setPreference("services.sync.prefs.sync.browser.download.manager.showWhenStarting", false); profile.setPreference("pdfjs.disabled", true); driver = new FirefoxDriver(profile);
我面临同样的问题。 在我们的应用程序中,FireFox的实例是通过如下传递DesiredCapabilities创build的
driver = new FirefoxDriver(capabilities);
根据别人的build议,我做了我的修改
FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream"); driver = new FirefoxDrvier(firefoxProfile);
这样做的目的,但不幸的是我的其他自动化testing开始失败。 原因是,我已经移除了早先通过的能力。
在网上浏览一些,find了一种替代方法。 我们可以在所需的function中设置configuration文件本身。
所以新的工作代码看起来像
DesiredCapabilities capabilities = DesiredCapabilities.firefox(); // add more capabilities as per your need. FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream"); // set the firefoxprofile as a capability capabilities.setCapability(FirefoxDriver.PROFILE, firefoxProfile); driver = new FirefoxDriver(capabilities);
不知道,但你也许可以检查一个Firefox下载插件的来源。
这里是我使用下载状态栏的源代码。
我有同样的问题,我不希望保存对话访问。
下面的代码可以帮助:
FirefoxProfile fp = new FirefoxProfile(); fp.setPreference("browser.download.folderList",2); fp.setPreference("browser.download.manager.showWhenStarting",false); fp.setPreference("browser.helperApps.alwaysAsk.force", false); // Below you have to set the content-type of downloading file(I have set simple CSV file) fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");
根据正在下载的文件types,您需要指定内容types。
您可以指定多个以' ; '分隔的内容types。 “
例如:
fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv;application/vnd.ms-excel;application/msword");
大多数浏览器(在我的情况下Firefox)默认select确定button。 所以我设法通过使用下面的代码解决这个问题。 它基本上按下input你的文件被下载。
Robot robot = new Robot(); // A short pause, just to be sure that OK is selected Thread.sleep(3000); robot.keyPress(KeyEvent.VK_ENTER); robot.keyRelease(KeyEvent.VK_ENTER);
而不是像这样触发本机文件下载对话框:
By DOWNLOAD_ANCHOR = By.partialLinkText("download"); driver.findElement(DOWNLOAD_ANCHOR).click();
我通常这样做,绕过本地文件下载对话框。 这种方式适用于所有浏览器:
String downloadURL = driver.findElement(DOWNLOAD_ANCHOR).getAttribute("href"); File downloadedFile = getFileFromURL(downloadURL);
这只需要实现方法getFileFromURL
,它使用Apache HttpClient下载文件并返回一个File引用给你。
同样,如果您碰巧使用的是Selenide ,则使用内置的download()
函数以相同的方式处理文件下载。
直到木偶更成熟,那就是我所做的。
我没有理解你的目标,你是否希望你的testing在testing执行时自动下载文件,如果是的话,那么你需要在testing执行中使用自定义的Firefoxconfiguration文件。
在自定义configuration文件中,首次手动执行testing,如果下载对话框出现,将其设置为“保存到磁盘”,同时选中“始终执行此操作”checkbox,以确保在下次运行testing时自动下载文件。
另外你可以添加
profile.setPreference("browser.download.panel.shown",false);
删除默认显示的下载文件列表,并覆盖部分网页。
我的总设置是:
DesiredCapabilities dc = DesiredCapabilities.firefox(); dc.merge(capabillities); FirefoxProfile profile = new FirefoxProfile(); profile.setAcceptUntrustedCertificates(true); profile.setPreference("browser.download.folderList", 4); profile.setPreference("browser.download.dir", TestConstants.downloadDir.getAbsolutePath()); profile.setPreference("browser.download.manager.alertOnEXEOpen", false); profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, data:image/png, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream"); profile.setPreference("browser.download.manager.showWhenStarting", false); profile.setPreference("browser.download.manager.focusWhenStarting", false); profile.setPreference("browser.download.useDownloadDir", true); profile.setPreference("browser.helperApps.alwaysAsk.force", false); profile.setPreference("browser.download.manager.alertOnEXEOpen", false); profile.setPreference("browser.download.manager.closeWhenDone", true); profile.setPreference("browser.download.manager.showAlertOnComplete", false); profile.setPreference("browser.download.manager.useWindow", false); profile.setPreference("browser.download.panel.shown",false); dc.setCapability(FirefoxDriver.PROFILE, profile); this.driver = new FirefoxDriver(dc);