UIAutomatorViewer 工具介绍 在你开始写测试用例之前,使用 uiautomatorviewer 工具可以帮助你熟悉你的UI 组件(包括视图和控件),并获取组件的各项属性信息。你可以使用它对当前连接到你电脑上的手机屏幕进行一个快照,然后可以看到手机当前页面的层级关系和每个控件的属性。利用这些信息,你可以写出针对特定 UI 控件的测试用例。 在本地的..\sdk\tools\目录下打开uiautomatorviewer.bat (打开前请手机连接电脑,手机开启 USB 调试)。
1、获取快照:
当你要分析一个页面时,首先将手机的页面停留在你要分析的页面,然后用数据线连接电脑。 然后点击 uiautomatorviewer 左上角的第二个图标按钮DeviceScreenshot,点击之后会将当前手机界面的快照更新到这里来。
2、页面层级:
右上方的整个区域,就是当前页面布局的层级关系。
3、属性详情:
右下方的整个区域,是当前选中的页面或者是控件的属性信息。这部分比较重要,我们以后写代码的时候就是需要通过查看属性中的控件的 id 或者是 text 等来获取控件的实例,然后点击操作它。
定位控件的参数选择要求
原则:对脚本控件定位参数的选择要追求在要求范围内的唯一性。
即除了在多个页面中都会出现的公共控件之外(例如返回按钮),其它的控件定位参数的选择要做到在题目范围内的全局唯一
涉及到使用两种参数对控件进行定位,控件id或控件XPath,其中参数选择优先级:控件Resource-id > 控件 XPath
优先使用控件的 id 来定位控件(对应 driver.findElementById()方法),若id在题目范围内 并不全局唯一, 则 使 用 XPath 进行定位 (对应driver.findElementByXPath()方法)。
例1:
如上图中使用 UI Automator Viewer 工具(这个工具在本机的 Android sdk目录下的 tools 文件夹下,名为 uiautomatorviewer.bat 的文件,双击运行即可启动该工具,点击工具中左上角,见图,第二个按钮即可获取当前已连接设备的当前页面,并查看对应控件属性)查看已连接设备当前页面上的控件及其属性。
对比以上两图可以发现,“商城”控件的 id 为 com.floral.life:id/rb_bottom_shop,而与其同类的控件“我的”的 id 为 com.floral.life:id/rb_bottom_person,我们如果要定位控件“商城”,可知其 id 满足定位参数唯一性的原则,所以这里使用 id 作为“商城”定位的参数
例2:
比较上面两张图可以发现,当前屏幕上“干花”这个控件的 id 和“鲜切花”的 id 是相同的,都为 com.floral.life:id/tv_title。如果我们要定位“鲜切花”这个控件,根据优先使用全局唯一的参数来定位的原则,发现 id 并不全局唯一,不能和例 1 一样处理,故考虑使用 XPath 进行定位。
XPath 是一种特殊的路径,可以理解为使用多个参数来唯一定位到一个控件。在此处我们使用的 XPath 为//android.widget.TextView[@text='鲜切花 '],即其格式如下。
//控件类名[@控件属性名='控件属性值']
即定位到当前页面中的 android.widget.TextView 类控件且其对应的 text 属性值为'鲜切花 '(此处'鲜切花'的花字后面还有一个空格,所以不要自己输入属性值,应该直接把在UI Automator Viewer中的值直接拷贝到代码中去)。
理论上来说 XPath 中的控件属性名可以是该控件的任意属性,但因为全局唯一性的要求,首要选择 text、content-desc 这种特殊性较强的属性值,不要选择 index、bounds 这种多个控件极易相同(即未满足全局唯一)的属性值。
其他注意事项:
①脚本中不要使用 driver.findElementsByxxx()一类的方法,不要用该方法 定位多个控件得到一个 list 再循环来操作 list 中控件(除非该控件的 XPath 都不能满足在测试范围内的全局唯一)。
②脚本中允许自定义函数,但对于 driver.findElementById()这类原生方法,不要进行封装。
③脚本中使用 XPath 进行定位时,务必与脚本编写要求中的 XPath 格式完全一致,即 //控件类名[@控件属性名='控件属性值'] 不要使用//*[@控件属性名='控件属性值']等一系列其他格式。
④ 逻辑上是一句话的代码务必写在一行内,不要在函数的参数处换行。