上一部分提到:自动化测试可以简单分为获取测试工具,找到交互目标,进行操作行为,判断操作结果。这么4步,并且讲解了第一步UiDevice的初始化和使用。
接来下讲解后面3步:
2.找到交互目标:
交互目标常用有2种,UiObject和UiScrollable,分的对应着不用滑动的操作目标和需要滑动的操作目标。
UiObject是属于UIautomator ,而UiObject2则是属于UIautomator 2.0。
UiObject2正常情况是通过UiDevice来寻找。
UiObject2 x= mDevice.findObject(BySelector);
从代码可以看到,第二步的重点是BySelector的查找,找到正确的目标,则x代表目标进行操作。
下面列举了14中比较常用的方式,其中最常用的是By.text By.clazz By.pkg By.res四种。
分别是显示的文字、组件的类名、文件的包名、在布局中的id名字,这四种基本涵盖所有的内容。
1,By.textContains(String substring)通过text包含字符进行选取
2,By.textStartsWith(String substring)通过text第一个字符进行选取
3,By.textEndsWith(String substring)通过text最后一个字符进行选取
4,By.text(String substring)通过text文本进行选取
5,By.text(Pattern textValue)通过text正则式进行选取
6,By.clazz(String className)通过class名称进行先取
7,By.clazz(String packageName, String className)通过package/class名称进行选取
8,By.clazz(Class clazz)通过class进行选取
9,By.clazz(Pattern className)通过正则class名称进行选取
10,By.pkg(String applicationPackage)通过package名称进行选取
11,By.pkg(Pattern applicationPackage)通过正则package名称进行选取
12,By.res(String resourceName)通过resource-id进行选取
13,By.res(String resourcePackage, String resourceId)通过package,resource-id名称进行选取
14,By.res(Pattern resourceName)通过正则resource-id进行选取
这14个只要填写了括号里面的内容,就形成了BySelector,
比如:
UiObject2 canlendar= mDevice.findObject(By.text(“日历”));
就寻找到了桌面上的canlendar的文件。如果桌面上有多个名为日历的文件,则寻找到的是BySelector找到的第一个。
于是对应的寻找就有找好几个的策略,比如短信应用里面有好几个名字为“领导”的短信,那么,
UiObject2 canlendar= mDevice.findObject(By.text(“领导”));
是找到第一个名为领导的目标。
List <UiObject2> canlendarList= mDevice.findObjects(By.text(“领导”));
则是所能找到的所有名为领导的目标群,区别在于mDevice后面跟的是findObject还是findObjects。寻找目标群体则多一个s。
对于canlendar,还可以获取其子部件:
getChildCount()获取其子部件的个数
getChildren()获取子部件的集合
还有一种获取的方案wait(UiObject2Condition<R> condition, long timeout),是指获取的时候,可以等待一段时间。
UiScrollable是获取可以滑动的目标,和UiObject2的区别,体现在第三部进行操作行为。
UiScrollable是使用UiSelector来获取目标,UiSelector和By,在使用上换汤不换药。也是通过显示的文字、组件的类名、文件的包名、在布局中的id名字等待来获取
new UiScrollable(new UiSelector().text( “xx” ));
new UiScrollable(new UiSelector().clazz( “com.android.xxx” ));
new UiScrollable(new UiSelector().pkg( “xxx” ));
new UiScrollable(new UiSelector().resourceIdMatches( “id” ));
其实UiAutomator2.0是在UiAutomator进行了优化的行为。
同样,BySelector也是比UiSelector更加优化的代码。
在使用时,建议优先选择UiObject2 x= mDevice.findObject(BySelector);
仅在面临带有多样化滑动操作时,才使用UiScrollable。