如何使用Selenium Webdriver下载任何文件并将其保存到所需的位置

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

  1. 点击任何开始下载任何文件的链接/button(文件types可能是任何图像,pdf,jar等)
  2. 如果出现(如http://selenium.googlecode.com/files/selenium-server-standalone-2.33.0.jar ),点击popup窗口中的“保存”
  3. 给出所需的位置来保存该文件。

任何人都可以分享,我们怎样才能实现这个使用Java?

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

你应该检查这个 以前的SO问题的 答案 。 基本上,在设置Firefoxconfiguration文件时,您将添加一个调用,将属性browser.helperApps.neverAsk.saveToDisk设置为逗号分隔的MIMEtypes列表,以便始终下载:

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

请参阅关于:configs的这个Mozilla KB FAQ文章 。

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

取消/保存对话popup可能会出现,因为该网站正在向您发送不同的MIMEtypes。

检查实际的标题内容。

使用内置的开发人员工具中的Firefox,右键点击检查元素/下载链接您的post,然后看看networking监视器看到ContentType标题值返回..这将是一个你想使用..

在这里输入图像描述

相应地设置你的configuration文件

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

我期待“文本/ csv”然而得到“应用程序/八位字节stream”一旦被添加到接受的types列表中,它都按预期工作, 没有popup

我想你正在寻找这样的事情

 //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(); 

一个可能的解决scheme是通过Selenium获取文件的URL,创build(非Selenium)连接,将Selenium的Cookie复制到连接(如有必要),然后下载文件。 大多数语言都有用于执行HTTP请求的API(或库)。 例如,要在Java中实现这一点,可以使用URL.openConnection()HttpURLConnection.getInputStream()

 String link = linkElement.getAttribute("href"); URL url = new URL(link); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("GET"); // You may need to copy over the cookies that Selenium has in order // to imitate the Selenium user (for example if you are testing a // website that requires a sign-in). Set<Cookie> cookies = browserDriver.getBrowserCookies(); String cookieString = ""; for (Cookie cookie : cookies) { cookieString += cookie.getName() + "=" + cookie.getValue() + ";"; } httpURLConnection.addRequestProperty("Cookie", cookieString); try (InputStream in = httpURLConnection.getInputStream()) { Files.copy(in, new File("/path/to/file.ext").toPath(), StandardCopyOption.REPLACE_EXISTING); } 

对于不同的编程语言,这种方法会有所不同,但是对于所有的浏览器来说都是一样的。