Gazen Ganados
Gazen Ganados

Reputation: 687

Save document in Chrome browser using Selenium

I have a Selenium (Java) test application that opens pdf documents in the browser and saves them to the hard drive for use later in the test. As the test is going to be used across multiple machines manually setting up profiles is not an option; it has to be done programmatically.

In Firefox I set the profile preferences:

    FirefoxProfile profile = new FirefoxProfile();
    profile.setPreference("browser.download.manager.showWhenStarting", false);
    profile.setPreference("browser.download.dir", appSet.getDocumentSavePath());
    profile.setPreference("browser.download.folderList", 2);
    profile.setPreference("plugin.disable_full_page_plugin_for_types", "application/pdf");
    profile.setPreference("pref.downloads.disable_button.edit_actions", true);
    profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/pdf");
    profile.setPreference("pdfjs.disabled", true);

Is there an equivalent in Chrome?

I know that there are capabilities in Chrome where I can set switches, but I don't see any that can help me.

DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.binary", appSet.getChromeBinaryLocation());
capabilities.setCapability("chrome.switches", Arrays.asList("--allow-running-insecure-   content=true"));

Upvotes: 3

Views: 2888

Answers (1)

Gazen Ganados
Gazen Ganados

Reputation: 687

I hope that this is of use to someone. This solution works cross browser and does not rely on setting profiles or preferences in the browser when it is launched.

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Set;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
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.params.CookiePolicy;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.cookie.ClientCookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.cookie.BasicClientCookie2;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.openqa.selenium.WebDriver;

public void downloadDocument(String documentName) {
    HttpClient httpClient = new DefaultHttpClient();
    httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BEST_MATCH);

    CookieStore cookieStore = new BasicCookieStore();
    Set<org.openqa.selenium.Cookie> cookies = driver.manage().getCookies();

    for (org.openqa.selenium.Cookie cookie: cookies) {
        BasicClientCookie2 cookie2 = new BasicClientCookie2(cookie.getName(), cookie.getValue());
        cookie2.setAttribute(ClientCookie.VERSION_ATTR, "1");
        cookie2.setAttribute(ClientCookie.DOMAIN_ATTR, cookie.getDomain());
        cookie2.setDomain(cookie.getDomain());
        cookie2.setPath(cookie.getPath());
        cookie2.setExpiryDate(cookie.getExpiry());
        cookieStore.addCookie(cookie2);
    }

    HttpContext httpContext = new BasicHttpContext();
    httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

    try {
        HttpResponse httpResponse = httpClient.execute(new HttpGet(driver.getCurrentUrl()), httpContext);
        InputStream inputStream = httpResponse.getEntity().getContent();

        FileOutputStream fos = new FileOutputStream (getDocumentSavePath() + documentName.replaceAll("\\s+", "") + ".pdf");

        byte[] buffer = new byte[2048];
        int bytesRead = 0;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            fos.write(buffer, 0, bytesRead);
        }

        fos.close();
    } catch (ClientProtocolException e) { logger.error("message and trace")
    } catch (IOException e) { logger.error("message and trace")
    }

    httpClient.getConnectionManager().shutdown();

}

Upvotes: 4

Related Questions