繁体   English   中英

HtmlUnit:跳过 JS 执行

[英]HtmlUnit: Skip JS execution

问题:

  • 我正在使用 HtmlUnit 解析由 JS 生成的页面。
  • 我必须等到所有 JS 都加载完毕后再解析页面。
  • 所有这些页面共享相同的 JS 脚本。
  • 有一个无法解析的有问题的脚本。
  • 有问题的脚本不会影响 html 渲染。

我想做的事:

  • 我想检测有问题的脚本的名称。
  • 将此名称列入黑名单。
  • 并跳过它以进行进一步解析。

这是我用于 JS 加载的代码...

  private void waitForJs(WebClient client, HtmlPage page) throws Exception {
    int maxDelay = 1000;
    int attempts = 10;
    int i = client.waitForBackgroundJavaScript(maxDelay);
    while (i > 0 && attempts > 0) {
      i = client.waitForBackgroundJavaScript(maxDelay);
      if (i == 0) {
        break;
      }
      synchronized (page) {
        page.wait(500);
      }
      log("Waiting for JS (" + i + "), attempts: " + attempts, false);
      attempts--;
    }
  }

我不得不引入“尝试”变量,以免卡在加载损坏的脚本上。 取而代之的是,我想将所有有问题的脚本(保留在 waitForJs 中)放在黑名单上,并在未来跳过它们的加载。 可能吗?

您可以修改JavaScript的内容为空字符串,如暗示这里

new WebConnectionWrapper(webClient) {

        public WebResponse getResponse(WebRequest request) throws IOException {
            WebResponse response = super.getResponse(request);
            if (request.getUrl().toExternalForm().contains("my_url")) {
                String content = response.getContentAsString();

                // change content
                content = "";

                WebResponseData data = new WebResponseData(content.getBytes(),
                        response.getStatusCode(), response.getStatusMessage(), response.getResponseHeaders());
                response = new WebResponse(data, request, response.getLoadTime());
            }
            return response;
        }
    };

上面的代码有一个编码问题——我们在从内容字符串中获取字节时必须使用正确的字符集。

WebResponseData data = new WebResponseData(content.getBytes(response.getContentCharset()),
       response.getStatusCode(), response.getStatusMessage(), response.getResponseHeaders());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM