簡體   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