通过java 代码进行浏览器展示内容进行快照,支持有滚动条的页面截屏
项目下载位置。
1.代码如下:
package test;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import chrriis.dj.nativeswing.swtimpl.NativeComponent;
import chrriis.dj.nativeswing.swtimpl.NativeInterface;
import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;
import chrriis.dj.nativeswing.swtimpl.components.WebBrowserAdapter;
import chrriis.dj.nativeswing.swtimpl.components.WebBrowserEvent;
public class TestJPanel extends JPanel {
private static final long serialVersionUID = 1L;
// 行分隔符
final static public String LS = System.getProperty("line.separator", "/n");
// 文件分割符
final static public String FS = System.getProperty("file.separator", "//");
//以javascript脚本获得网页全屏后大小
final static StringBuffer jsDimension;
static {
jsDimension = new StringBuffer();
jsDimension.append("var width = 0;").append(LS);
jsDimension.append("var height = 0;").append(LS);
jsDimension.append("if(document.documentElement) {").append(LS);
jsDimension
.append(
" width = Math.max(width, document.documentElement.scrollWidth);")
.append(LS);
jsDimension
.append(
" height = Math.max(height, document.documentElement.scrollHeight);")
.append(LS);
jsDimension.append("}").append(LS);
jsDimension.append("if(self.innerWidth) {").append(LS);
jsDimension.append(" width = Math.max(width, self.innerWidth);")
.append(LS);
jsDimension.append(" height = Math.max(height, self.innerHeight);")
.append(LS);
jsDimension.append("}").append(LS);
jsDimension.append("if(document.body.scrollWidth) {").append(LS);
jsDimension.append(
" width = Math.max(width, document.body.scrollWidth);")
.append(LS);
jsDimension.append(
" height = Math.max(height, document.body.scrollHeight);")
.append(LS);
jsDimension.append("}").append(LS);
//jsDimension.append("if(document.readyState==\"complete\"){").append(LS);
//jsDimension.append("alert(\"当前页面已加载完成!\");").append(LS);
jsDimension.append("return width + ':' + height;").append(LS);
//jsDimension.append("}").append(LS);
System.out.println("----------jsDimension:"+jsDimension.toString());
}
public TestJPanel(final String url, final int maxWidth, final int maxHeight) {
super(new BorderLayout());
JPanel webBrowserPanel = new JPanel(new BorderLayout());
final String fileName = "D:\\test\\"+System.currentTimeMillis() + ".jpg";
final JWebBrowser webBrowser = new JWebBrowser(null);
webBrowser.setBarsVisible(false);
webBrowser.navigate(url);
webBrowserPanel.add(webBrowser, BorderLayout.CENTER);
add(webBrowserPanel, BorderLayout.CENTER);
JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 4, 4));
webBrowser.addWebBrowserListener(new WebBrowserAdapter() {
// 监听加载进度
public void loadingProgressChanged(WebBrowserEvent e) {
// 当加载完毕时
System.out.println("---------e.getWebBrowser().getLoadingProgress():"+e.getWebBrowser().getLoadingProgress());
if (e.getWebBrowser().getLoadingProgress() == 100) {
try {
String html = webBrowser.getHTMLContent();
System.out.println("-----------------页面代码:"+html);
// 具体的秒数需要根据网速等调整
Thread.sleep(4* 5 * 1000);
String result = (String) webBrowser
.executeJavascriptWithResult(jsDimension.toString());
int index = result == null ? -1 : result.indexOf(":");
NativeComponent nativeComponent = webBrowser
.getNativeComponent();
Dimension originalSize = nativeComponent.getSize();
Dimension imageSize = new Dimension(Integer.parseInt(result
.substring(0, index)), Integer.parseInt(result
.substring(index + 1)));
imageSize.width = Math.max(originalSize.width,
imageSize.width + 50);
imageSize.height = Math.max(originalSize.height,
imageSize.height + 50);
nativeComponent.setSize(imageSize);
BufferedImage image = new BufferedImage(imageSize.width,
imageSize.height, BufferedImage.TYPE_INT_RGB);
nativeComponent.paintComponent(image);
nativeComponent.setSize(originalSize);
System.out.println("----------imageSize.width:"+imageSize.width+"-------------maxWidth:"+maxWidth+"---------imageSize.height:"+imageSize.height+"--------maxHeight:"+maxHeight);
// 当网页超出目标大小时
if (imageSize.width > maxWidth || imageSize.height > maxHeight) {
//截图部分图形
//image = image.getSubimage(0, 0, maxWidth, maxHeight);
/*此部分为使用缩略图*/
int width = image.getWidth(),
height = image.getHeight();
AffineTransform tx = new AffineTransform();
tx.scale((double) maxWidth / width, (double) maxHeight/ height);
AffineTransformOp op = new AffineTransformOp(tx,AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
image = image.getSubimage(0, 0, width, height);
//缩小图片
//image = op.filter(image, null);
}
// 输出图像
ImageIO.write(image, "jpg", new File(fileName));
} catch (Exception ex) {
ex.printStackTrace();
}
// 退出操作
System.exit(0);
}
}
}
);
add(panel, BorderLayout.SOUTH);
}
public static void init(String host, int port, final String username, final String password) {
/*Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username,new String(password).toCharArray());
}
});*/
System.setProperty("http.proxyType", "4");
System.setProperty("http.proxyPort", Integer.toString(port));
System.setProperty("http.proxyHost", host);
System.setProperty("http.proxySet", "true");
}
public static void main(String[] args) {
String url = "http://www.piccnet.com.cn/zhaopin/index.jsp";
String proxy = "172.16.251.58";
int port = 3128;
String username = "71000731";
String password = "DC664750";
init(proxy, port, username, password);
System.out.println("---------------start----------");
NativeInterface.open();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// SWT组件转Swing组件,不初始化父窗体将无法启动webBrowser
JFrame frame = new JFrame("以DJ组件保存指定网页截图");
String url = "";
url = "http://www.piccnet.com.cn/zhaopin/index.jsp";
//url = "http://www.google.com.hk/webhp?hl=zh-CN&tab=Tw";
//url = "http://123.sogou.com/";
// 加载google,最大保存为640x480的截图
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int width = (int)d.getWidth();
int height = (int) d.getHeight();
TestJPanel test = new TestJPanel (url, width,height);
//TestJPanel test = new TestJPanel("http://www.csdn.net/", 1024,768)
frame.getContentPane().add(test, BorderLayout.CENTER);
frame.setSize(800, 600);
// 仅初始化,但不显示
frame.invalidate();
frame.pack();
frame.setVisible(false);//设置是否可见
System.out.println("---------------end----------");
}
});
NativeInterface.runEventPump();
}
}
分享到:
相关推荐
总之,通过Java结合Selenium WebDriver或其他工具,我们可以实现对浏览器页面的快照和截图功能,即使页面包含滚动条也能完整捕获。这个过程中涉及到浏览器控制、JavaScript交互、图像处理等多个环节,理解并熟练掌握...
然后,我们可以看到一个名为`WebToImgUtil.java`的文件,这应该是实现网页快照的核心代码。在这个类中,可能会有如下关键步骤: 1. **初始化JWebBrowser**:创建`JWebBrowser`实例,设置其大小为网页的预期显示尺寸...
这个项目的核心在于利用DJNativeSwing组件,这是一个开源的Java库,它扩展了Swing组件,增加了对操作系统本地功能的支持,如打印、拖放以及在这个案例中的屏幕截图。 1. **DJNativeSwing**: DJNativeSwing库是Java...
2. **浏览器安全限制**:由于浏览器的安全策略,Doppio需要如何规避或适应这些限制,以确保在浏览器环境中安全地运行Java代码。 3. **性能优化**:Doppio如何优化Java程序的执行速度,以适应浏览器的运行环境,考虑...
(一)PhantomJS是可使用JavaScript编写脚本的无头Web浏览器。它可以在Windows,macOS,Linux和FreeBSD上运行。使用QtWebKit作为后端,它为各种Web标准提供了快速的本机支持:DOM处理,CSS选择器,JSON,Canvas和SVG...
在浏览器中进行Java调试。 使用和websocket,以便您可以从Web浏览器中调试Java程序。 下面的屏幕快照显示了此Java的浏览器内调试会话: public static void main(String[] args) { int test1 = 10; int test2 ...
通过截取浏览器中的网页快照,可以生成高质量的图片,支持各种浏览器和操作系统。 - 缺点:依赖于真实浏览器环境,启动和配置可能复杂,速度相对较慢,不适合大量或频繁的转换。 4. **Headless Chrome或Firefox** ...
在解析过程中,网络蜘蛛需要处理异步请求,这可能涉及到分析和执行JavaScript代码,或者利用Headless浏览器(如Puppeteer)来渲染完整的页面。 在这款"WebCapture"源代码中,我们可以学习到以下几个关键知识点: 1...
Java Selenium 是一个强大的自动化测试工具,它允许程序员通过编写Java代码来控制Web浏览器,执行各种交互操作,如点击、输入、导航等。Selenium 支持多种浏览器,包括Chrome、Firefox、IE等,并且与Java集成得非常...
2. **PhantomJS**: PhantomJS是一个基于Webkit的无头浏览器,它可以在没有GUI的情况下运行。虽然PhantomJS本身不是Java库,但可以通过Java的ProcessBuilder或者其他的进程管理库来调用PhantomJS命令行工具。以下是一...
总的来说,基于Java的UI自动化测试框架结合了TestNG、Selenium WebDriver(或Appium)以及一系列辅助工具,为测试人员提供了强大的测试能力,能够有效地对Android应用的用户界面进行自动化测试,确保产品质量。...
Selenium 是一个强大的自动化测试工具,它允许程序员模拟真实用户在浏览器中的操作,进行Web应用程序的测试。在Selenium框架中,浏览器驱动是关键组成部分,它充当了Selenium与特定浏览器之间的桥梁。本文将深入探讨...
浏览器bat脚本截图是一种高效的方法,它允许用户无需安装额外的浏览器插件就能截取整个网页的图片。这种技术基于批处理(BAT)文件,这是一种简单的脚本语言,用于自动化执行一系列命令行操作。在本案例中,"aa.bat...
### Java实现网页截图技术:深度解析与代码示例 在当今的互联网时代,网页截图技术在许多场景下都有着广泛的应用,如自动化测试、数据分析、页面快照保存等。本文将深入探讨如何使用Java来实现网页截图,从原理到...
它用于编写本地方法,即调用非Java代码的方法。 9. javap:类文件的反汇编器。它可以查看Java类文件的内部结构,如方法和字段。 10. extcheck:用来检测JAR文件冲突的工具。 二、安全工具(Security Tools) 1. ...
总结来说,这个Java程序展示了如何使用第三方库NativeSwing创建一个包含Web浏览器组件的应用,并可能提供了全屏截图或网页内容捕获的功能。通过结合Swing组件、事件处理和第三方库,实现了跨平台的GUI应用,同时也...
另外,`captureScreen`可能是代码中用于存储截图的类或方法名,你可以根据实际需求进行调整。 总结,Java结合Selenium WebDriver可以有效地完成网页截图任务,它不仅提供了网页加载能力,还支持丰富的交互操作,...
这可能涉及到`java.awt.Robot`与`java.awt.Toolkit`或`java.awt.image.BufferedImage`的结合使用,以便捕获屏幕快照,定位登录界面元素。另外,还需要使用`java.awt.event.KeyEvent`和`java.awt.event.InputEvent`来...
通过Selenium,我们可以利用PhantomJS的无头浏览器特性,实现Java代码对网页的远程控制。 以下是一个简单的Java代码示例,演示如何使用PhantomJS和Selenium WebDriver生成ECharts图表的截图: ```java import org....