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. RabbitMQ高可用集群配置

    1.安装RabbitMQ 1)下载和安装erlang 下载erlang wget http://www.rabbitmq.com/releases/erlang/erlang-18.1-1.el6.x ...

  2. NodeJS 初学之安装配置环境

    [TOC] 1.环境安装 操作系统: Ubuntu 16.04.2 LTS 1.1安装nvm ryan@ryan-900X5L:~/temp$ curl https://raw.githubuserc ...

  3. Charle抓包与wireshark使用

    今天就来看一下Mac上如何进行抓包,之前有一篇文章介绍了使用Fidder进行抓包 http://blog.csdn.net/jiangwei0910410003/article/details/198 ...

  4. 【爬虫入门手记03】爬虫解析利器beautifulSoup模块的基本应用

    [爬虫入门手记03]爬虫解析利器beautifulSoup模块的基本应用 1.引言 网络爬虫最终的目的就是过滤选取网络信息,因此最重要的就是解析器了,其性能的优劣直接决定这网络爬虫的速度和效率.Bea ...

  5. CVPixelBuffer的创建 数据填充 以及数据读取

    CVPixelBuffer的创建数据填充以及数据读取 CVPixelBuffer 在音视频编解码以及图像处理过程中应用广泛,有时需要读取内部数据,很少的时候需要自行创建并填充数据,下面简单叙述. 创建 ...

  6. win10 UWP 显示地图

    微软自带的地图很简单 引用地图xmlns:Map="using:Windows.UI.Xaml.Controls.Maps" 写在<Page> 然后在Grid 用Map ...

  7. 在 Ubuntu 14.04 中安装 Pepper Flash Player For Chromium

    转自:http://blog.csdn.net/ygzhong000/article/details/26160953

  8. wordpress 源代码 高亮显示 (Crayon Syntax Highlighter)

    作为码农,blog 里面不贴源代码像什么话,源代码没有高亮显示,那还怎么看!一番调研之后,Crayon Syntax Highlighter 可能是最流行,功能最强大的一款代码高亮插件了. 一.安装  ...

  9. PHP入门,clone和__clone

      前 言 这篇文章主要介绍了PHP编程中的__clone()方法使用详解,__clone()方法相当于一个浅拷贝,是PHP入门学习中的基础知识,需要的朋友可以参考下. 1对象是引用数据类型,当使用= ...

  10. IP核之初——FIFO添加以太网MAC头部

    本文设计思路源自明德扬至简设计法.在之前的几篇博文中,由于设计比较简单,所有的功能都是用verilogHDL代码编写实现的.我们要学会站在巨人的肩膀上,这时候就该IP核登场了! 说白了,IP核就是别人 ...