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

扫描码:

tp=webp" alt="" style="max-width:100%; margin:0px; padding:0px; height:auto!important; word-wrap:break-word!important; width:auto!important; visibility:visible!important">

http://blog.csdn.net/zhubaitian


移植MonkeyRunner的图片对照和获取子图功能的实现-UiAutomator/Robotium篇的更多相关文章

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

    根据前一篇文章<移植MonkeyRunner的图片对比和获取子图功能的实现-Appium篇>所述,因为Appium和MonkeyRunner有一个共同点--代码控制流程都是在客户端实现的. ...

  2. 移植MonkeyRunner的图片对照和获取子图功能的实现-Appium篇

    假设你的目标測试app有非常多imageview组成的话,这个时候monkeyrunner的截图比較功能就体现出来了. 而其它几个流行的框架如Robotium,UIAutomator以及Appium都 ...

  3. 移植MonkeyRunner的图片对比和获取子图功能的实现-Appium篇

    如果你的目标测试app有很多imageview组成的话,这个时候monkeyrunner的截图比较功能就体现出来了.而其他几个流行的框架如Robotium,UIAutomator以及Appium都提供 ...

  4. Java通过图片url地址获取图片base64位字符串的两种方式

    工作中遇到通过图片的url获取图片base64位的需求.一开始是用网上的方法,通过工具类Toolkit,虽然实现的代码比较简短,不过偶尔会遇到图片转成base64位不正确的情况,至今不知道为啥. 之后 ...

  5. 用函数式的 Swift 实现图片转字符画的功能

    今天整理 Pocket 中待看的文章,看到这篇<Creating ASCII art in functional Swift>,讲解如何用 Swift 将图片转成 ASCII 字符.具体原 ...

  6. (转)Android学习-使用Async-Http实现图片压缩并上传功能

    (转)Android学习-使用Async-Http实现图片压缩并上传功能 文章转载自:作者:RyaneLee链接:http://www.jianshu.com/p/940fc7ba39e1 让我头疼一 ...

  7. 在iOS开发的Quartz2D使用中实现图片剪切和截屏功能

    原文  http://www.jb51.net/article/75671.htm 图片剪切一.使用Quartz2D完成图片剪切1.把图片显示在自定义的view中先把图片绘制到view上.按照原始大小 ...

  8. MD5工具类,提供字符串MD5加密、文件MD5值获取(校验)功能

    MD5工具类,提供字符串MD5加密(校验).文件MD5值获取(校验)功能 : package com.yzu.utils; import java.io.File; import java.io.Fi ...

  9. 批量生成反色图片,用PHOTOSHOP批处理功能。

    http://zhidao.baidu.com/link?url=Iz46PDPnEITummTEwo2GtUrK6AeAjlidJ7HtCPJ6NYZJbbllRwNg2iBAcNwF2TYjccP ...

随机推荐

  1. 课堂笔记III

  2. maven学习(六)——在别的项目中引用通过Maven安装生成的项目的jar包

    1.新建HelloFriend项目,同时建立Maven约定的目录结构和pom.xml文件 HelloFriend    | --src | -----main | ----------java | - ...

  3. PAT1032

    为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行,每行给出一位 ...

  4. LINUX系统安装MYSQL命令

    1.下载安装包 wget http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz    2. ...

  5. java主要集合类的数据结构学习

    http://www.cnblogs.com/beanmoon/archive/2012/11/22/2782442.html 在程序中,集合类每天都在使用,以致于某些代码充斥着List和Map,一直 ...

  6. 【bzoj4810】[Ynoi2017]由乃的玉米田 莫队算法+STL-bitset

    题目描述 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题 这个题是这样的: 给你一个序列a,长度为n ...

  7. flink原理介绍-数据流编程模型v1.4

    数据流编程模型 抽象级别 程序和数据流 并行数据流 窗口 时间 有状态操作 检查点(checkpoint)容错 批量流处理 下一步 抽象级别 flink针对 流式/批处理 应用提供了不同的抽象级别. ...

  8. web储存用户信息

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. [ARC082F] Sandglass(线段树)

    Description 有一个沙漏由两个上下相通玻璃球 \(A\) 和 \(B\) 构成,这两个玻璃球都含有一定量的沙子,我们暂且假定 \(AB\) 中位于上方的玻璃球的为 \(U\),下方的玻璃球为 ...

  10. 【Android】SQLite基本用法(转)

    在Android开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面.本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的.一. ...