Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HtmlUnit:跳过JS执行_Javascript_Java_Htmlunit - Fatal编程技术网

Javascript HtmlUnit:跳过JS执行

Javascript HtmlUnit:跳过JS执行,javascript,java,htmlunit,Javascript,Java,Htmlunit,问题: 我正在使用HtmlUnit解析JS生成的页面 我必须等到所有的JS都被加载,然后解析页面 所有这些页面共享相同的JS脚本 有一个有问题的脚本无法解析 有问题的脚本不会影响html呈现 我想做什么: 我想检测问题脚本的名称 把这个名字列入黑名单 并跳过它进行进一步分析 这是我用于JS加载的代码 private void waitForJs(WebClient client, HtmlPage page) throws Exception { int maxDelay =

问题:

  • 我正在使用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脚本,并在加载后为原始页面执行它们?
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;
        }
    };