【问题标题】:HtmlUnit: Skip JS executionHtmlUnit:跳过 JS 执行
【发布时间】:2017-06-21 12:46:42
【问题描述】:

问题:

  • 我正在使用 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 java htmlunit


    【解决方案1】:

    你可以修改JavaScript的内容为空字符串,提示here:

    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;
            }
        };
    

    【讨论】:

    • 您能否更具体地了解如何使用您的代码加载所有内部 Javascript,并在加载后为原始页面执行它们?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多