Appium依据xpath获取控件实例随笔
2016-03-11 15:14
387 查看
如文章《Appium基于安卓的各种FindElement的控件定位方法实践》所述,Appium拥有众多获取控件的方法。当中一种就是依据控件所在页面的XPATH来定位控件。
本文就是尝试通过自己的试验来尝试对Appium怎样用xpath来定位控件做一个阐述,其中如有不正确的地方敬请大家指出。
注意界面上有3个TextView类型的控件:
最上面的作为整个ListView的Title文本为“Notes”的TextView,Index为0
中间的文本为“note2”的TextView,Index也是0
最以下的文本为“note1”的TextView。Index是1
问题1:控件在集合中的位置是不可控的。
问题2:通过添加路径层数限制查找指定元素集合不起效。
本文就是尝试通过自己的试验来尝试对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",感觉是越界了的样子。
2.4 xpath使用方法官方手冊
至于其它非主流获的通过xpath取控件的方式。请參考xpath官方手冊中文版:http://wenku.baidu.com/link?url=tLdn9X4ucgmzYyKj4dpsgSDbshXEw6W8BTyqQAXd0kTMY6lBQqLiIL9FHtcZmdIeO8o5ZKV-fzlw96mFgvmWZ-qz35EPObyv8hKLTuyxbv3作者 | 自主博客 | 微信 | CSDN |
天地会珠海分舵 | http://techgogogo.com | 服务号:TechGoGoGo 扫描码: | http://blog.csdn.net/zhubaitian |
相关文章推荐
- Android 控件重复初始化影响隐藏和显示的控制
- Gradle, Android and the ANDROID_HOME SDK location
- Android PullToRefreshLayout下拉刷新控件的终结者
- android开机动画bootanimation
- iOS之01-基本语法
- Android之Glide获取图片Path、Bitmap用法
- Android开发从系统图库中选择一张图片的方法
- 如何让页面只能在微信端打开?
- Uncaught Error: Error calling method on NPObject.
- 微信WeixinJSBridge API
- Android属性动画封装,快速构建动画
- IOS测试程序运行耗时
- Android PDF开发:android-pdfview
- iosWKWebView截图
- IOS开发 警告 All interface orientations must be supported unless the app requires full screen.
- [Android Studio] Android Studio常用快捷键
- 五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程
- Android EditText的设置
- Android PickerView滚动选择器的使用方法
- Unity 命令行打包