关闭

Android自动化追本溯源系列(1):获取页面元素

发表于:2013-5-16 10:04

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:jinsdu(cnblogs)    来源:51Testing软件测试网采编

  本系列旨在阐述Android自动化的原理,让大家明白如何在Android平台上做自动化,甚至开发出自己的自动化工具来。

  什么是Android自动化?

  相信对于测试同学,这个问题就很简单了。自动化的目的就是做好回归测试,以达到版本控制,并节省人力。而Android自动化就是在Android平台上做测试自动化,相信随着Android开发的日趋盛行,其测试自动化的需求也会逐渐增强,知其然,固然是好,但如能知其所以然,必将锦上添花。

  目前我所知道的做Android自动化的工具有:

  ● Ranorex 支持录制回放功能,但是不太好用,需要在开发代码中注入一段测试代码,并且它是收费的。

  ● Robotium 开源的黑盒测试框架,使用时需要引入一个JAR包,需要测试人员有一定的编码功底,才能编写Test Case。

  ● Monkeyrunner Google随SDK发布的测试工具,功能简单,不是很好用。

  因为是想研究自动化原理,所以这里主要参考Robotium以及Android源码。

  如何识别页面元素?

  做过自动化的同学应该都知道,我们在写涉及UI的自动化case时,其基本思路就是找到某元素—>执行操作,这里的操作要么是动作,要么是是验证。仔细想想,其实道理就是这样。所以说如果我们想开发自己的自动化测试工具时,首要解决的问题就是,如何在测试时,找到页面的元素。

  而在Android中,思路也是一样。

  如何大家研究过Android的窗口机制的话,应该看到过这样的说法,真正实现WindowManager窗口机制的是WindowManagerImpl类,它会把DecorView添加到mViews数组,创建对应的ViewRoot,而DecorView是何物呢?参考我上篇博客:http://www.cnblogs.com/jinsdu/archive/2013/01/03/2840565.html 知道,实际上DecorView是页面最顶层的View,而如果能够获取到它,我们就可以将其转换成ViewGroup,然后遍历其所有子节点从而得到所有的页面元素了。而运用java的反射机制,正好可以在运行时,获取类的属性和方法:

  于是在运行时,获得WindowManagerImpl类:

private static Class<?> windowManager;
    static{
        try {
            String windowManagerClassName = "android.view.WindowManagerImpl";
             windowManager = Class.forName(windowManagerClassName);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }

  然后获得页面的DecorView:

private View[] getWindowDecorViews()
    {

        Field viewsField;
        Field instanceField;
        try {
            viewsField = windowManager.getDeclaredField("mViews");
            instanceField = windowManager.getDeclaredField("sWindowManager");
            viewsField.setAccessible(true);
            instanceField.setAccessible(true);
            Object instance = instanceField.get(null);
            return (View[]) viewsField.get(instance);
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号