如文章《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",感觉是越界了的样子。

2.4 xpath使用方法官方手冊

至于其它非主流获的通过xpath取控件的方式。请參考xpath官方手冊中文版:http://wenku.baidu.com/link?url=tLdn9X4ucgmzYyKj4dpsgSDbshXEw6W8BTyqQAXd0kTMY6lBQqLiIL9FHtcZmdIeO8o5ZKV-fzlw96mFgvmWZ-qz35EPObyv8hKLTuyxbv3



 

作者

自主博客

微信

CSDN

天地会珠海分舵

http://techgogogo.com

服务号: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获取控件实例随笔的更多相关文章

  1. 【转】Appium根据xpath获取控件实例随笔

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39754233 如文章<Appium基于安卓的各种FindElement的控件定位方法 ...

  2. Appium根据xpath获取控件实例随笔

    如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.其中一种就是根据控件所在页面的XPATH来定位控件. 本文就是尝试通过 ...

  3. Appium根据xpath获取控件

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

  4. wpf datagrid 如何自定义行的控件实例,(textbox 并选中则全选)

    主要是为了用户输入方便 按回车,选中下一列,text自动获取焦点,输入状态 获取控件实例  https://blog.csdn.net/m15188153014/article/details/486 ...

  5. Appium+python自动化(二十五)- 那些让人抓耳挠腮、揪头发和掉头发的事 - 获取控件ID(超详解)

    简介 在前边的第二十二篇文章里,已经分享了通过获取控件的坐标点来获取点击事件的所需要的点击位置,那么还有没有其他方法来获取控件点击事件所需要的点击位置呢?答案是:Yes!因为在不同的大小屏幕的手机上获 ...

  6. 第14章8节《MonkeyRunner源代码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树

    在上几节的描写叙述中,我们把HierarchyViewer初始化好.也把ViewServer给装备好了.那如今距离获得一个控件去操作它是万事具备仅仅欠东风了,欠了那一股春风了?欠了的是建立控件树这个东 ...

  7. UiAutomator源代码分析之获取控件信息

    依据上一篇文章<UiAutomator源代码分析之注入事件>開始时提到的计划,这一篇文章我们要分析的是第二点: 怎样获取控件信息 我们在測试脚本中初始化一个UiObject的时候一般是像下 ...

  8. UiAutomator源码分析之获取控件信息

    根据上一篇文章<UiAutomator源码分析之注入事件>开始时提到的计划,这一篇文章我们要分析的是第二点: 如何获取控件信息 我们在测试脚本中初始化一个UiObject的时候通常是像以下 ...

  9. asp.net js获取控件ID

    ClientID是由ASP.Net生成的服务器控件得客户端标识符,当这个控件生成到客户端页面的时候,在客户端代码访问该控件时就需要通过ClientID来访问. 以文本框为例: 一.未使用母版页 js可 ...

随机推荐

  1. css动画+滚动的+飞舞的小球

    源代码如下: <!DOCTYPE html><html><head> <title>xi</title> <meta charset= ...

  2. vs2012加载EntityFrameWork框架,连接Oracel

    近日公司用到.net MVC框架做接口,需连接到Oracel数据库,从网上查阅了一些资料,当然,从咱们博客园获益匪浅.然后结合自己所做,把使用过程中遇到的一些问题,及如何解决的整理如下,方便查阅,也有 ...

  3. Linux误删C基本运行库libc.so.6急救方法

    首先普及一下关于libc.so.6的基本常识: libc.so.6是glibc的软链接 ll  /lib64/libc.so.6lrwxrwxrwx 1 root root 11 Aug 27 201 ...

  4. 25 读取jar包内log4j.properties文件方法

    //读取log4j日志配置文件 InputStream inputStream=ApplicationExecutor.class.getResourceAsStream("/log4j_h ...

  5. mongo学习整理

    mongo做为NOSQL家族中一员,被广泛使用以及应用到生产环境中,有其出色的性能.关系型数据库(RDBMS )在互联网中依然是不可替代的一部分,mongo基于NOSQL的特性,在程序中RDBMS不适 ...

  6. 3.3.2 嵌入汇编(摘自<linux内核完全剖析>)

    内核C语言程序嵌入式汇编代码又叫内联汇编,具有输入和输出参数的嵌入汇编语句的基本格式为: ************************************************** asm( ...

  7. smarty 练习: 分页查询

    对查出的数据进行分页,并添加查询 在main.php和main.html两个页面操作: 后台:main.php <?php include("../init.inc.php" ...

  8. PreparedStatement執行sql語句

    import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import org ...

  9. IOS编程教程(八):在你的应用程序添加启动画面

    IOS编程教程(八):在你的应用程序添加启动画面   虽然你可能认为你需要编写闪屏的代码,苹果已经可以非常轻松地把它做在Xcode中.不需要任何编码.你只需要做的是设置一些配置. 什么是闪屏 对于那些 ...

  10. Linux准备——安装Ubuntu系统

    今天对于我这个试图向安装Linux方向走的童鞋来说是个值得纪念的日子——我成功的安装上了Ubuntu操作系统. 整个的过程并不复杂,主要是看了网上Linux社区的一个安装教程.开始,我还在XP下安装, ...