35

我必须使用下面给出的 Selenium Webdriver 执行以下任务。

  1. 单击开始下载任何文件的任何链接/按钮(文件类型可以是任何图像、pdf、jar 等)
  2. 如果出现,请单击弹出窗口上的“保存”(例如,在http://selenium.googlecode.com/files/selenium-server-standalone-2.33.0.jar的情况下)
  3. 提供所需的位置来保存该文件。

任何人都可以分享,我们如何使用Java实现这个?

4

7 回答 7

25

您将无法访问保存对话框。这是由操作系统控制的。您真正能够做的唯一一件事就是为浏览器设置默认下载位置并允许它自动下载文件。然后用Java检查文件。

您应该从这个先前的 SO question检查这个答案。基本上,在设置您的 Firefox 配置文件时,您添加一个调用以将属性设置为一个逗号分隔的 MIME 类型列表以始终下载:browser.helperApps.neverAsk.saveToDisk

firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");

请参阅关于 About:configs 的Mozilla KB 常见问题解答文章。

更新 看起来现在可以在另一个问题中看到这个答案

于 2013-05-27T00:42:03.150 回答
13

可能会出现取消/保存对话框弹出窗口,因为该站点正在向您发送不同的 MIME 类型。

检查实际的标题内容。

使用开发人员工具中内置的 firefox,右键单击以检查您发布的元素/下载链接,然后查看网络监视器以查看返回的 ContentType 标头值。这将是您要使用的那个。

在此处输入图像描述

相应地设置您的个人资料设置

 firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
                     "application/octet-stream,text/csv");

我期待“text/csv”但是一旦将其添加到接受的类型列表中就会得到“application/octet-stream”,它一切都按预期工作,没有弹出窗口

于 2016-02-10T07:28:23.767 回答
5

一种可能的解决方案是通过 Selenium 获取文件的 URL,创建(非 Selenium)连接,将 Selenium 的 cookie 复制到连接(如果需要),然后下载文件。大多数语言都有用于执行 HTTP 请求的 API(或库)。例如,要在 Java 中完成此操作,您可以使用URL.openConnection()

String link = linkElement.getAttribute("href");
URL url = new URL(link);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");

您可能需要复制 Selenium 的 cookie 以模仿 Selenium 用户(例如,如果您正在测试需要登录的网站)。

Set<Cookie> cookies = webDriver.manager().getCookies();
String cookieString = "";

for (Cookie cookie : cookies) {
    cookieString += cookie.getName() + "=" + cookie.getValue() + ";";
}

httpURLConnection.addRequestProperty("Cookie", cookieString);

然后您可以使用HttpURLConnection.getInputStream()将文件内容写入您的首选位置。

try (InputStream in = httpURLConnection.getInputStream()) {
    Files.copy(in, new File("/path/to/file.ext").toPath(),
        StandardCopyOption.REPLACE_EXISTING);
}

虽然这种方法对于不同的编程语言会有所不同,但它对所有浏览器的工作原理都是一样的

于 2017-10-16T16:23:01.880 回答
3

我想你正在寻找这样的东西

//common to all the cases
FirefoxProfile prof = new FirefoxProfile();

//Case:1 - Use this case to set download this code to your browser's default location
//prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/zip");

//Case:2 - Download file to Desktop
//prof.setPreference("browser.download.folderList", 0);
//prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/zip");

//Case:3 - Download to custom folder path. Replace d:\\selenium with your Download Location 
prof.setPreference("browser.download.dir","D:\\selenium\\");
prof.setPreference("browser.download.folderList", 2);
prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/zip");

//This will work for all cases mentioned above
WebDriver driver = new FirefoxDriver(prof);
driver.get("http://docs.seleniumhq.org/download/");
driver.findElement(By.xpath("//tr[1]/td[4]/a[text()='Download']")).click();
于 2015-04-22T04:34:15.983 回答
0
String path="D:\xyz\abc\";

FirefoxOptions profile = new FirefoxOptions();

profile.addPreference("browser.download.folderList", 2);

profile.addPreference("browser.download.manager.showWhenStarting", false);

profile.addPreference("browser.download.dir", **path**);

profile.addPreference("browser.helperApps.neverAsk.openFile","text/csv,application/x-msexcel,application/excel,application/x-excel,application/vnd.ms-excel,image/png,image/jpeg,text/html,text/plain,application/msword,application/xml");

profile.addPreference("browser.helperApps.neverAsk.saveToDisk","text/csv,application/x-msexcel,application/excel,application/x-excel,application/vnd.ms-excel,image/png,image/jpeg,text/html,text/plain,application/msword,application/xml");

profile.addPreference("browser.helperApps.alwaysAsk.force", false);

profile.addPreference("browser.download.manager.alertOnEXEOpen", false);

profile.addPreference("browser.download.manager.focusWhenStarting", false);

profile.addPreference("browser.download.manager.useWindow", false);

profile.addPreference("browser.download.manager.showAlertOnComplete", false);

profile.addPreference("browser.download.manager.closeWhenDone", false);

new FirefoxDriver(profile);
于 2018-02-08T11:26:24.203 回答
0

如果您使用的是 Java 和 Chromdriver,我开发了一个,可以让您的下载更加轻松。

在其功能中,您可以在一行代码中设置下载目录并验证您的文件是否已成功下载:

@Test
void downloadAttachTest() throws InterruptedException {
    adamInternetPage.navigateToPage(driver);
    seleniumDownloadKPI.fileDownloadKPI(
            adamInternetPage.getFileDownloadLink(), "SpeedTest_16MB.dat");
    waitBeforeClosingBrowser();
}
于 2018-06-06T19:34:14.017 回答
0

您可以使用以下代码将文件保存到所需位置。

package popups;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class FileDownloadPopup 
{
    WebDriver driver;
    FirefoxProfile prof = new FirefoxProfile();
    FirefoxOptions options = new FirefoxOptions();

    @BeforeMethod
    public void setEnvi() 
    {
        System.setProperty("webdriver.gecko.driver", "E:\\Selenium Dependencies\\BrowserExecutables\\geckodriver_win64_v0.21.0.exe");
        prof.setPreference("browser.download.dir","E:\\Downloads");
        prof.setPreference("browser.download.folderList", 2);
        prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        options.setProfile(prof);
        driver = new FirefoxDriver(options);
        driver.get("http://file-examples.com/index.php/sample-documents-download/sample-xls-download/");
        driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    }

    @Test
    public void FDPP()
    {
        driver.findElement(By.xpath("(//a[text()='Download sample xlsx file'])[1]")).click();
    }

    @AfterMethod
    public void closeEnvi()
    {
        driver.close();
    }

}
于 2018-08-06T19:03:36.067 回答