public void takeScreenshot(){
   View decorView = viewFetcher.getRecentDecorView(viewFetcher.getWindowDecorViews());
   screenshotTaker.takeScreenshot(decorView, null);
}
 
viewFetcher.getWindowDecorViews()用来获取当前屏幕上堆积的所有DecorView(可以把一个DecorView当做是一个画布,当你打开好多Activity时,相当于有好几个画布叠在了一起,每个画布上画着一个activity的画面)。而viewFetcher.getRecentDecorView()就相当于取最上一层的画布。进入ViewFetcher.java文件观察viewFetcher.getRecentDecorView()的源码,我发现它在排除了一些无用的view后,实际返回的是ViewFetcher.java中的另一个函数的结果:getRecentContainer(decorViews)。Be patient, 让我们看看getRecentContainer(decorViews)里卖的是什么药:
private final View getRecentContainer(View[] views) {
   View container = null;
   long drawingTime = 0;
   View view;

for(int i = 0; i < views.length; i++){
       view = views[i];  if (view != null && view.isShown() && view.hasWindowFocus() && view.getDrawingTime() > drawingTime) {
            container = view;
            drawingTime = view.getDrawingTime();
       }
   }
   return container;
}

getRecentContainer(decorViews)函数判断哪个view在最上层的方法,是判断:
1. view不为空
view可见
3. view已经被focus上(就是该view是否处于被选中的、被激活的窗口中)
4. 渲染时间排在最后
public void takeScreenshot(){
    View decorView = null;
while(decorView == null){
    sleep(500);
    View[] decorViews = viewFetcher.getWindowDecorViews();
    decorView = viewFetcher.getRecentDecorView(decorViews);
}
screenshotTaker.takeScreenshot(decorView, null);
}
https://code.google.com/p/robotium/issues/detail?id=434&colspec=ID%20Type%20Stars%20Status%20Priority%20Milestone%20Owner%20Summary
Solo.java中添加:
 
public void assertCurrentActivity(String message, String name, int timeout, boolean takeScreenshot)
{    
   if(takeScreenshot){
       asserter.assertCurrentActivity(message, name, timeout, this);
   } else
       assertCurrentActivity(message, name, timeout);
}

Asserter.java中添加:

public void assertCurrentActivity(String message, String name, int timeout, Solo solo)
{
   if(!waiter.waitForActivity(name, timeout)){
       solo.takeScreenshot("test_" + message + "_Failure");
       Assert.assertTrue(message, false);
   } else 
       solo.takeScreenshot("test_" + message + "_Success");
   
}
 
我曾经在《结合HierarchyViewer和APK文件反编译获得APP元素id值》一文中非常SB地写了出了如何通过HierarchyViewer里的id名获得元素的id整型值。现在,我知道了新的方法,会结合HierarchyViewer来进行自动化测试的人民有福了:

Solo.java中添加:
 
public View getViewByHierarchyViewerId(String id){
   Context currContext = instrumentation.getTargetContext();
   String packageName = currContext.getPackageName();
   int viewId = currContext.getResources().getIdentifier(id, "id", packageName);
   return getView(viewId);

自己动手修改Robotium代码(下)的更多相关文章

  1. 自己动手修改Robotium代码(上)

    Robotium作为Android自动化测试框架,还有许多不完善的地方,也不能满足测试人员的所有要求.那么,本文以四个实际中碰到的问题为例,介绍改动Robotium源码的过程. public bool ...

  2. eclipse下设置tomcat,修改Java代码不必重启tomcat

    1.本文目的:用tomcat进行web开发时,修改Java代码往往要重启代码,当工程较大启动较慢时,严重影响效率,本文通过eclipse下tomcat开发和发布web程序时,对一些Java代码一般修改 ...

  3. Blender 之修改器代码分析

                           Blender的修改器(modifier)模块,默认界面右下块(Property)面板的扳手,分类(修改.生成.形变.模拟)列出所有的修改器.也可以空格键 ...

  4. 如何用chrome修改js代码,跳过网站等待时间

    用chrome修改js代码 By Z.H. Fu 切问录 [maplewizard.github.io](http://maplewizard.github.io ) 网页中大部分的限制都是由js编写 ...

  5. 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案

    作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一 ...

  6. 本地修改js代码并时时生效的解决办法

    js作为客户端语言(当然它也可以作服务端语言),非常强悍,一般情况下,我们都是在开发阶段不停的改,然后上线之后就作为稳定运行的代码. 然而有时候可能因为js写得有问题,导致上线后,某些功能无法使用,这 ...

  7. PyCharm 配置远程python解释器和在本地修改服务器代码

    PyCharm 配置远程python解释器和在本地修改服务器代码 最近在学习机器学习的过程中,常常需要将本地写的代码传到GPU服务器中,然后在服务器上运行.之前的做法一直是先在本地写好代码,然后通过F ...

  8. eclipse 修改java代码不重启服务器 生效配置

    1.本文目的:用tomcat进行web开发时,修改Java代码往往要重启代码,当工程较大启动较慢时,严重影响效率,本文通过eclipse下tomcat开发和发布web程序时,对一些Java代码一般修改 ...

  9. HOOK大法实现不修改程序代码给程序添加功能

    [文章标题]: HOOK大法实现不修改程序代码给程序添加功能[文章作者]: 0x18c0[软件名称]: Scylla[使用工具]: OD.Stub_PE.ResHacker[版权声明]: 本文原创于0 ...

随机推荐

  1. WPF 在事件中绑定命令(不可以在模版中绑定命令)

    其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是 ...

  2. 从字符串获得MAC地址的方法

    今日有感于编程水平下降,特意练习一下,根据MAC地址字符串,获取MAC地址的2种方法. #include <stdio.h> void func1(char *str){ unsigned ...

  3. PHP二维关联数组的遍历方式

    采用foreach循环对二维索引数组进行遍历,相对来讲速度更快,效率更高,foreach循环是PHP中专门用来循环数组的.实例也相对简单,多加练习,想清楚程序运行逻辑即可. <?php $arr ...

  4. MySQL5.7以上Zip版官方安装文档(选译)

    前言 在windows上安装Zip版MySQL(选译) 学习mysql的朋友们会发现5.7+版本的mysql变得比以前难安装了许多(当然我们可以选择installer版本,但是这样总感觉对学习mysq ...

  5. C# 使用itextsharp 读取pdf中文字坐标

      程序调用: using iTextSharp.text.pdf; using System; using System.Collections.Generic; using System.Linq ...

  6. Emgu.CV(三)

    像素交换 private void btn_Exchange_Click(object sender, EventArgs e) { if (imageBox1.Image != null) { va ...

  7. eclipse环境下,java操作MySQL的简单演示

    首先先通过power shell 进入MySQL 查看现在数据库的状态(博主是win10系统) 右键开始,选择Windows powershell ,输入MySQL -u用户名 -p密码 选择数据库( ...

  8. MySql数据库的基本原理及指令

    1.什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过SQL对数据库中的数据进行增加,修改,删除及查询操作. 2.简介 MySQL是一个开放源 ...

  9. BZOJ-1225-[HNOI2001] 求正整数

    Description 对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m.例如:n=4,则m=6,因为6有4个不同整数因子1,2,3,6:而且是最小的有4个因子的整数. Input n ...

  10. lintcode 132 模式

    题目要求 给你一个 n 个整数的序列 a1,a2,...,an,一个 132 模式是对于一个子串 ai,aj,ak,满足 i < j < k 和 ai < ak < aj.设计 ...