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


    依据前一篇文章《移植MonkeyRunner的图片对照和获取子图功能的实现-Appium篇》所述,由于Appium和MonkeyRunner有一个共同点--代码控制流程都是在client实现的。所以要把MonkeyRunner在PC端实现的图片比对和获取子图功能移植到相同是在PC端执行的Appium是非常easy的事情,可是对于在server端执行的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




  • 相关阅读:
    【django后端分离】Django Rest Framework之一般配置(简单剖析)
    【python小随笔】celery周期任务(简单原理)
    【django后端分离】mysql原生查询命令后,RawQueryset类型的自定义序列化返回json格式
    【python小随笔】Django+错误日志(配置Django报错文件指定位置)
    luogu P3194 [HNOI2008]水平可见直线 |单调栈
    luogu P6247 [SDOI2012]最近最远点对 |随机化
    luogu P3567 [POI2014]KUR-Couriers |莫队+随机化
    P6569 [NOI Online #3 提高组]魔法值| 矩阵乘法
    luogu P1452 【模板】旋转卡壳
    luogu P3829 [SHOI2012]信用卡凸包 |凸包
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7234558.html
Copyright © 2020-2023  润新知