如何使用无头(gui-less)Selenium WebDriver

时间:2017-12-29 11:20:21

标签: java file selenium download selenium-chromedriver

我需要使用Java中的无头网络浏览器下载文件。我检查了HtmlUnit,我可以在一些简单的情况下下载文件,但是当Ajax初始化下载时我无法下载(实际上它更复杂,因为有两个请求,第一个下载第二个请求实际下载文件的URL来自给定的URL)。我用Selenium取代了HtmlUnit。我已经检查了两个WebDrivers,HtmlUnitDriver和ChromeDriver。

  • HtmlUnitDriver - 类似HtmlUnit的行为
  • ChromeDriver - 我能够以可见模式下载文件,但是当我打开无头模式时,不再下载文件

    ChromeOptions lChromeOptions = new ChromeOptions();
    HashMap<String, Object> lChromePrefs = new HashMap<String, Object>();
    lChromePrefs.put("profile.default_content_settings.popups", 0);
    lChromePrefs.put("download.default_directory", _PATH_TO_DOWNLOAD_DIR);
    lChromeOptions.setExperimentalOption("prefs", lChromePrefs);
    lChromeOptions.addArguments("--headless");
    
    return new ChromeDriver(lChromeOptions);
    

我知道由于安全原因,无头模式下载文件已关闭,但必须有一些解决方法

之前我使用过2.28 httpunit,几分钟前我开始使用2.29但仍然看起来Ajax功能停在某处。这是我在点击并期望文件数据后检索数据的方式:_link.click()。getWebResponse()。getContentAsStream()

WebConnectionWrapper是否显示在网站上发出的所有请求/响应?您知道我如何调试这个以获得更好的洞察力?我看到点击链接后Ajax函数的第一部分被正确调用(此函数中有2个http请求)。在WebConnectionWrapper -> getResponse内提取第一个响应后,我甚至尝试创建自定义http请求以检索数据/文件,但它返回404错误,表示第二个请求已经以某种方式完成但我没有看到任何日志/调试信息在_link.click().getWebResponse().getContentAsStream()WebConnectionWrapper -> getResponse()

1 个答案:

答案 0 :(得分:0)

关于HtmlUnit,你可以试试这个:

在dom元素上调用click()是同步调用。这意味着,在检索和处理此调用的响应之后,这将返回。通常所有的JS库都在那里做一些异步魔法(比如用各种(好的)原因开始使用setTimeout(,10)进行一些处理。你的代码会意识到这一点。

更好的方法是做这样的事情

Page page = _link.click();
webClient.waitForBackgroundJavaScript(1000);

有时,Ajax请求正在重定向到新内容。我们必须通过检查当前窗口内容来解决这个新问题

page = page.getEnclosingWindow().getEnclosedPage();

或者更好 在下载的情况下,(二进制)响应可能在新窗口中打开

WebWindow tmpWebWindow = webClient.getCurrentWindow();
tmpWebWindow = tmpWebWindow.getTopWindow();
page = tmpWebWindow.getEnclosedPage();

这可能是您正在寻找的回应。

page.getWebResponse().getContentAsStream();

猜测Web应用程序的运行情况有点棘手。如果您愿意,可以通过私人邮件联系我或在HtmlUnit用户邮件列表中讨论。