Java 浏览器显示的图像的URL

Java 浏览器显示的图像的URL,java,ui-automation,Java,Ui Automation,我正在自动化我们组织的供应订购系统。在当前的(纸质)系统下,如果我们从网站订购,我们需要附上一份显示所需物品的网页打印件。我正在编写的系统有一种上传扫描文件的方法,但我希望它是一次点击操作,而不是打印网页,扫描它,然后上传扫描文件 我找到了将页面转换为图像的代码,它确实有效,但创建的图像是基于html的(这很有意义),而不是浏览器中显示的内容 例如,我正在查看此项目: 当我在代码中运行url时,这是返回的图像: 该项目是使用servlet的JavaWeb。servlet代码: tr

我正在自动化我们组织的供应订购系统。在当前的(纸质)系统下,如果我们从网站订购,我们需要附上一份显示所需物品的网页打印件。我正在编写的系统有一种上传扫描文件的方法,但我希望它是一次点击操作,而不是打印网页,扫描它,然后上传扫描文件

我找到了将页面转换为图像的代码,它确实有效,但创建的图像是基于html的(这很有意义),而不是浏览器中显示的内容

例如,我正在查看此项目:


当我在代码中运行url时,这是返回的图像:

该项目是使用servlet的JavaWeb。servlet代码:

    try {
        if (request.getParameter("formType").equalsIgnoreCase("addReference")) {
            String url = request.getParameter("url");
            BufferedImage bi = WebImage.create(url, 800, 600);
            File tmpFile = new File("c:/testimages/url2img.png");
            ImageIO.write(bi, "png", tmpFile);
    } catch (Exception e) {
        e.printStackTrace();
    }
上面链接中的代码:

public abstract class WebImage {
    static class Kit extends HTMLEditorKit {
        @Override
        public Document createDefaultDocument() {
            HTMLDocument doc
                    = (HTMLDocument) super.createDefaultDocument();
            doc.setTokenThreshold(Integer.MAX_VALUE);
            doc.setAsynchronousLoadPriority(-1);
            return doc;
        }
    }
    public static BufferedImage create(String src, int width, int height) {
        BufferedImage image = null;
        JEditorPane pane = new JEditorPane();
        Kit kit = new Kit();
        pane.setEditorKit(kit);
        pane.setEditable(false);
        pane.setMargin(new Insets(0, 0, 0, 0));
        try {
            pane.setPage(src);
            image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = image.createGraphics();
            Container c = new Container();
            SwingUtilities.paintComponent(g, pane, c, 0, 0, width, height);
            g.dispose();
        } catch (Exception e) {
            System.out.println(e);
        }
        return image;
    }
}

是否有任何方法可以返回浏览器显示的url图像?。

您使用的是Java,因此实际上有一个非常简单的解决方案。浏览器自动化是一个(主要)解决的问题

这里是一些示例代码,请注意,如果页面加载时间比平时长,那么它并不特别健壮,但它应该足以演示执行所需操作的必要步骤。另外请注意,如果需要无头运行,您可能需要查看FireFox驱动程序,而不是FireFox驱动程序

WebDriver driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get("https://www.amazon.com/I-Robot-Isaac-Asimov/dp/055338256X/ref=sr_1_2?ie=UTF8&qid=1496161782&sr=8-2&keywords=Asimov");
// This move is necessary, the original file is temporary and gets deleted after java exists
File resultingScreenshot = new File(System.getProperty("user.home"), "screenshot.png");
Files.move(screenshotFile, resultingScreenshot);
driver.quit();

System.out.println("The screenshot is found here: " + resultingScreenshot);

你需要一个完全成熟的浏览器,它支持大量的web标准(HTML、CSS、JS),才能实现你想要的。否则,您通常会使用不合格的web浏览器捕获渲染不良的图像

请按照建议查看硒

此外,还有Chrome59附带的一些功能(Windows尚未推出)
或者不幸的是,它不再被维护,因此呈现最新和最好页面的能力将随着时间的推移而减弱。

虽然我确信您的答案是正确的,但我无法让它在我的项目中发挥作用。另外,我似乎在为这个项目添加了很多不必要的东西(比如硒元素)——有点像在我只需要左转向灯灯泡的情况下使用整辆车。但是,谢谢你的回答。我不确定你是如何导入这个库的,但是我建议使用maven来管理你的依赖关系。这将简化创建类路径和运行此代码的过程。至于增加很多,这对你的问题来说是强制性的。你要么重新发明轮子,构建一个支持java的javascript引擎和浏览器(你必须自己维护,这可能很有趣,很学术,但很费时),要么使用一个已经激活的项目。你只需要挑选最适合你的。