27

是否有免费工具可以读取给定网页并对其进行截图?

4

6 回答 6

20

Selenium Webdriver 使用 VirtualFramebuffer 和 Firefox Binary 获得了最好的结果。这是在ubuntu下测试的。你需要安装 xvfb 和 firefox

首先安装firefox和virtual framebuffer:

aptitude install xvfb firefox

编译运行这个类,之后打开/tmp/screenshot.png

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxBinary;
import org.openqa.selenium.firefox.FirefoxDriver;

public class CaptureScreenshotTest
{
    private static int      DISPLAY_NUMBER  = 99;
    private static String   XVFB            = "/usr/bin/Xvfb";
    private static String   XVFB_COMMAND    = XVFB + " :" + DISPLAY_NUMBER;
    private static String   URL             = "http://www.google.com/";
    private static String   RESULT_FILENAME = "/tmp/screenshot.png";

    public static void main ( String[] args ) throws IOException
    {
        Process p = Runtime.getRuntime().exec(XVFB_COMMAND);
        FirefoxBinary firefox = new FirefoxBinary();
        firefox.setEnvironmentProperty("DISPLAY", ":" + DISPLAY_NUMBER);
        WebDriver driver = new FirefoxDriver(firefox, null);
        driver.get(URL);
        File scrFile = ( (TakesScreenshot) driver ).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(scrFile, new File(RESULT_FILENAME));
        driver.close();
        p.destroy();
    }
}
于 2011-09-28T12:44:53.213 回答
17

以上述两个答案为基础:

在 Java 中渲染 HTML 然后保存到图像 - 存在一些基于 Java 的 HTML 渲染,都有不同的缺点。最常见的是内置的。这很简单,只能呈现相当基本的 HTML。我所知道的最有趣的是飞碟计划。这可以呈现相当复杂的 XHTML,但您必须先转换 HTML,然后才能使用它(JTindy可能会在这里提供帮助)。获取 Swing 组件并创建图像非常简单,您只需传递一个BufferedImages图形对象并将其传递给 Swing 组件的绘制方法。然后用ImageIO把它吐出来。
这样做的一大优势是渲染器将是无头的。缺点是它不会是一个完美的渲染,它会缺少任何插件。

第二个选项要求您启动网络浏览器,确定它的位置,然后截屏。或者,您可能还希望删除所有 Firefox/IE/Opera/etc 菜单,只留下图像。要获得网络浏览器的尺寸,最简单的选择是全屏启动它。另一种选择是使用 JDIC浏览器组件之类的东西将其作为 Java 应用程序的一部分。然后它将能够指定 HTML 在屏幕上呈现的位置,然后只需使用Robot创建该区域的屏幕截图。
这样做的最大优点是它将提供完美的渲染(对于给定的浏览器)。两个缺点是它需要本机代码(或至少使用本机组件)并且它不能是无头的¹。

1)您可以使用虚拟帧缓冲区。但那是在 Java 之外。

于 2009-10-01T14:19:00.327 回答
6

它不是Java,但是来这里之后,它是我最终使用的,所以我认为值得一提。使用PhantomJs,您可以运行无头版本的 webkit,然后通过内置的 mongoose 网络服务器访问该功能,该服务器可以处理截屏请求,并将它们存储在本地。您可以使用 Java 发出请求,并且响应可以包含服务器上图像的 url,因此您也可以获取它-

于 2012-09-26T14:54:12.693 回答
2

使用硒-rc

于 2009-10-01T13:40:55.960 回答
2

您可以使用 awt.Robot 中的 createScreenCapture 方法。此方法允许您指定要捕获屏幕的哪个部分。因此,您仍然需要确定包含您要捕获的网页的窗口的坐标。

于 2009-10-01T13:49:57.767 回答
1

要在纯 Java 中呈现 HTML,您可以查看 Flying Saucer。

http://code.google.com/p/flying-saucer//

它呈现 XML/XHTML/CSS 2.1

我相信它只适用于有效的 XML 或 XHTML,所以如果您需要渲染无效的 HTML,请使用像 neko 这样的工具来清理它,然后再将其传递给飞碟。

于 2009-10-01T14:18:12.843 回答