1

I was looking for a Chrome Extension which can intercept the download whenever we click on a PDF link or on a link that spawns a PDF at server end programmatically. One way of doing it was Selenium Browser Profiling, I found this particular code. I want Selenium to download the PDF file and rename it according to the strings i pass from the JAVA program. How can i use this code to download code and hook it up it with my program. It should trigger this whenever i execute a command like this:-

**driver.findElement(By.xpath("//a[contains(@href,\"/bbtobs/bbtolbext/statements/savepdf?type=current&AccountIndex=0\")]")).click();** CODE- 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; } } 
1
  • Could you elaborate on what's the difference between using wget and a system command to rename a file and what it is you are trying to achieve? Commented Oct 16, 2013 at 1:45

2 Answers 2

2
 String s = driver.findElement(By.cssSelector("#navbtm img")).getAttribute("src"); URL url = new URL(s); System.out.println(url); BufferedImage bufImgOne = ImageIO.read(url); ImageIO.write(bufImgOne, "png", new File("test.png")); 
Sign up to request clarification or add additional context in comments.

1 Comment

When you need to have entered a session to access the url?
2

I have found an excellent article about it. Tried, and works perfectly:

http://ardesco.lazerycode.com/index.php/2012/07/how-to-download-files-with-selenium-and-why-you-shouldnt/

UPDATE:

Better solution is to get the image from the browser itself: https://groups.google.com/forum/#!msg/selenium-users/8atiPIh39OY/Gp9_KEXnpRUJ

1 Comment

Both solutions have preconditions: 1st one requires an existing link or download-button in the html, 2nd one seems to refer to images, only, while the question is for PDF-Files

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.