如何使用Selenium框架从受用户名和密码保护的网站上下载文件?

时间:2018-07-27 10:16:18

标签: java selenium apache-commons-exec

我正在尝试使用Selenium从受用户名和密码保护的网站上下载文件。

首先,我从下载链接中获得了href属性:

WebElement downloadLinkElement = htmlElement.findElement(By.xpath(<xpath_value>));
    String url = downloadLinkElement.getAttribute("href");

其次,我使用Selenium Web驱动程序获得了“ AUTHSESSION” cookie:

org.openqa.selenium.Cookie cookie = webDriver.manage().getCookieNamed("AUTHSESSION");

然后,我构建了一个包含Linux“ wget”命令的字符串,如下所示(为此,我正在使用apache commons exec工件):

CommandLine cmdLine = new CommandLine("wget");
        cmdLine.addArgument("--cookies=on");
        cmdLine.addArgument("--header");
        cmdLine.addArgument("Cookie: AUTHSESSION=" + cookie.getValue());
        cmdLine.addArgument("-O");
        cmdLine.addArgument("/home/name/Downloads/file.ftl");
        cmdLine.addArgument(url);
        cmdLine.addArgument("--no-check-certificate");

最后,我执行命令,并提取执行输出:

DefaultExecutor executor = new DefaultExecutor();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        PumpStreamHandler streamHandler = new PumpStreamHandler(byteArrayOutputStream);
        executor.setStreamHandler(streamHandler);
        try {
            executor.execute(cmdLine);
        }catch(ExecuteException ee){
            ee.printStackTrace();
            System.out.println(byteArrayOutputStream.toString());
        }

执行后,文件被下载到指定路径。但这不是期望的。这是一个HTML文件,其中包含我要从中下载网站的登录页面。

以下是执行输出中包含的字符串:

WARNING: cannot verify <ip_address>'s certificate, issued by <company_details>
  Self-signed certificate encountered.
WARNING: no certificate subject alternative name matches
    requested host name ‘<ip_address>’.
HTTP request sent, awaiting response... 302 

重要的一点是,如果我在Linux终端中运行以下命令,则文件下载成功:

wget --cookies on --header "Cookie: AUTHSESSION=<cookie_value>" -O "<download_path>" "<url>"
--no-check-certificate

我想念什么?

1 个答案:

答案 0 :(得分:0)

所以,我改变了方法。

在初始化firefox Web驱动程序之前,我首先创建一个FirefoxOptions对象,如下所示:

    FirefoxOptions firefoxOptions = new FirefoxOptions();
    firefoxOptions.addPreference("browser.helperApps.neverAsk.saveToDisk", "text/plain");

之后,我将此对象插入到firefox驱动程序构造函数中:

WebDriver driver = new FirefoxDriver(firefoxOptions);

单击下载链接后,文件将存储在磁盘中,浏览器不会询问任何问题。