[转]截图原理(一)——Android自动化测试学习历程(1)

来源:互联网 发布:我的购物车淘宝网手机 编辑:程序博客网 时间:2024/05/01 03:57
把两节的内容汇总起来,第一节讲的是如何在apk中直接进行截屏,用到了Robotium的Solo类的takeScreenShot方法,有一个小的demo,以及从方法一直往里钻,知道它具体是怎么进行截屏的。

第二节讲的是脱离apk,直接在PC端截图,通过的是adb桥接的方式,调用ddmlib.jar包中的AndroidDebugBridge和IDevice的类,对其进行截屏,并保存到我想要的位置,是可以写成一个小工具的。

 

视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877120&courseId=712011 

 

一、面试问题引入:

1、怎样在一个app崩溃前复现bug操作步骤?(非手工和人眼操作)

答:可以通过截图实现,在关键步骤处均进行截图操作,这样app崩溃了也能够根据之前的截图进行现场确认和步骤复现。那么如何实现截图?

可以通过:

1、monkeyrunner里面——device.takeSnapshot()

2、Robotium里面——solo.takeScreenshot(String pictureName)

面试问题:

(1)takeScreenshot的实现原理?通过哪些方法得到截图?是单线程还是多线程?得到的视图对象是单一View还是View数组?如果没有装载sdk卡,或者说想要保存在PC端,该如何处理呢?

二、Robotium实现截屏操作,及原理

具体的screenshot以及robotium在有源码的情况下的一个具体testcase类就是如下这样的示例:

复制代码
package com.li.xiami.test;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.android.robotium.solo.Solo;
import com.li.xiami.MainActivity;

import android.test.ActivityInstrumentationTestCase2;

public class ScreenShot extends ActivityInstrumentationTestCase2<MainActivity> {

    //包名
    static String packageName = "com.li.xiami";
    //声明一个robotium的solo类
    private Solo solo;
    
    private static String tag = "xiami";
    
    //构造方法中写好包名和类名,让ActivityInstrumentationTestCase2能够找到被测试的app
    //的MainActivity
    @SuppressWarnings("deprecation")
    public ScreenShot(){
        //super(packageName, MainActivity.class);
        super(MainActivity.class);
    }
    
    @Before
    protected void setUp() throws Exception {
        super.setUp();
        //初始化solo对象
        solo = new Solo(getInstrumentation(), getActivity());
    }

    @After
    protected void tearDown() throws Exception {
        solo.finishOpenedActivities();
    }

    @Test
    public void test() {
        solo.clickOnButton("OK");
        solo.sleep(1000);
        solo.takeScreenshot("123picture");
        solo.sleep(3000);
    }

}
复制代码
第一次运行:

但是第一次运行的时候出现了这样的问题:提示:Test Run Failed:java.lang.ClassNotFoundException

但是我该配置的都配置了(包括bulid path的配置,solo包的导入以及jnuit4的包的导入等,以及类名也检查了好几遍都是对的啊),后来才找到了问题的原因:

我的project.properties中的target=android-18,然后我的AndroidManifest.xml中配置的uses-sdk的targetSdkVersion是写的17:

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />

所以就出现了这个问题,把这个也修改成18之后,程序就能跑通了。。。

 

问题总结:

1、robotium中可能出现的Test run failed:classnotfoundexception的可能原因:

(1)jar包的导入有问题,需要确认build path的Libraries和Order and Export,都需要勾选上

(2)真的是待测的apk的MainActivity的类没找到,比如说有源码的情况,类名写错了;或者是无源码的情况,MainActivity的类名获取错误了进而也写错了导致出现的这个问题

(3)就是刚才出现的这个project.properties中的target与androidManifest.xml中配置的targetSdkVersion不匹配

 

所有说各种问题啊,不一定报的这个exception,就一定是你class not found。。。

 

第二次运行:

第二次运行好不容易跑通了,但是通过DDMS里面的File Explorer工具查看mnt/sdcard/Robotium-Screenshots目录下查看是否生成了我想要的文件,结果发现根本就没有Robotium-Screenshots文件夹,也就是说当第一次往sdk卡里面写东西的时候,竟然连文件夹都没有建立起来,那就要想到是不是权限问题?

然后就需要配置uses-permission节点:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

配置这个节点的具体位置在:manifest里面,但是在Application节点之外,而且在Application节点以上,否则会报错。。。

 


0 0