您的位置:首页 > 产品设计 > UI/UE

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

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

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

[java]
view plaincopy

import java.awt.image.BufferedImage;  
import javax.imageio.ImageIO;  

但是在Android的sdk中有Bitmap这个类来帮助我们完成类似的功能,同时这个类还提供了一个sameAs的方法来比对两个Bitmap是否一致,但是遗憾的是它没有像MonkeyRunner一样提供一个百分比来指明两个图片的差异接受程度,所以为了兼容多种情况,我们需要对sameAs方法提供多个重载方法。
当然,这只是验证代码,有bug的话自己调吧。

1. 移植代码

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

[java]
view plaincopy

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的示例请大家自行实现.

[java]
view plaincopy

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);   
          
  
      
    }  
}  

Item
Description
Warning
Author
天地会珠海分舵

转载请注明出处!

Blog Address
http://blog.csdn.net/zhubaitian




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐