簡體   English   中英

Java Selenium:如何在不首先加載頁面的情況下獲取網頁的HTML?

[英]Java Selenium: how can I get the HTML of a webpage without first loading the page?

使用Selenium WebDriver for Java,是否可以獲取給定指定URL的網頁的HTML?

我知道,一旦在瀏覽器中加載網頁,就可以使用WebDriver.getPageSource()獲取HTML。 但是,為了提高效率,是否可以在不首先在瀏覽器中加載頁面的情況下獲取HTML?

您可以使用無頭瀏覽器實現此目的。

無頭瀏覽器是沒有圖形用戶界面的Web瀏覽器。 該程序的行為與瀏覽器類似,但不會顯示任何GUI。

無頭瀏覽器通常用於以下情況: -

  • 你有一個中央構建工具,它沒有安裝任何瀏覽器。 因此,要在每次構建之后進行基本級別的健全性測試,您可以使用無頭瀏覽器來運行測試。

  • 您想編寫一個遍歷不同頁面並收集數據的爬蟲程序,無頭瀏覽器將是您的選擇。 因為你真的不在乎打開瀏覽器。 您只需訪問網頁即可。

  • 您希望在同一台計算機上模擬多個瀏覽器版本。 在這種情況下,您可能希望使用無頭瀏覽器,因為它們中的大多數都支持模擬不同版本的瀏覽器。 我們很快就會到這一步。

使用無頭瀏覽器之前要注意的事項

無頭瀏覽器是模擬程序,它們不是真正的瀏覽器。 大多數這些無頭瀏覽器已經發展到足以模擬,非常接近,就像真正的瀏覽器一樣。 你仍然不想在無頭瀏覽器中運行所有測試。 在使用Headless瀏覽器之前,JavaScript是您需要非常小心的一個領域。 JavaScript由不同的瀏覽器實現。 盡管JavaScript是一種標准,但每個瀏覽器在實現JavaScript方面都有其自身的微小差異。 對於無頭瀏覽器也是如此。 例如,HtmlUnit無頭瀏覽器使用Rihno JavaScript引擎,該引擎未被任何其他瀏覽器使用。

無頭驅動器的一些例子包括

  • 的HtmlUnit
  • PhantomJS
  • ZombieJS
  • 的Watir-的webdriver

JAVA中的httpRequest:

public static String executePost(String targetURL, String urlParameters) {
  HttpURLConnection connection = null;

  try {
    //Create connection
    URL url = new URL(targetURL);
    connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", 
        "application/x-www-form-urlencoded");

    connection.setRequestProperty("Content-Length", 
        Integer.toString(urlParameters.getBytes().length));
    connection.setRequestProperty("Content-Language", "en-US");  

    connection.setUseCaches(false);
    connection.setDoOutput(true);

    //Send request
    DataOutputStream wr = new DataOutputStream (
        connection.getOutputStream());
    wr.writeBytes(urlParameters);
    wr.close();

    //Get Response  
    InputStream is = connection.getInputStream();
    BufferedReader rd = new BufferedReader(new InputStreamReader(is));
    StringBuilder response = new StringBuilder(); 

    String line;
    while ((line = rd.readLine()) != null) {
      response.append(line);
      response.append('\r');
    }
    rd.close();
    return response.toString();
  } catch (Exception e) {
    e.printStackTrace();
    return null;
  } finally {
    if (connection != null) {
      connection.disconnect();
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM