【问题标题】:HtmlUnit unable to find elementHtmlUnit 找不到元素
【发布时间】: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


【解决方案1】:

由于您在上面的 cmets 中提到您无法共享 URL(而且它可能无论如何都不能公开访问),所以我在这里写了一些文章,可能会对您有所帮助 Parsing web javascript content to string using android

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多