如何使用Selenium Webdriver下载任何文件并将其保存到所需的位置
我必须使用下面给出的Selenium Webdriver执行以下任务。
- 点击任何开始下载任何文件的链接/button(文件types可能是任何图像,pdf,jar等)
- 如果出现(如http://selenium.googlecode.com/files/selenium-server-standalone-2.33.0.jar ),点击popup窗口中的“保存”
- 给出所需的位置来保存该文件。
任何人都可以分享,我们怎样才能实现这个使用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); }
对于不同的编程语言,这种方法会有所不同,但是对于所有的浏览器来说都是一样的。
- 我如何让Selenium-WebDriver在Java中等待几秒钟?
- 如何在Selenium Webdriver中模拟HTML5拖放?
- 在使用Java的Selenium WebDrivertesting中waitForVisible / waitForElementPresent的等效性?
- 如何处理Selenium中的打印对话框?
- Selenium – Python – 下拉菜单选项值
- 等待一个Ajax调用与Selenium 2networking驱动程序完成
- 如何在python中使用selenium webdriver滚动网页?
- 如何让selenium等待Ajax响应?
- 在seleniumweb驱动程序如何select正确的iframe