有没有可以让我在Firefox中操纵文件下载对话框的API?(我想访问用户做某事时出现的内容,而不是自己发起)。
我想做的是从Selenium访问此对话框(我不确定Selenium的“特权模式”是否足以访问chrome接口)。
有没有可以让我在Firefox中操纵文件下载对话框的API?(我想访问用户做某事时出现的内容,而不是自己发起)。
我想做的是从Selenium访问此对话框(我不确定Selenium的“特权模式”是否足以访问chrome接口)。
Answers:
从来没听说过。但是您可以将Firefox配置为自动开始下载并将文件保存在特定位置。然后,您的测试可以检查文件是否实际到达。
我有解决此问题的方法,请检查代码:
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");
Content-Disposition: attachment
。在这种情况下,Firefox似乎总是弹出一个对话框!
setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls");
我陷入了同样的问题,但是找到了解决方案。我做的方式与此博客相同。
当然这是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种不同类型的弹出窗口。即
1| JavaScript PopUps
2| Browser PopUps
3| Native OS PopUps [e.g., Windows Popup like Upload/Download]
通常,JavaScript弹出窗口由Web应用程序代码生成。Selenium提供了一个API来处理这些JavaScript弹出窗口,例如Alert
。
最终,忽略浏览器弹出窗口和下载文件的最简单方法是使用浏览器配置文件。有几种方法可以做到这一点:
在开始使用浏览器配置文件上的弹出窗口之前,请确保将“下载”选项默认设置为“保存文件”。
(打开Firefox)工具>选项>应用程序
利用以下代码段,并在必要时进行编辑。
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);
我面临着同样的问题。在我们的应用程序中,通过以下方式传递DesiredCapabilities来创建FireFox实例
driver = new FirefoxDriver(capabilities);
根据别人的建议,我做了一些修改
FirefoxProfile firefoxProfile = new FirefoxProfile();
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
"application/octet-stream");
driver = new FirefoxDrvier(firefoxProfile);
这达到了目的,但是不幸的是我的其他自动化测试开始失败。原因是,我删除了先前通过的功能。
网上有些浏览,找到了另一种方法。我们可以将配置文件本身设置为所需的功能。
所以新的工作代码看起来像
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");
根据要下载的文件类型,您需要指定内容类型。
您可以指定多个以' ;分隔的内容类型。'
例如:
fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv;application/vnd.ms-excel;application/msword");
无需像这样触发本地文件下载对话框:
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()
功能处理文件下载的方式相同。
我并没有坚持您的目标,您是否希望测试在执行测试时自动下载文件,如果是,那么您需要在测试执行中使用自定义Firefox配置文件。
在自定义配置文件中,首次手动执行测试,如果出现下载对话框,请将其设置为“将其保存到磁盘”,然后选中“始终执行此操作”复选框,以确保下次运行测试时自动下载文件。
此外,您可以添加
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);