美文网首页
自己动手修改Robotium代码(下)

自己动手修改Robotium代码(下)

作者: 思考的犀牛 | 来源:发表于2015-12-25 15:41 被阅读76次

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可见
  2. view已经被focus上(就是该view是否处于被选中的、被激活的窗口中)
  3. 渲染时间排在最后
    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代码(下)

    public void takeScreenshot(){ View decorView = viewFetc...

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

    Robotium作为Android自动化测试框架,还有许多不完善的地方,也不能满足测试人员的所有要求。那么,本文以...

  • .NET 自动化打包Flutter apk

    代码很长,你要忍一下~~~ 代码: 结果: 兄弟,我先抛块儿砖 更多的要自己动手了 例如打包 release版本、...

  • sourcetree使用

    分支新建,代码不在master下修改,在新建的分支下,修改代码,push到服务器,然后切换回master,并且选中...

  • Git命令-Linux下提交代码

    一、Linux 下 Git 提交代码的五个步骤 查看代码的修改状态 查看代码的修改内容 暂存需要提交的代码 提交已...

  • CocoaPods 更新自己的库

    创建完成之后,如果代码进行了修改,需要重新上传代码;因为不太熟练,所以进行一下记录. 1.修改代码 2.修改.po...

  • 案件库提交代码

    1、更新pra分支,直接在pra分支修改2、修改代码,修改case下的README文件,添加修改说明: TAPD-...

  • git merge 冲突显示

    <<<<<<< HEAD 本地代码 ======= 拉下来的代码 >>>>>>> 修改完后最好pod install一下

  • JsonKit 崩溃 2019-07-10

    代码修改前: 代码修改后

  • Vue 文件大小写修改 git忽略

    老项目代码规范修改中, 将文件名大小写按规范修改了下,同事再拉代码的时候报错。 原因:git自动忽略大小写的修改,...

网友评论

      本文标题:自己动手修改Robotium代码(下)

      本文链接:https://www.haomeiwen.com/subject/gttbhttx.html