美文网首页
移植MonkeyRunner 的图片对比和获取子图功能的实201

移植MonkeyRunner 的图片对比和获取子图功能的实201

作者: 3479da3be4fa | 来源:发表于2018-06-25 19:37 被阅读16次

******************************************************************************************

关注凡猫学院:加微信+17031115530,拉测试微信群交流

关注凡猫学院:加微信+17031115530,拉测试微信群交流

*******************************************************************************************

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

根据前一篇文章《移植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);

微信+17031115530,拉测试微信群交流

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;

微信+17031115530,拉测试微信群交流

}

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,

微信+17031115530,拉测试微信群交流

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

******************************************************************************************

关注凡猫学院:加微信+17031115530,拉测试微信群交流

关注凡猫学院:加微信+17031115530,拉测试微信群交流

*******************************************************************************************

相关文章

网友评论

      本文标题:移植MonkeyRunner 的图片对比和获取子图功能的实201

      本文链接:https://www.haomeiwen.com/subject/kdcuyftx.html