Appium依据xpath获取控件实例随笔
如文章《Appium基于安卓的各种FindElement的控件定位方法实践》所述,Appium拥有众多获取控件的方法。当中一种就是依据控件所在页面的XPATH来定位控件。
本文就是尝试通过自己的试验来尝试对Appium怎样用xpath来定位控件做一个阐述,其中如有不正确的地方敬请大家指出。
1. 背景
- 最上面的作为整个ListView的Title文本为“Notes”的TextView,Index为0
- 中间的文本为“note2”的TextView,Index也是0
- 最以下的文本为“note1”的TextView。Index是1
2. xPath获取控件方式
2.1 通过推断控件属性获取控件
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 通过其它属性查找目标控件
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 |
|
天地会珠海分舵 |
服务号:TechGoGoGo 扫描码:
tp=webp" alt="" style="max-width:100%; margin:0px; padding:0px; height:auto!important; word-wrap:break-word!important; width:auto!important; visibility:visible!important"> |
http://blog.csdn.net/zhubaitian |
Appium依据xpath获取控件实例随笔的更多相关文章
- 【转】Appium根据xpath获取控件实例随笔
原文地址:http://blog.csdn.net/zhubaitian/article/details/39754233 如文章<Appium基于安卓的各种FindElement的控件定位方法 ...
- Appium根据xpath获取控件实例随笔
如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.其中一种就是根据控件所在页面的XPATH来定位控件. 本文就是尝试通过 ...
- Appium根据xpath获取控件
如文章< Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.其中一种就是根据控件所在页面的XPATH来定位控件. 本文就是尝试通 ...
- wpf datagrid 如何自定义行的控件实例,(textbox 并选中则全选)
主要是为了用户输入方便 按回车,选中下一列,text自动获取焦点,输入状态 获取控件实例 https://blog.csdn.net/m15188153014/article/details/486 ...
- Appium+python自动化(二十五)- 那些让人抓耳挠腮、揪头发和掉头发的事 - 获取控件ID(超详解)
简介 在前边的第二十二篇文章里,已经分享了通过获取控件的坐标点来获取点击事件的所需要的点击位置,那么还有没有其他方法来获取控件点击事件所需要的点击位置呢?答案是:Yes!因为在不同的大小屏幕的手机上获 ...
- 第14章8节《MonkeyRunner源代码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树
在上几节的描写叙述中,我们把HierarchyViewer初始化好.也把ViewServer给装备好了.那如今距离获得一个控件去操作它是万事具备仅仅欠东风了,欠了那一股春风了?欠了的是建立控件树这个东 ...
- UiAutomator源代码分析之获取控件信息
依据上一篇文章<UiAutomator源代码分析之注入事件>開始时提到的计划,这一篇文章我们要分析的是第二点: 怎样获取控件信息 我们在測试脚本中初始化一个UiObject的时候一般是像下 ...
- UiAutomator源码分析之获取控件信息
根据上一篇文章<UiAutomator源码分析之注入事件>开始时提到的计划,这一篇文章我们要分析的是第二点: 如何获取控件信息 我们在测试脚本中初始化一个UiObject的时候通常是像以下 ...
- asp.net js获取控件ID
ClientID是由ASP.Net生成的服务器控件得客户端标识符,当这个控件生成到客户端页面的时候,在客户端代码访问该控件时就需要通过ClientID来访问. 以文本框为例: 一.未使用母版页 js可 ...
随机推荐
- Ubuntu小私房(4)--Linux系统目录结构
Linux目录结构是Linux学习者必须了解的知识,Linux的目录与Windows又有很大的不同,所以搞清楚Linux目录结构是关键. Linux文件类型 (部分转自ChinaBytel) linu ...
- JavaScript中的类式继承和原型式继承
最近在看<JavaScript设计模式>这本书,虽然内容比较晦涩,但是细品才发现此书内容的强大.刚看完第四章--继承,来做下笔记. 书中介绍了三种继承方式,类式继承.原型式继承和掺元类继承 ...
- DedeCMS标签 PHP判断语句写法
缩略图标签的判断写法,如果有图片就显示,没图片就显示别的. {dede:field name=litpic runphp='yes'} if(!empty(@me)) { @me="< ...
- Python自动化运维之5、内置函数
python3.x内置函数 官网详解 一些例子:后期慢慢接触到再补充 # help() 详细查看某个类有那些方法或者方法的具体使用 >>> help(str) >>> ...
- 线性表链式存储方式的C语言实现
/* 编译器:Dev-c++ 5.1.0 文件名:linkList3.cpp 代码版本号:1.0 时间:2015年9月24日11:34:16 */ #include <stdio.h> # ...
- Linux_cloudera-scm-agent: unrecognized service
- opencv中Mat类型数据操作与遍历
Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是 ...
- spark Association failed with [akka.tcp:sparkMaster@ip:7077]
今搭建spark集群, conf/spark-env.sh 配制如下 export SPARK_MASTER_IP=masterexport SPARK_MASTER_PORT=7077export ...
- BZOJ 4407 于神之怒加强版
http://www.lydsy.com/JudgeOnline/problem.php?id=4407 题意: 给下N,M,K.求 思路: 来自:http://blog.csdn.net/ws_y ...
- 为什么设计模式在C++社区没有Java社区流行?
我们发现设计模式在Java社区很流行,但是在C++社区却没有那么被关注,甚至有点被排斥,究竟是什么原因造成这个差异的呢? 昨天和同事讨论这个问题,最后得出几点原因: (1)C++内存需要 ...