uiautomator是在Android自动化测试中经常用到的工具,而要实现群控系统或者云控系统,模拟点击是必不可少的技术。在模拟点击的实现过程中,我们首选是uiautomator。在我们实现微信群控系统的过程中,首先要弄清楚这个框架的优缺点,以及如何使用该框架

          下面总结一下该框架的几个优点:
                                    Google自家推出的,其稳定性和后续的维护更新可以得到保障,运行时也有更多的权限。
                                  可以跨进程操作,这点比起其它基于instrumentation框架的自动化工具如Robotium是无法直接做到的。
                                  运行速度快。
               缺点:
                                  不支持Android4.1以下的版本。
                                 不支持Webview,所以一般无法对浏览器应用进行测试。

            下面就该框架进行简单的介绍,

            

  • UiAutomatorTestCase :这个类是继承自Junit TestCase (Junit),对外提供setup、teardown等,以便初始化用例、清除环境等。所以我们在编写的UiAutomator 的脚本时一般都要继承这个类,这样就可以直接使用它的一些方法和Junit单元测试框架中的Assert断言机制。

 

  • UiObject :UiObject可以代表页面的任意元素,但它的各种属性定位通常是通过UiSelector这个类来辅助完成的。

 

 

  • UiDevice :在测试时可以通过getUiDevice() 来实例化UiDevice对象去对设备进行各种控制,如唤醒屏幕,锁屏,点击Home, Back,Menu键等等。

 

 

  • UiSelector : 主要是通过一定查询方式,可以通过UiSelector对象去定位UI元素。如果发现多个满足条件的控件则会返回第一个控件,在使用UiSelector的时候可以组合使用多个属性来定位具体的控件,还可以使用childSelector()函数来嵌套UiSelector对象。

 

  • UiCollection: UiCollection一般与UiSelector连用,如它的构造函数也要求提供UiSelector: UiCollection(UiSelector selector)。它的API较少,主要用以从Uiselector筛选出的元素集中挑出所要的元素:getChildByDescription(), getChildByInstance(), getChildByText() ,以及统计元素集的个数getChildCount()。

 

  • UiScrollable:UiScrollable 用来表示可以滑动的界面元素,其继承关系为UiObject -> UiCollection ->UiScrollable。但UiAutomator的实现方式与HierachyView+Monkey有很大不一样。以控件点击操作为例,其实现流程大致如下:

定义一个点击对象Object,该对象则通过UiSelector对象定位到具体的控件。而UiSelector则通过UiAutomatorBridge(它可看做是UiSelector与AccesibilityService之间的连接器),将查询内容(AccessibilityNodeInfo)和输入事件(AccessibilityEvent)传给AccessibilityService。实际业务过程比这复杂的多。这样,就实现了对某个控件的查找或点击操作。备注:AccessibilityEvent,所有可操纵的UI元素都定义为一个AccessibilityEeventt;AccessibilityNodeInfo指视窗中的组件树节点。

        我们在开发群控系统或者云控系统的过程中主要用到的是UiDevice 提供的各种api,在这里我们不再一一介绍,罗列出相应的api,大家可以自行百度查询

UiDevice-API详解 :https://wenku.baidu/view/7fe534bfa32d7375a517804b.html,这篇文章详细的介绍个各种方法是怎么应用的,大家可以参考。

       现在我们提供部分源代码供大家参考

    UiObject  text1=new UiObject(new UiSelector().text("开始查看"));
           if(text1.exists())
           {
            text1.clickAndWaitForNewWindow();
           }
           UiObject  text10=new UiObject(new UiSelector().text("查看附近的人"));
           if(text10.exists())
           {
               text10.clickAndWaitForNewWindow();
           }
           UiObject  text=new UiObject(new UiSelector().text("提示"));
                UiObject  text4=new UiObject(new UiSelector().text("取消"));
                UiObject text2=new UiObject(new UiSelector().text("确定"));
                UiObject text3=new UiObject(new UiSelector().className("android.widget.CheckBox"));
                if(text.exists()&&text4.exists()&&text2.exists()&&text3.exists()){
                    text3.click();
                    text2.click();
                    SystemClock.sleep(5000);
                }
                UiObject  text51=new UiObject(new UiSelector().text("女"));
                UiObject  text52=new UiObject(new UiSelector().text("地区*"));
                UiObject text53=new UiObject(new UiSelector().text("下一步"));
                if(text51.exists()&&text52.exists()&&text53.exists()){
                    text51.click();
                    text52.clickAndWaitForNewWindow();
                    UiObject text54=new UiObject(new UiSelector().resourceId("com.tencent.mm:id/ik"));
                    text54.clickAndWaitForNewWindow();
                    text53.clickAndWaitForNewWindow();
                    SystemClock.sleep(2000);
                }
               // SystemClock.sleep(2000);
                for(int k=0;;k++)
                {
                SystemClock.sleep(3000);
                UiObject xnearby=new UiObject(new UiSelector().resourceId("com.tencent.mm:id/as2").instance(0));
                    if(!xnearby.exists())
                    {
                    UiObject  text5=new UiObject(new UiSelector().text("提高微信定位精确度"));
                        UiObject  text6=new UiObject(new UiSelector().text("跳过"));
                        UiObject text7=new UiObject(new UiSelector().text("设置"));
                        if(text5.exists()&&text6.exists()&&text7.exists()){
                        text6.clickAndWaitForNewWindow();
                                mDevice.pressBack();
                                Utilities.txtClick("附近的人",mDevice);
                               // SystemClock.sleep(3000);
                               // mDevice.pressBack();
                            }else
                            {
                            mDevice.pressBack();
                                 Utilities.txtClick("附近的人",mDevice);
                                 // SystemClock.sleep(3000);
                            }
                    }else
                    {
                    break;
                    }
                    if(k>10)
                    {
                    break;
                   
                    }
                }
                UiObject xnearby=new UiObject(new UiSelector().resourceId("com.tencent.mm:id/as2").instance(0));
                if(!xnearby.exists())
                {
                return;
                }
                if(!sex.equals("0"))
                {
                UiObject  text8=new UiObject(new UiSelector().className("android.support.v7.widget.LinearLayoutCompat"));
                    if(text8.exists())
                    {
                    text8.clickAndWaitForNewWindow();
                    String sextext="";
                    if(sex.equals("1"))
                    sextext="只看男生";
                    if(sex.equals("2"))
                    sextext="只看女生";
                    UiObject  text9=new UiObject(new UiSelector().text(sextext));
                          text9.clickAndWaitForNewWindow();
                    }
                }

         在我们的开发过程中,模拟点击模拟输入等等是我们开发微信群控系统源码,微信云控系统源码,以及一部手机100个微信号系统源码,的必备技术。

以上是UiAutomator的大致介绍以及直线,如有疑问或者需要源码,请加v:393231639

         

更多推荐

微信群控,微信云控系统源码之uiautomator框架介绍