进阶之UIAutomator
来到这里了,说明你已经学会了以下几个项目:
- Appium Server的启动
- App元素定位
- 脚本编写和执行
OK,我们接下来学习一下关于UIAutomator
在Appium中的应用。
我们都知道,Appium的默认运行模式就是基于UIAutomator
的,熟悉UIAutomator
的同学们应该知道,本身就是一个测试框架,它有非常多实用的特性,那在我们的实际应用当中,我们需要了解和学习它的哪些东西呢?
UIAutomator
这里不具体展开UIAutomator
的框架本身的内容。建议大家先去testerhome-UIAutomator板块了解学习一下。
其中主要有几个对象需要重点学习:
- UIDevice
- UISelector
- UIScrollable
本文主要针对两个业务场景来为大家介绍UIAutomator的使用实践。
核心讲解的是在AndroidDriver
中,findElementByAndroidUIAutomator
这个方法的使用。
第一式 多属性联合查询定位
当我们遇到一个元素,它没有唯一的ID、Text、ClassName等明显标记可以唯一确定它的时候,往往需要联合该元素的多个属性来唯一确定它的位置。
常见场景:假设页面A为导航页,该页面全部的元素都是由ImageView组成,包括上面唯一可点击的按钮跳过
,都是一个ImageView空控件,这些IV控件没有任何ID、Text标记,那我们怎么点击到跳过
这个IV控件呢?
有同学可能会说,获取这个页面的所有IV控件,然后通过序号的方式去点击。
ok,这是一种解决方案。但是并不完美。
我们打开uiautomatorviewer
来分析一下这个场景,布局上全都是ImageView
控件,没有ID,没有Text,没有Content-Desc。但是我们能够从上面发现,跳过
这个控件有另外一个特点,它的clickable
属性是True,其他的IV却都是False。
这说明它是这个页面中所有ImageView
控件中唯一一个可点击的。
ok,这就是我们的切入点。我们现在也明确,我们要点击的元素的明确特征是:
- 1.是ImageView(
className='Android.widget.ImageView'
) - 2.是可点击的(
clickable=true
)
那么我们怎么将这两个属性组合起来查询?
我们可以直接使用UIAutomator的方式:
//UiAutomator原生的定位方式
UiObject iv = new UiObject(new UiSelecor().className("android.widget.ImageView").clickable(true);
iv.click();
那在Appium里的实现就是:
WebElement iv = driver.findElementByAndroidUIAutomator("new UiSelector().className(\"android.widget.ImageView\").clickable(true)");
iv.click();
这里需要特别说明的是,
findElementByAndroidUIAutomator
方法获取的对象就是UiObject
本身,所以是写法如上。
第二式 ListView自动搜索查询
当我们碰到很长的ListView,且需要在这个ListView里面查询指定的元素的时候。我们如何做呢?生硬的swipe+findElement适用吗?
场景:在班级列表中找到带有上课中
字样的选项,然后点击。
常见的swipe
滑动List,然后findelement
找到指定的元素,这个方式也是可用的,但是实在不稳定,因为我们不能确定到底滑动多少次,才进行元素点击,也不知道什么时候才滑动到了最后。所以这个方法是不可行的。
正确的方法:
//UiAutomator原生
//此方法的含义是先获取当前页面可滑动的元素,然后在这个元素的基础上,找到包含`上课中`这三个字的项目,再点击。
UiObject cl = new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(new UiSelector().textContains("上课中"));
cl.clickt()
那么,在Appium中的写法就是:
WebElement cl = driver.findElementByAndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(new UiSelector().textContains(\"上课中\"))");
cl.click()
快去尝试一下吧。
相关资料:http://developer.android.com/intl/zh-cn/tools/testing-support-library/index.html