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. 客户机中PLSQL DEV访问虚拟机中的ORCLE11g,错误百出!

    客户机中PLSQL DEV访问虚拟机中的ORCLE11g,错误百出! 创建时间: 2017/10/14 18:44 作者: CNSIMO 标签: ORACLE 忙了一下午,只有两个字形容:麻烦!   ...

  2. 由String的构造方法引申出来的java字符编码

    在String类的constructors中,有一个constructor是将int数组类型转化为字符串: int[] num = {48,49,50,51,52}; String numStr = ...

  3. Java继承--覆盖

    java中支持单继承.不直接支持多继承,但对C++中的多继承机制进行改良. 单继承:一个子类只能有一个直接父类. 多继承:一个子类可以有多个直接父类(java中不允许,进行改良).不直接支持,因为多个 ...

  4. Java 线程基本知识

    线程 线程和进程 进程 : 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程 : 线程是进程中的一个执行单元(执行路径 ...

  5. faster-rcnn中ROI_POOIING层的解读

    在没有出现sppnet之前,RCNN使用corp和warp来对图片进行大小调整,这种操作会造成图片信息失真和信息丢失.sppnet这个模型推出来之后(关于这个网络的描述,可以看看之前写的一篇理解:ht ...

  6. web开发|如何选择合适的webui框架

    在市场中很多人分不清框架和库的区别,部分只知道框架模糊的概念.所以在选择webUI框架的时候就会仁者见仁智者见智,会存在各抒己见也是很正常的,这里整体都叫框架吧,在市场中不断的淘汰与创新,主要以Vue ...

  7. MySQL索引(2)

    一.索引基础 1. B-Tree索引 <1> 所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同. <2> 顺序组织存储,很适合查找范围数据,效率会非常高. <3& ...

  8. LeetCode 563. Binary Tree Tilt (二叉树的倾斜度)

    Given a binary tree, return the tilt of the whole tree. The tilt of a tree node is defined as the ab ...

  9. LeetCode 442. Find All Duplicates in an Array (在数组中找到所有的重复项)

    Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others ...

  10. 【Vue】利用父子组件间通信实现一个场景

    组件间通信是组件开发的,我们既希望组件的独立性,数据能互不干扰,又不可避免组件间会有联系和交互. 在vue中,父子组件的关系可以总结为props down,events up: 在vue2.0中废弃了 ...