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

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

1. 背景

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

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

  • 最上面的作为整个ListView的Title文本为“Notes”的TextView,Index为0
  • 中间的文本为“note2”的TextView,Index也是0
  • 最下面的文本为“note1”的TextView,Index是1

2. xPath获取控件方式

2.1 通过判断控件属性获取控件

控件的所有属性都可以用作判断,比如它的text,index,resource-id是否clickable等,例如:

2.1.1 通过文本查找目标控件

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

2.1.2 通过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"));

2.1.3 通过其他属性查找目标控件

TBD

,这些就不一一列举了,参照以上两个示例进行实现就可以了

2.2 通过指定选择集合的位置获得控件

按照我的实践和理解,通过这种方式获取控件是不靠谱的,起码存在两个问题。

  • 问题1:控件在集合中的位置是不可控的。
el = driver.findElementByXPath("//android.widget.TextView[1]");
assertThat(el.getText(),equalTo("note2"));

以上的例子我原意是想把UIAutomatorViewer里面的上中下3个TextView中的中间那个给找出来,但结果返回来给我的确实最上面的那个“Notes”。

  • 问题2:通过增加路径层数限制查找指定元素集合不起效。
el = driver.findElementByXPath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.TextView[0]");
assertThat(el.getText(),equalTo("note2"));

以上例子我本意是想通过增加父路径的限制来表明“我想要的控件是ListView下面的那两个TextView控件中的第一个”,但返回给我的是“An unknown server-side error occurred while processing the command",感觉是越界了的样子。

最新文章

  1. 【转】Caffe初试(九)solver及其设置
  2. 从vs2010的UnitTestFramework类库提取私有方法反射调用的方法
  3. NEFU 505 超级红与黑 (高斯消元)
  4. python---hashlib
  5. 解决关于ArcGIS10.2服务手动启动的问题
  6. Java for LeetCode 042 Trapping Rain Water
  7. ASP.NET CORE Web浏览器和Web服务器
  8. Android客户端token简介和简单应用
  9. sort_buffer_size:
  10. 45个非常有用的 Oracle 查询语句小结
  11. kill 和killall----杀死进程
  12. Java开发笔记(四)Java帝国的度量衡
  13. Luogu4640 BJWC2008 王之财宝 容斥、Lucas
  14. SV processses
  15. VMware部署ubuntu后开机提示piix4_smbus: Host SMBus controller not enabled!
  16. C语言atoi函数(将字符串转化为int)
  17. SICP读书笔记 2.3
  18. 爬虫之 图片懒加载, selenium , phantomJs, 谷歌无头浏览器
  19. 线程概要 Java
  20. js数组 标签: javascript 2016-08-03 14:15 131人阅读 评论(0) 收藏

热门文章

  1. Mongodb副本集搭建经验
  2. 贴上自己写的代码-jq隐藏事件
  3. html页面 代码 编写的 一些 基本素养 约定 知识点
  4. php中关于 left join 的分页显示
  5. Properties类的使用方法
  6. java练手 韩信点兵
  7. Linux程序编写shell script的格式
  8. 网络编程3-URL编程(URL)
  9. 跟着百度学PHP[4]OOP面对对象编程-11-Final关键字
  10. 跟着百度学PHP[4]-OOP面对对象编程-1-什么是面对对象编程