美文网首页
移植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