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

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

2017-07-25 15:49 447 查看
依据前一篇文章《移植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

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