Java Selenium:如何在不首先加载页面的情况下获取网页的HTML?

时间:2016-07-24 08:03:16

标签: java html selenium webdriver

使用Selenium WebDriver for Java,是否可以获得指定URL的网页HTML?

我知道,一旦在浏览器中加载网页,就可以使用WebDriver.getPageSource()获取HTML。但是,为了提高效率,是否可以在不首先在浏览器中加载页面的情况下获取HTML?

2 个答案:

答案 0 :(得分:5)

您可以使用headless浏览器实现此目的。

无头浏览器是没有图形用户界面的Web浏览器。该程序的行为与浏览器类似,但不会显示任何GUI。

无头浏览器通常用于以下情况: -

  • 您有一个中央构建工具,其上没有安装任何浏览器。因此,要在每次构建之后进行基本级别的完整性测试,您可以使用无头浏览器来运行测试。

  • 您希望编写一个遍历不同页面并收集数据的抓取程序,无头浏览器将是您的选择。因为你真的不在乎打开浏览器。您所需要的只是访问网页。

  • 您希望在同一台计算机上模拟多个浏览器版本。在这种情况下,您可能希望使用无头浏览器,因为它们中的大多数都支持模拟不同版本的浏览器。我们很快就会到这一步。

使用无头浏览器之前需要注意的事项

无头浏览器是模拟程序,它们不是真正的浏览器。大多数这些无头浏览器已经发展到足以模拟,非常接近,就像真正的浏览器一样。你仍然不想在无头浏览器中运行所有测试。在使用Headless浏览器之前,JavaScript是您需要非常小心的一个领域。 JavaScript由不同的浏览器实现。尽管JavaScript是一种标准,但每个浏览器在实现JavaScript方面都有其自身的微小差异。对于无头浏览器也是如此。例如,HtmlUnit无头浏览器使用任何其他浏览器都没有使用的Rihno JavaScript引擎。

无头驱动程序的一些示例包括

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

答案 1 :(得分:2)

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