首页 > 解决方案 > 我可以使用 JSoup、HtmlUnit 或其他任何东西获得最终的 HTML 页面(在执行脚本之后)吗?

问题描述

所以我试图模拟点击这个按钮:

<input class="btn" value="Say thanks!" onclick="say_thanks(546810)" id="thanks_button" type="button">

我正在尝试在程序处于后台时执行此操作。否则,我可以只使用 selenium,但我不希望前台程序使用我的鼠标并聚焦它正在使用的浏览器。我试过找到任何解决方法,但到目前为止还没有运气。尝试像这样使用 HtmlUnit 进行模拟:

DomElement button = page.getFirstByXPath("//input[@value='Say thanks!']");
HtmlPage newPage = button.click();

但无论我使用哪种类型的选择器(尝试使用锚、byId、byClass 等),我都会收到此错误:

SEVERE: runtimeError: message=[An invalid or illegal selector was specified (selector: '*,:x' error: Invalid selector: *:x).] sourceName=[https://code.jquery.com/jquery-2.2.4.min.js] line=[2] lineSource=[null] lineOffset=[0]

我愿意接受任何建议,无论需要什么工具(如果有的话我还没有使用)。

大编辑:因此,在使用 JSoup 解析页面后,我仔细检查了页面在纯文本中的外观,并且找不到实际的按钮。我猜有一些 JQuery 脚本会触发按钮出现在最终的 HTML 文档中(只有在我之前没有按下它的情况下才会出现)。现在我需要评估该脚本以获得最终的 HTML,正如我在互联网上看到的那样,HtmlUnit 应该这样做,但没有。

我已经尝试过 JSoup、HtmlUnit、HttpClient 和 Jaunt,但到目前为止还没有运气。

标签: jsouphtmlunit

解决方案


你身边有个误区:

如果

DomElement button = page.getFirstByXPath("//input[@value='Say thanks!']");

失败了,你会得到一个普通的 java 异常,而不是一个日志条目(顺便说一句。你使用的是 xpath 选择器,但日志条目是关于 css 选择器的)。

为了让您更舒适,您可以添加该行

System.out.println(button.asXml())

选择后,您将看到 HtmlUnit 已找到您的输入元素。

日志条目是您单击按钮后开始执行的某些 javascript 的结果(并且因为您单击了按钮)。

在将 HtmlUnit 与使用 jQuery 或其他框架构建的页面一起使用时,这种消息非常常见。这些框架使用无效的 css 选择器来检查浏览器的功能。HtmlUnit 将报告这一点,但 javascript 将继续工作。通常这是 HtmlUnit 上下文中的警告消息,其中包含作为原因/详细信息的严重错误消息。

除此之外,调用 click() 方法是模拟单击按钮的正确方法。


推荐阅读