使用Selenium WebDriver for Java,是否可以获得指定URL的网页HTML?
我知道,一旦在浏览器中加载网页,就可以使用WebDriver.getPageSource()获取HTML。但是,为了提高效率,是否可以在不首先在浏览器中加载页面的情况下获取HTML?
答案 0 :(得分:5)
您可以使用headless浏览器实现此目的。
无头浏览器是没有图形用户界面的Web浏览器。该程序的行为与浏览器类似,但不会显示任何GUI。
无头浏览器通常用于以下情况: -
您有一个中央构建工具,其上没有安装任何浏览器。因此,要在每次构建之后进行基本级别的完整性测试,您可以使用无头浏览器来运行测试。
您希望编写一个遍历不同页面并收集数据的抓取程序,无头浏览器将是您的选择。因为你真的不在乎打开浏览器。您所需要的只是访问网页。
您希望在同一台计算机上模拟多个浏览器版本。在这种情况下,您可能希望使用无头浏览器,因为它们中的大多数都支持模拟不同版本的浏览器。我们很快就会到这一步。
使用无头浏览器之前需要注意的事项
无头浏览器是模拟程序,它们不是真正的浏览器。大多数这些无头浏览器已经发展到足以模拟,非常接近,就像真正的浏览器一样。你仍然不想在无头浏览器中运行所有测试。在使用Headless浏览器之前,JavaScript是您需要非常小心的一个领域。 JavaScript由不同的浏览器实现。尽管JavaScript是一种标准,但每个浏览器在实现JavaScript方面都有其自身的微小差异。对于无头浏览器也是如此。例如,HtmlUnit无头浏览器使用任何其他浏览器都没有使用的Rihno JavaScript引擎。
无头驱动程序的一些示例包括
答案 1 :(得分:2)
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();
}
}
}