4月16号参加了百度举办的技术沙龙,学了不少东西。去哪儿网分享的他们的前端测试工具,感觉很有意思。就是有一个程序运行他会自动启动你电脑的上的浏览器,感觉很好玩,也很实用,因为前端开发好多时间都花在了多浏览器兼容上了。
回来后我突然有了自己的想法。如下:就是我写一个程序,我给ta传一个url,他能自动启动我电脑上的浏览器,然后自动截图,然后分浏览器,按时间存储在我电脑的一个地方。写的过程我又想,这样截得图片会很多,要是有个程序,ta能自动去分析两张图片的差异,那这就太完美了。
启动我电脑上的浏览器,自动截图,自动保存制定目录的代码如下:
public class ScreenShot {
//IE
//Runtime.getRuntime().exec("explorer "+ url);
private static void start(String url, Browsers browsers) throws Exception {
switch (browsers) {
case Chrome:
Runtime.getRuntime().exec("C:\\Documents and Settings\\Administrator\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe " + url);
break;
case TheWorld:
Runtime.getRuntime().exec("D:\\usr\\local\\TheWorld\\TheWorld.exe " + url);
break;
case Firefox:
Runtime.getRuntime().exec("D:\\usr\\local\\firefox\\firefox.exe " + url);
break;
case Maxthon:
Runtime.getRuntime().exec("C:\\Program Files\\Maxthon2\\Maxthon.exe " + url);
break;
case Opera:
Runtime.getRuntime().exec("C:\\Program Files\\Opera\\opera.exe " + url);
break;
case QQ:
Runtime.getRuntime().exec("D:\\usr\\local\\QQBrowser\\Bin\\QQBrowser.exe " + url);
break;
case Souguo:
Runtime.getRuntime().exec("D:\\usr\\local\\SogouExplorer\\sogouexplorer.exe " + url);
break;
default:
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);
break;
}
}
private static void stop(String url, Browsers browsers) throws Exception {
switch (browsers) {
case Chrome:
Runtime.getRuntime().exec("taskkill /F /IM chrome.exe");
break;
case TheWorld:
Runtime.getRuntime().exec("taskkill /F /IM TheWorld.exe");
break;
case Firefox:
Runtime.getRuntime().exec("taskkill /F /IM firefox.exe");
break;
case Maxthon:
Runtime.getRuntime().exec("taskkill /F /IM Maxthon.exe");
break;
case Opera:
Runtime.getRuntime().exec("taskkill /F /IM opera.exe ");
break;
case QQ:
Runtime.getRuntime().exec("taskkill /F /IM QQBrowser.exe ");
break;
case Souguo:
Runtime.getRuntime().exec("taskkill /F /IM sogouexplorer.exe ");
break;
default:
Runtime.getRuntime().exec("taskkill /F /IM chrome.exe");
break;
}
}
private static void test(List<String> urls,Browsers browsers,String dir){
String osName = System.getProperty("os.name");
for (int i = 0; i < urls.size(); i++) {
String url = urls.get(i);
if(url!=null && url.length() > 0){
try {
if (osName.startsWith("Windows")) {
Robot robot = new Robot();
stop(url,browsers);
robot.delay(3000);
start(url,browsers);
robot.delay(3000);
// robot.mouseWheel(2000);
Dimension d = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
int width = (int) d.getWidth();
int height = (int) d.getHeight();
// 最大化浏览器
robot.keyRelease(KeyEvent.VK_F11);
robot.delay(3000);
Image image = robot.createScreenCapture(new Rectangle(0, 0, width,
height));
BufferedImage bi = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = bi.createGraphics();
g.drawImage(image, 0, 0, width, height, null);
// 保存图片
ImageIO.write(bi, "jpg", new File( dir+"/"+UtilDateTime.getDateTimeStamp().toString().replace(":", "-").replace(".", "-")+".jpg"));
robot.delay(3000);
stop(url,browsers);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
private void run (List<String> urls,String parentDir) throws Exception {
//test chrome
File chrome = new File(parentDir+"/"+Browsers.Chrome.toString());
chrome.mkdirs();
test(urls,Browsers.Chrome,parentDir+"/"+Browsers.Chrome.toString());
//test firefox
File firefox = new File(parentDir+"/"+Browsers.Firefox.toString());
firefox.mkdirs();
test(urls,Browsers.Firefox,parentDir+"/"+Browsers.Firefox.toString());
//test theWorld
File theWorld = new File(parentDir+"/"+Browsers.TheWorld.toString());
theWorld.mkdirs();
test(urls,Browsers.TheWorld,parentDir+"/"+Browsers.TheWorld.toString());
//test Maxthon
File maxthon = new File(parentDir+"/"+Browsers.Maxthon.toString());
maxthon.mkdirs();
test(urls,Browsers.Maxthon,parentDir+"/"+Browsers.Maxthon.toString());
//test opera
File opera = new File(parentDir+"/"+Browsers.Opera.toString());
opera.mkdirs();
test(urls,Browsers.Opera,parentDir+"/"+Browsers.Opera.toString());
//test opera
File qq = new File(parentDir+"/"+Browsers.QQ.toString());
qq.mkdirs();
test(urls,Browsers.QQ,parentDir+"/"+Browsers.QQ.toString());
//test opera
File souguo = new File(parentDir+"/"+Browsers.Souguo.toString());
souguo.mkdirs();
test(urls,Browsers.Souguo,parentDir+"/"+Browsers.Souguo.toString());
}
public static void main(String[] args) throws Exception{
String currDate = UtilDateTime.getDateTimeStamp().toString().replace(":", "-").replace(".", "-");
File directory = new File("d:/temp/"+currDate);
if (!(directory.exists()) && !(directory.isDirectory())) {
directory.mkdirs();
}
String parentDir = "d:/temp/"+currDate;
List<String> urls = new ArrayList<String>();
// urls.add("http://www.youku.com");
// urls.add("http://www.sina.com.cn");
// urls.add("http://www.sohu.com");
// urls.add("http://www.qq.com");
// urls.add("http://www.163.com");
urls.add("http://www.iteye.com");
// urls.add("http://192.168.1.33/index.jsp");
// urls.add("http://192.168.1.33/about/info.jsp");
// urls.add("http://192.168.1.33/news/typeList.jsp?typeid=1");
// urls.add("http://192.168.1.33/news/typeList.jsp?typeid=2");
// urls.add("http://192.168.1.33/news/typeList.jsp?typeid=3");
ScreenShot screenShot = new ScreenShot();
screenShot.run(urls,parentDir);
}
代码说明如下:程序运行在window系统上,启动浏览器的这部分代码是在网上copy一部分然后又改了一部分。
程序运行前,得先把浏览器设置好,如不要让他弹出提示框说设置为默认浏览器等等,妨碍截图。但是opera浏览器我结束进程,再启动时,老弹出一个框,还没有找到不让ta弹出来来。
程序运行的不错,感觉明天有变美好了,呵呵。
美中不足的是:这个程序只能截取第一屏的图,ta不能自动判断所给url的页面的长度,截取所有的图片。但也有一个不完美的办法是添加这个代码,让它去截最后一屏的图片(2000这个数字可以更大一些),这个基本能解决一般情况下的问题。
robot.mouseWheel(2000);
关于两个个图片的比较,或者说是相似度的比较,网上说了一些办法,如把图片转换为字符串,然后再比较字符串,试了试,直接把我的eclipse给搞死了。这算也是美中不足吧
我始终坚信:只有想不到,没有做不到的。加油,自己可以的,呵呵