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

San*_*ngh 30 selenium selenium-webdriver

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

  1. 点击开始下载任何文件的任何链接/按钮(文件类型可能是任何图像,pdf,jar等)
  2. 如果出现,点击弹出窗口中的"保存"(例如http://selenium.googlecode.com/files/selenium-server-standalone-2.33.0.jar)
  3. 提供所需的位置以保存该文件.

任何人都可以共享,我们如何使用Java实现这一点?

Dir*_*irk 24

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

您应该从之前的SO问题中查看此答案.基本上,在设置Firefox配置文件时,您可以添加一个调用,将该属性设置为以逗号分隔的MIME类型列表,以便始终下载:browser.helperApps.neverAsk.saveToDisk

firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");
Run Code Online (Sandbox Code Playgroud)

请参阅关于:configs的Mozilla KB FAQ文章.

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

  • 可以访问保存对话框,您可以使用机器人类来访问和执行使用机器人类的ENTER,TABS和ESCAPE等事件 (3认同)

Abe*_*lgo 10

取消/保存对话框弹出窗口可能正在显示,因为该站点正在向您发送不同的MIME类型.

检查实际的标题内容.

使用开发人员工具内置的firefox,右键单击以检查发布的元素/下载链接,然后查看网络监视器以查看返回的ContentType标头值.这将是您要使用的那个..

在此输入图像描述

相应地设置配置文件设置

 firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
                     "application/octet-stream,text/csv");
Run Code Online (Sandbox Code Playgroud)

我期待"text/csv"然而得到"application/octet-stream"一旦添加到接受的类型列表中它都按预期工作,没有弹出窗口

  • 哇,感谢您强调一个事实,那就是必须真正检查实际的HEADER CONTENT。由于我要下载的文件是csv,因此我认为它应该是“ text / csv”,但是男孩是我错了。就我而言,它甚至不像您的情况那样是“ application / octet-stream”,而是“ application / csv”。谢谢! (2认同)

sti*_*kj1 5

一种可能的解决方案是通过 Selenium 获取文件的 URL,创建(非 Selenium)连接,将 Selenium 的 cookie 复制到该连接(如有必要),然后下载文件。大多数语言都有用于执行 HTTP 请求的 API(或库)。例如,要在 Java 中完成此操作,您可以使用URL.openConnection()

String link = linkElement.getAttribute("href");
URL url = new URL(link);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
Run Code Online (Sandbox Code Playgroud)

您可能需要复制 Selenium 拥有的 cookie 以模仿 Selenium 用户(例如,如果您正在测试需要登录的网站)。

Set<Cookie> cookies = webDriver.manager().getCookies();
String cookieString = "";

for (Cookie cookie : cookies) {
    cookieString += cookie.getName() + "=" + cookie.getValue() + ";";
}

httpURLConnection.addRequestProperty("Cookie", cookieString);
Run Code Online (Sandbox Code Playgroud)

然后您可以使用HttpURLConnection.getInputStream()将文件内容写入您的首选位置。

try (InputStream in = httpURLConnection.getInputStream()) {
    Files.copy(in, new File("/path/to/file.ext").toPath(),
        StandardCopyOption.REPLACE_EXISTING);
}
Run Code Online (Sandbox Code Playgroud)

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


归档时间:

查看次数:

69223 次

最近记录:

6 年,12 月 前