如文章《Appium 基于安卓的各种 FindElement 的控件定位方法实践》所述,Appium 拥有众多获取控件的方法。其中一种就是根据控件所在页面的 XPATH 来定位控件。

本文就是尝试通过自己的试验来尝试对 Appium 如何用 xpath 来定位控件做一个阐述,当中如有不对的地方敬请大家指出。

背景

本文尝试使用的试验对象是 SDK 自带的 NotePad 应用实例,假设已经有两个 Notes 分别是 “note1” 和 “note2” 添加到 Notepad 上面,我们要做的就是尝试用 xpath 的方法来定位 “note2” 这个 ListView 下面的 TextView 控件。

注意界面上有 3 个 TextView 类型的控件:

xPath 获取控件方式

控件的所有属性都可以用作判断,比如:

* 通过文本查找目标控件

el = driver.findElementByXPath("//android.widget.TextView[contains(@text,'note2')]");
assertThat(el.getText(),equalTo("note2"));

* 通过 index 查找目标控件

如果我们像下面的方式使用 index 为 0 来查找控件 note2,那么将会失败,因为该 xpath 只是说 “我要查找页面上 android.widget.TextView 类型的 index 为 0 的控件 “,但如背景所说我们事实上有 3 个 TextView 控件,其中最上面的和中间的控件他们的 Index 都是 0.所以最终获得的控件其实是 Appium 第一个找到的最上面文本为” Notes“的 TextView。
el = driver.findElementByXPath("//android.widget.TextView[contains(@index,0)]");
assertThat(el.getText(),equalTo("note2"));
那么我们就要想办法加多点路径,让 xpath 能分辨出需要的是下面的 index 为 0 的 TextView,而不是上面的。观看上图的 UIAutomatorViewer 控件的分层结构,发现这两个 TextView 是从 LinearLayout 开始分叉的,所以我们应该从该路径开始通过数组下标指定我们需要的是” 在 LinearLayout 下面的第二个 FrameLayout 下面的 ListView 下面的 Index 为 0 的 TextView:

el = driver.findElementByXPath("//android.widget.LinearLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.TextView[contains(@index,0)]");
assertThat(el.getText(),equalTo("note2"));

* 通过其他属性查找目标控件
TBD,这些就不一一列举了,参照以上两个示例进行实现就可以了

作者:天地会珠海分舵
http://techgogogo.com
http://blog.csdn.net/zhubaitian


↙↙↙阅读原文可查看相关链接,并与作者交流