【发布时间】:2021-02-16 00:06:23
【问题描述】:
我正在使用 HtmlUnit 窥探网页,但似乎无法获取主要内容中的元素。我怀疑这是因为页面是使用 Vue.js 呈现的。
这是我正在监视的页面,我想获取
里面的内容
这是我使用 page.asXml() 打印页面时的输出。
为空。
这是我正在使用的 WebClient 代码,我已启用 JavaScript。
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
WebClient webClient = new WebClient();
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.setJavaScriptErrorListener(new SilenceJavaScriptErrorListner());
webClient.setCssErrorHandler(new SilentCssErrorHandler());
这是一个函数中的代码,我在其中等待
中的某个元素在返回之前存在。我也使用了方法 waitForBackgroundJavaScript()。
HtmlPage page = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();
webClient.waitForBackgroundJavaScript(10000);
for (int i = 0; i < 10; i++) {
page = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();
webClient.waitForBackgroundJavaScript(10000);
log.info("Current page \n" + page.asXml());
List<Object> quoteNumberOptionList = page.getByXPath("someXPath");
if (quoteNumberOptionList.size() > 0) {
break;
}
Thread.sleep(5000);
}
【问题讨论】:
-
您尝试过 Selenium 吗?我知道它能够像普通用户一样呈现网站。您面临的这个问题有点类似于搜索引擎机器人无法解析 Vue 或 Angular 网站:除非您解析 JavaScript(这发生在客户端中),否则根本看不到任何东西。
-
是的,问题是现有代码都使用 HtmlUnit,所以如果我更改为 Selenium,我需要重做整个项目。所以想先看看有没有解决办法T.T
-
我猜你已经试过
webClient.setAjaxController(new NicelyResynchronizingAjaxController());了? htmlunit.sourceforge.io/faq.html#AJAXDoesNotWork。 编辑:另外看看这个github.com/mpoehler/htmlunit-angular-test/blob/master/src/test/…,不知道你为什么使用getEnclosedPage()以及它与webClient.getPage相比的作用。 -
感谢您的建议。我试过
webClient.setAjaxController(new NicelyResynchronizingAjaxController());,但还是不行。我使用getEnclosedPage(),因为该页面是通过单击链接而不是从 URL 导航到的。但是在你说之后,我已经尝试webClient.getPage(url);直接访问该页面,但仍然无法正常工作。 -
在 Vue.JS 的 HtmlUnit 中的未解决问题得到解决之前它将无法工作。如果可能的话,我建议切换到 Selenium,或者编写一个包来将 Selenium 添加到您当前的代码库中。使用 Chrome 驱动程序似乎是目前唯一可行的解决方案。
标签: java htmlunit browser-automation