zoukankan      html  css  js  c++  java
  • 自己动手修改Robotium代码(下)

    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 = 0i < views.lengthi++){
           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);
  • 相关阅读:
    MariaDB的安装与启动
    Win10系统提示对于目标文件系统过大
    kvm中重命名虚拟机
    libvirt启动报错Failed to start Virtualization daemon
    常用的一些开源小工具 之 日期时间类
    常用的一些开源小工具 之 StringUtils
    zookeeper之 watch机制(三)
    shiro权限框架使用详解
    zookeeper节点之 java操作 和zookeeper-权限(ACL),设置超级用户(二)
    时间处理Date,最好改成 LocalDateTime ,时间计算,格式化时间,增加减少时间
  • 原文地址:https://www.cnblogs.com/TestingOn/p/3980936.html
Copyright © 2011-2022 走看看