移植MonkeyRunner的图片对比和获取子图功能的实现-UiAutomator/Robotium篇

原创 2014年11月12日 09:58:34

根据前一篇文章《移植MonkeyRunner的图片对比和获取子图功能的实现-Appium篇》所述,因为Appium和MonkeyRunner有一个共同点--代码控制流程都是在客户端实现的。所以要把MonkeyRunner在PC端实现的图片比对和获取子图功能移植到同样是在PC端运行的Appium是很容易的事情,但是对于在服务器端运行的Robotium和UiAutomator就是另外一回事了。

因为在Android的sdk中,MonkeyRunner获取子图和图片比对需要用到的以下两个类是没有支持的,简单来说就是java.awt这个库是不支持的:

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
但是在Android的sdk中有Bitmap这个类来帮助我们完成类似的功能,同时这个类还提供了一个sameAs的方法来比对两个Bitmap是否一致,但是遗憾的是它没有像MonkeyRunner一样提供一个百分比来指明两个图片的差异接受程度,所以为了兼容多种情况,我们需要对sameAs方法提供多个重载方法。

当然,这只是验证代码,有bug的话自己调吧

1. 移植代码

注意一下代码只在UiAutomator上面测试通过,但是我相信Robotium是一样的,因为他们都是运行在目标安卓机器上面的,大家可以自行验证下。

package libs;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class Util {
	
	public static boolean sameAs (String path1, String path2) throws FileNotFoundException {
		boolean res = false;
		FileInputStream fis1 = new FileInputStream(path1);
		Bitmap bitmap1  = BitmapFactory.decodeStream(fis1);
		
		FileInputStream fis2 = new FileInputStream(path2);
		Bitmap bitmap2  = BitmapFactory.decodeStream(fis2);
		
		res = sameAs(bitmap1,bitmap2);
	
		return res;
			
	}
	
	public static boolean sameAs (String path1, String path2,double percent) throws FileNotFoundException {
		FileInputStream fis1 = new FileInputStream(path1);
		Bitmap bitmap1  = BitmapFactory.decodeStream(fis1);
		
		FileInputStream fis2 = new FileInputStream(path2);
		Bitmap bitmap2  = BitmapFactory.decodeStream(fis2);
		
		return sameAs(bitmap1,bitmap2,percent);
			
	}
	
	public static boolean sameAs (Bitmap bitmap1, Bitmap bitmap2, double percent) {
		if(bitmap1.getHeight() != bitmap2.getHeight())
			return false;
		
		if(bitmap1.getWidth() != bitmap2.getWidth())
			return false;
		
		if(bitmap1.getConfig() != bitmap2.getConfig())
			return false;

		int width = bitmap1.getWidth();
		int height = bitmap2.getHeight();

		int numDiffPixels = 0;
	     
	     for (int y = 0; y < height; y++) {
	       for (int x = 0; x < width; x++) {
	         if (bitmap1.getPixel(x, y) != bitmap2.getPixel(x, y)) {
	           numDiffPixels++;
	         }
	       }
	     }
	     double numberPixels = height * width;
	     double diffPercent = numDiffPixels / numberPixels;
	     return percent <= 1.0D - diffPercent;
	}
	
	public static boolean sameAs (Bitmap bmp1, Bitmap bmp2) throws FileNotFoundException {
		boolean res = false;
		
		res = bmp1.sameAs(bmp2);
		
		return res;		
	}
	
	public static Bitmap getSubImage(String path,int x,int y,int width,int height) throws FileNotFoundException {
		
		FileInputStream fis = new FileInputStream(path);
		Bitmap bitmap  = BitmapFactory.decodeStream(fis);
				
		Bitmap res = Bitmap.createBitmap(bitmap, x, y, width, height);
		
		return res;
		
	}
}

2. 调用代码示例

以下是UiAutomator示例,Robotium的示例请大家自行实现.

package sample.demo;

import java.io.File;
import java.io.IOException;
import libs.Util;
import android.graphics.Bitmap;

import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;

public class CompareScreenshots extends UiAutomatorTestCase   {
	
	public void testCompareScreenshotsNSubScrenshots() throws UiObjectNotFoundException, IOException, InterruptedException {
		UiDevice device = getUiDevice();
		//device.pressHome();
		UiObject appNotes = new UiObject(new UiSelector().text("Notes"));
		appNotes.click();
		Thread.sleep(3000);
		
		String p1 = "/data/local/tmp/1.bmp";
		String p2 = "/data/local/tmp/2.bmp";
		File f1 = new File(p1);
		if(f1.exists())
			f1.delete();
		
		File f2 = new File(p2);
		if(f2.exists())
			f2.delete();
		
		device.takeScreenshot(f1);
		device.takeScreenshot(f2);
		
		Bitmap sub1 = Util.getSubImage(p1, 6, 39, 474, 38);
		Bitmap sub2 = Util.getSubImage(p2, 6, 39, 474, 38);
		
		boolean same = Util.sameAs(sub1, sub2, 1.0);
		assertTrue(same);
		
		same = Util.sameAs(p1, p2, 0.9);
		assertTrue(same); 
		

	
	}
}



 

作者

自主博客

微信

CSDN

天地会珠海分舵

http://techgogogo.com


服务号:TechGoGoGo

扫描码:

http://blog.csdn.net/zhubaitian




版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhubaitian/article/details/41039147

十六、Android UiAutomator 图像处理

一、BitMap介绍 1.图像使用场景 1)效果类截图 2)不可见的组件图像对比 3)失败与异常截图 4)利用图像判断组件 2.部分API简单说明 API 说明 compress ...
  • maocaowu_csdn
  • maocaowu_csdn
  • 2016-02-26 14:32:39
  • 1035

Android自动化测试之UIAutomator(三)---比对测试截图

本文适合所有以图片作为输出的自动化开发工具(不仅限于Android)。 当我们进行一组自动化测试后,除了通过断言,往往还会采用截图比对的方式分析测试结果,这种情况下人力再次成为效率的瓶颈,...
  • xzy2046
  • xzy2046
  • 2014-11-17 15:16:18
  • 1947

Android自动化工具Monkeyrunner使用之——ISMS(启动APK并截图查看)

# Imports the monkeyrunner modules used by this program, 此处是加载需要的文件, 可以说是必须的吧。 from com.android.mon...
  • shandong_chu
  • shandong_chu
  • 2012-09-29 15:36:26
  • 2986

monkeyrunner截图限时免费阅读#2:多线程保存

这是monkeyrunner截图限时免费阅读#1的后作. 之前的脚本中将所有的东西都放在主线程里面执行, 实际上, 保存MonkeyImage到磁盘的过程是IO相当大的, 将这类操作放入单独的线程进...
  • oqqShaw123
  • oqqShaw123
  • 2015-09-08 00:46:41
  • 590

MonkeyRunner之手机屏幕截图的比对

手机的自动化测试,对结果的判断是难点,最初级的办法无非是基于图像比对了,monkeyrunner自身提供了一套图像比对的机制,这里不再展开说。 使用方法简单陈述如下 加载一个正确结果的图片...
  • yunbin_7
  • yunbin_7
  • 2013-09-09 14:30:52
  • 1515

Android自动化测试之MonkeyRunner使用

MonkeyRunner工具是使用Jython(使用Java编程语言实现的Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制A...
  • seven_five577
  • seven_five577
  • 2017-02-10 22:37:10
  • 9538

用Python写的一个monkeyrunner小工具(支持手机截图与定时截图,手机屏幕的显示)

作为一个手机app测试工程师
  • lyhDream
  • lyhDream
  • 2014-10-12 22:20:58
  • 1744

monkeyrunner实现界面操作自动化

说明: monkeyrunner适合做设备控制、基本功能测试、回归测试、可扩展的自动化、截屏对比等,但它并不能做比较复杂的功能测试,本例中是结合python、adb、PIL开发的测试代码,实现简...
  • liubangzhen
  • liubangzhen
  • 2014-03-03 14:19:19
  • 1696

UiAutomator 图像处理

bitmap介绍 —图像使用场景(图片) —bitmap 部分api —代码演示 basecalss类package com.bitmap.test; import java.io.F...
  • LiHaoYang11
  • LiHaoYang11
  • 2016-10-05 10:58:07
  • 299

android UiAutomator如何把log、截图和测试报告放在一起

本人在使用android UiAutomator做测试的时候,在断言之前都会截图留证,方便以后查找。随着执行的次数增多,截图也越来越多,log文件也变成了上万行,如果找起来非常不方便。故而想了一个把每...
  • Fhaohaizi
  • Fhaohaizi
  • 2017-07-18 19:10:19
  • 1264
收藏助手
不良信息举报
您举报文章:移植MonkeyRunner的图片对比和获取子图功能的实现-UiAutomator/Robotium篇
举报原因:
原因补充:

(最多只允许输入30个字)