进阶之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