【问题标题】:How to set default download location property for chrome using selenium wedriver in java?java - 如何在java中使用selenium webdriver为chrome设置默认下载位置属性?
【发布时间】:2014-07-07 14:47:22
【问题描述】:

我想使用 webdriver 在指定的下载位置设置自动下载。我尝试了以下不适用于 chrome 的代码:

        ChromeOptions options = new ChromeOptions();
        options.addArguments("download.default_directory", downloadPath);
        this.driver = new ChromeDriver(options);


你能纠正我哪里错了吗?

【问题讨论】:

标签: java selenium selenium-webdriver webdriver chrome-web-driver


【解决方案1】:

对于像我这样正在搜索此内容并不断回到 3 年前提出的问题的人来说,这是一个更新的答案。 Chromium 支持here in Comment 8: 在 2015 年 4 月回答了这个问题。

Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("download.default_directory", "C:\\New_Download");

DesiredCapabilities caps = DesiredCapabilities.chrome();

ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", prefs);
options.addArguments("--disable-extensions");
caps.setCapability(ChromeOptions.CAPABILITY, options);

WebDriver driver = new ChromeDriver(caps);
driver.get("http://www.google.com");

我已经在本地进行了测试,并且可以正常工作。您可能需要像我一样添加以下选项参数来禁用扩展,即 options.addArguments("--disable-extensions");

【讨论】:

    【解决方案2】:

    由于以下原因,我不确定您是否只能执行下载设置 chromeOption:

    ChromeOptions 类确实包含下载路径参数的实现。

    但我建议您使用替代方法,尽管它看起来更复杂:

    package com.lazerycode.selenium.filedownloader;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.params.ClientPNames;
    import org.apache.http.client.protocol.ClientContext;
    import org.apache.http.impl.client.BasicCookieStore;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.impl.cookie.BasicClientCookie;
    import org.apache.http.params.HttpParams;
    import org.apache.http.protocol.BasicHttpContext;
    import org.apache.log4j.Logger;
    import org.openqa.selenium.Cookie;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    
    import java.io.File;
    import java.io.IOException;
    import java.net.URISyntaxException;
    import java.net.URL;
    import java.util.Set;
    
    public class FileDownloader {
    
        private static final Logger LOG = Logger.getLogger(FileDownloader.class);
        private WebDriver driver;
        private String localDownloadPath = System.getProperty("java.io.tmpdir");
        private boolean followRedirects = true;
        private boolean mimicWebDriverCookieState = true;
        private int httpStatusOfLastDownloadAttempt = 0;
    
        public FileDownloader(WebDriver driverObject) {
            this.driver = driverObject;
        }
    
        /**
         * Specify if the FileDownloader class should follow redirects when trying to download a file
         *
         * @param value
         */
        public void followRedirectsWhenDownloading(boolean value) {
            this.followRedirects = value;
        }
    
        /**
         * Get the current location that files will be downloaded to.
         *
         * @return The filepath that the file will be downloaded to.
         */
        public String localDownloadPath() {
            return this.localDownloadPath;
        }
    
        /**
         * Set the path that files will be downloaded to.
         *
         * @param filePath The filepath that the file will be downloaded to.
         */
        public void localDownloadPath(String filePath) {
            this.localDownloadPath = filePath;
        }
    
        /**
         * Download the file specified in the href attribute of a WebElement
         *
         * @param element
         * @return
         * @throws Exception
         */
        public String downloadFile(WebElement element) throws Exception {
            return downloader(element, "href");
        }
    
        /**
         * Download the image specified in the src attribute of a WebElement
         *
         * @param element
         * @return
         * @throws Exception
         */
        public String downloadImage(WebElement element) throws Exception {
            return downloader(element, "src");
        }
    
        /**
         * Gets the HTTP status code of the last download file attempt
         *
         * @return
         */
        public int getHTTPStatusOfLastDownloadAttempt() {
            return this.httpStatusOfLastDownloadAttempt;
        }
    
        /**
         * Mimic the cookie state of WebDriver (Defaults to true)
         * This will enable you to access files that are only available when logged in.
         * If set to false the connection will be made as an anonymouse user
         *
         * @param value
         */
        public void mimicWebDriverCookieState(boolean value) {
            this.mimicWebDriverCookieState = value;
        }
    
        /**
         * Load in all the cookies WebDriver currently knows about so that we can mimic the browser cookie state
         *
         * @param seleniumCookieSet
         * @return
         */
        private BasicCookieStore mimicCookieState(Set seleniumCookieSet) {
            BasicCookieStore mimicWebDriverCookieStore = new BasicCookieStore();
            for (Cookie seleniumCookie : seleniumCookieSet) {
                BasicClientCookie duplicateCookie = new BasicClientCookie(seleniumCookie.getName(), seleniumCookie.getValue());
                duplicateCookie.setDomain(seleniumCookie.getDomain());
                duplicateCookie.setSecure(seleniumCookie.isSecure());
                duplicateCookie.setExpiryDate(seleniumCookie.getExpiry());
                duplicateCookie.setPath(seleniumCookie.getPath());
                mimicWebDriverCookieStore.addCookie(duplicateCookie);
            }
    
            return mimicWebDriverCookieStore;
        }
    
        /**
         * Perform the file/image download.
         *
         * @param element
         * @param attribute
         * @return
         * @throws IOException
         * @throws NullPointerException
         */
        private String downloader(WebElement element, String attribute) throws IOException, NullPointerException, URISyntaxException {
            String fileToDownloadLocation = element.getAttribute(attribute);
            if (fileToDownloadLocation.trim().equals("")) throw new NullPointerException("The element you have specified does not link to anything!");
    
            URL fileToDownload = new URL(fileToDownloadLocation);
            File downloadedFile = new File(this.localDownloadPath + fileToDownload.getFile().replaceFirst("/|\\\\", ""));
            if (downloadedFile.canWrite() == false) downloadedFile.setWritable(true);
    
            HttpClient client = new DefaultHttpClient();
            BasicHttpContext localContext = new BasicHttpContext();
    
            LOG.info("Mimic WebDriver cookie state: " + this.mimicWebDriverCookieState);
            if (this.mimicWebDriverCookieState) {
                localContext.setAttribute(ClientContext.COOKIE_STORE, mimicCookieState(this.driver.manage().getCookies()));
            }
    
            HttpGet httpget = new HttpGet(fileToDownload.toURI());
            HttpParams httpRequestParameters = httpget.getParams();
            httpRequestParameters.setParameter(ClientPNames.HANDLE_REDIRECTS, this.followRedirects);
            httpget.setParams(httpRequestParameters);
    
            LOG.info("Sending GET request for: " + httpget.getURI());
            HttpResponse response = client.execute(httpget, localContext);
            this.httpStatusOfLastDownloadAttempt = response.getStatusLine().getStatusCode();
            LOG.info("HTTP GET request status: " + this.httpStatusOfLastDownloadAttempt);
            LOG.info("Downloading file: " + downloadedFile.getName());
            FileUtils.copyInputStreamToFile(response.getEntity().getContent(), downloadedFile);
            response.getEntity().getContent().close();
    
            String downloadedFileAbsolutePath = downloadedFile.getAbsolutePath();
            LOG.info("File downloaded to '" + downloadedFileAbsolutePath + "'");
    
            return downloadedFileAbsolutePath;
        }
    
    }
    

    上述代码使用的适当例子:

    @Test
    public void downloadAFile() throws Exception {
        FileDownloader downloadTestFile = new FileDownloader(driver);
        driver.get("http://www.localhost.com/downloadTest.html");
        WebElement downloadLink = driver.findElement(By.id("fileToDownload"));
        String downloadedFileAbsoluteLocation = downloadTestFile.downloadFile(downloadLink);
    
        assertThat(new File(downloadedFileAbsoluteLocation).exists(), is(equalTo(true)));
        assertThat(downloadTestFile.getHTTPStatusOfLastDownloadAttempt(), is(equalTo(200)));
    }
    
    @Test
    public void downloadAnImage() throws Exception {
        FileDownloader downloadTestFile = new FileDownloader(driver);
        driver.get("http://www.localhost.com//downloadTest.html");
        WebElement image = driver.findElement(By.id("ebselenImage"));
        String downloadedImageAbsoluteLocation = downloadTestFile.downloadImage(image);
    
        assertThat(new File(downloadedImageAbsoluteLocation).exists(), is(equalTo(true)));
        assertThat(downloadTestFile.getHTTPStatusOfLastDownloadAttempt(), is(equalTo(200)));
    }
    

    这个例子取自How To Download Files With Selenium And Why You Shouldn’t。浏览它以获取更多详细信息。希望对你有帮助。

    【讨论】:

    • 一个非常好的解决方案,但是文件下载受密码保护并且cookie无法解决授权问题。
    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 2016-05-28
    • 2019-12-26
    • 1970-01-01
    • 2015-09-12
    • 2016-04-03
    相关资源
    最近更新 更多