如文章《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




android 获取控件隐藏 获取app控件_android 获取控件隐藏


 


2. xPath获取控件方式

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


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


2.1.1 通过文本查找目标控件


[java]  view plain copy

 


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


2.1.2 通过index查找目标控件


[java]  view plain copy

 


  1. el = driver.findElementByXPath("//android.widget.TextView[contains(@index,0)]");  
  2. "note2"));  


[java]  view plain copy

 

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


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


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

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


  • 问题1:控件在集合中的位置是不可控的。


[java]  view plain copy

 


  1. el = driver.findElementByXPath("//android.widget.TextView[1]");  
  2. assertThat(el.getText(),equalTo("note2"));  


  • 问题2:通过增加路径层数限制查找指定元素集合不起效。

[java]  view plain copy

 


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


2.4 xpath用法官方手