android 获取元素的下标_Android自动化测试20--Appium控件定位

本文详细介绍了在Android自动化测试中如何使用Appium进行控件定位,包括使用UiAutomatorViewer和Appium Inspector工具,以及XPath的定位方法。通过理解元素定位Api和辅助工具,能更精确地进行自动化测试。
摘要由CSDN通过智能技术生成

Android自动化测试20

转帖请注明出处!谢谢~

Appium控件定位

本章重点

自动化测试的关键是要准确的操作测试对象,所以就需要对被测系统的页面元素做精确的定位,本章重点学习Appium的元素定位方法以及定位Api的使用,通过案例详细介绍各个元素定位Api的用法。

学习目标掌握UiAutomatorView使用

定位元素Api的用法和区别

辅助定位控件工具

在自动化脚本开发前,熟悉待测应用的UI组件(包括视图和控件)是很有帮助的。

UiAutomatorViewer

UiAutomator Viewer是一个图形界面工具来扫描和分析应用的UI控件。可以扫描和分析Android 设备上当前显示的 UI 组件。使用此工具可以检查布局层次结构,并查看在设备前台显示的 UI 组件属性。UiAutomator Viewer工具位于 /tools/ 目录中。

UiAutomator使用:在物理设备上启动所需的应用程序。

将物理设备连接到开发机器。

打开终端窗口并切换到/tools/目录。

执行命令: uiautomatorviewer。

UiAutomatorViewer界面出现后,点击“Device Screenshot”按钮。

将光标移动到所需的对象,点击选择的对象。

查看应用的UI属性:在快照的左侧面板上,可以看到uiautomatorviewer显示的UI组件;在右侧下边是组件的属性,上边是布局的层次。

Appium inspector

Inspector通过截图查看元素对应节点,进而直观地获取到合适的元素定位信息。Inspector 依靠 driver 的page_source() 和 get_ScreenShot_as_file() 的方法获取截图及节点树,因此它使用前提是已经建立了session 。

建立 session 有两种方法:

1、脚本中用合适的 caps 创建WebDriver 实例。

2、在启动 appium server 时加入建立 session 所需参数及pre-launch。

Step1:点击左上角的安卓设置按钮;

Step2:点选Package、Launch Activity、Device Name三项:

Package和Launch Activity默认没有选择,Appium Launch模拟器后会自动安裝apk。

Device Name选上即可,只要launch时,保证测试设备与电脑连接正常。

Step3:进入设置选项,勾选上Pre-Launch Application和Override Existing Session两项;

Step4:再次确保测试机连接上了电脑,并打开了调试模式!运行Appium后点击放大镜按钮打开inspector界面;如果一开始无法显示手机界面,点击Refresh按钮。refresh可以刷新成当前模拟器的页面(如果当前没有开开任何的安卓模拟器,点击refresh时,它会根据Android settings中的launch device打开一个模拟器)。

inspector界面要由两部分组成。左侧是当前屏幕的节点树,右侧是当前屏幕的截图,对象属性在右侧截图下方details方框中。

用Appium Inspector在真机上运行并定位元素的时候,不管有没有安装这个App,它都会给你重新安装一下,然后再打开。不过运行测试用例的时候,如果有安装,则直接打开,没有安装时才会安装。这个工具支持iOS、android设备都支持,启动的两种方式,只能获取原生应用的页面元素。

对于hybrid应用的个别webView页面的元素无法获取。可以通过chrome inspector,它是chrome的一个插件,它的主要功能就是获取到web页面的元素信息,

控件定位知识XPath

XPath 是一门在XML文档中查找信息的语言,它是一种表达式语言,它的返回值可能是节点,节点集合,原子值,以及节点和原子值的混合等。XPath 可用来在 XML 文档中对元素和属性进行遍历。同时XPath是用于在网页上识别元素的技术,它就像HTML元素的地址。在XPath 有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。基本值(或称原子值,Atomic value)是无父或无子的节点。项目(Item)是基本值或者节点。xpath的作用就是两个字“定位”,运用各种方法进行快速准确的定位。

以一个XML文件为例,来看看XPath如何定位元素:

针对上面的XML文档应用XPath定位节点:

选取root:/root 或者root

选取根节点下的所有child元素://child

选取属性是attr的节点://@attr基本概念

节点(Node)

根节点(Root Node)

根节点是一棵树的最上层,根节点是唯一的。树上其它所有元素节点都是它的子节点或后代节点。对根节点的处理机制与其它节点相同。在XSLT中对树的匹配总是先从根节点开始。元素节点(Element Nodes)

元素节点对应于文档中的每一个元素,一个元素节点的子节点可以是元素节点、注释节点、处理指令节点和文本节点。可以为元素节点定义一个唯一的标识id。元素节点都可以有扩展名,它是由两部分组成的:一部分是命名空间URI,另一部分是本地的命名。文本节点(Text Nodes)

文本节点包含了一组字符数据,即CDATA中包含的字符。任何一个文本节点都不会有紧邻的兄弟文本节点,而且文本节点没有扩展名。属性节点(Attribute Nodes)

每 一个元素节点有一个相关联的属性节点集合,元素是每个属性节点的父节点,但属性节点却不是其父元素的子节点。这就是说,通过查找元素的子节点可以匹配出元 素的属性节点,但反过来不成立,只是单向的。再有,元素的属性节点没有共享性,也就是说不同的元素节点不共有同一个属性节点。

对缺省属性的处理等同于定义了的属性。如果一个属性是在DTD声明的,但声明为 #IMPLIED,而该属性没有在元素中定义,则该元素的属性节点集中不包含该属性。

此外,与属性相对应的属性节点都没有命名空间的声明。命名空间属性对应着另一种类型的节点。命名空间节点(Namespace Nodes)

每一个元素节点都有一个相关的命名空间节点集。在XML文档中,命名空间是通过保留属性声明的,因此,在XPath中,该类节点与属性节点极为相似,它们与父元素之间的关系是单向的,并且不具有共享性。处理指令节点(Processing Instruction Nodes)

处理指令节点对应于XML文档中的每一条处理指令。它也有扩展名,扩展名的本地命名指向处理对象,而命名空间部分为空。注释节点(Comment Nodes)

注释节点对应于文档中的注释。基本值(或称原子值,Atomic value)

XPath基本值是无父或无子的节点,类似XML中的文本节点。节点关系

父(Parent):每个元素以及属性都有一个父。

子(Children):元素节点可有零个、一个或多个子。

同胞(Sibling):拥有相同的父的节点。

先辈(Ancestor):某节点的父、父的父等。

后代(Descendant):某个节点的子,子的子等。

XPath语法

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

XPath路径表达式,语法:路径 = 相对路径 | 绝对路径

XPath路径表达式 = 步进表达式 | 相对路径 "/"步进表达式。

步进表达式=轴::节点测试谓词

说明:相对路径:"/"处在XPath表达式开头则表示文档根元素,(表达式中间作为分隔符用以分割每一个步进表达式),语法是"/nodename/childnodename" 在路径字串前加了一个'/',表示字串从根开始,也就是nodename必须是表示根节点,才能找到childnodename。表明是从文档根开始查找节点。

绝对路径:是除了绝对路径以外的其他写法,语法是"nodename/childnodename",该路径在当前节点下查找到符合nodename的节点,再寻找nodename的子节点childnodename。路径的开始位置是 当前节点 。也就是不使用"/"起首。表明从当前节点开始查找。 是否“/“开始定位节点,涉及到当前XPath路径表达式处在什么位置上执行表达式.

这涉及到表达式上下文的概念:

表达式上下文(Context):上下文表示一种环境,是XPath路径表达式计算的前提。在某结点下的XPath表达式的计算结果——结点列表构成上下文,该结点称为上下文结点(Context node)

例如:

XPath上下文基本有以下几种:当前节点(./):如./班级,表示将找到当前上下文中名为班级的所有元素

父节点(../):如../学生名单表示选择当前节点的父节点下的学生名单节点集合

根元素(/):如/学生名单,表示选择从文档根节点下的学生名单节点集合.

根节点(/*):这里的*是代表所有节点,但是根元素只有一个,所以这里表示根节点。/*的返回结果和/学生名单返回的结果一样。

递归下降(//):如//学生,将在文档树的任何地方找到所有名为学生的元素,不管深度或层次结构

特定元素:如班级,表示选择当前节点下的班级节点集合,等同于(./班级)谓词(筛选表达式)及轴的概念:其中轴表示步进表达式选择的节点和当前上下文节点间的树状关系(层次关系)

节点测试指定步进表达式选择的节点名称扩展名。

谓词即相当于过滤表达式以进一步过滤细化节点集,是在轴和结点测试基础上的进一步筛选,类似于SQL的where子句。谓词可以是0个或多个。多个多个谓词用逻辑操作符and,or连接。取逻辑非用not()函数。请看一个典型的XPath查询表达式:/messages/message//child::node()[@id=0],其中/messages/message是路径(绝对路径以"/"开始),child::是轴表示在子节点下选择,node()是节点测试表示选择所有的节点。[@id=0]是谓词,表示选择所有有属性id并且值为0的节点。下面列举常见Xpath中的轴:

轴名称

描述

ancestor::

上下文节点的上级。

上下文节点的上级由上下文节点的父级以及父级的父级等组成;因此,ancestor:: 轴总是包括根节点,除非上下文节点就是根节点。

ancestor-or-self::

上下文节点及其上级。

ancestor-or-self::轴总是包括根节点。

attribute::简写:@

上下文节点的属性。

除非上下文节点为元素,否则,此轴将是空的。

child::

上下文节点的子级。

子级是树中上下文节点以下紧邻的任何节点。 但是,属性节点或命名空间节点均不属于上下文节点的子级。

descendant::

上下文节点的子代。

子代是子级或子级的子级,等等;因此,descendant::轴永远不会包含属性节点或命名空间节点。

descendant-or-self::

上下文节点及其子代。

following::

树中在上下文节点之后的所有节点,除了子代、属性节点和命名空间节点之外。

following-sibling::

上下文节点的所有后续同辈。

following-sibling::轴只标识出现在树中上下文节点之后的父节点子级。 该轴不包括所有出现在上下文节点之前的其他子级。 如果上下文节点是属性节点或命名空间节点,following-sibling::轴是空的。

namespace::

上下文节点的命名空间节点。

每个处于上下文节点范围内的命名空间都有一个命名空间节点。 除非上下文节点为元素,否则,此轴将是空的。

parent::

上下文节点的父级(如果有)。

父级是树中上下文节点以上紧邻的节点。

preceding::

树中在上下文节点之前的所有节点,除了上级、属性节点和命名空间节点之外。 有一种方法是,将 preceding 轴看作是内容全部出现在上下文节点开始之前的所有节点。

preceding-sibling::

上下文节点的所有前接同辈。

preceding-sibling::轴只标识出现在树中上下文节点之前的父节点子级。 该轴不包括所有出现在上下文节点之后的其他子级。 如果上下文节点是属性节点或命名空间节点,preceding-sibling::轴是空的。

self::

只是上下文节点本身。运算符及特殊字符:

运算符/特殊字符

说明

/

此路径运算符出现在模式开头时,表示应从根节点选择。

//

从当前节点开始递归下降,此路径运算符出现在模式开头时,表示应从根节点递归下降。

.

当前上下文。

..

当前上下文节点父级。

*

通配符;选择所有元素节点与元素名无关。(不包括文本,注释,指令等节点,如果也要包含这些节点请用node()函数)

@

属性名的前缀。

@*

选择所有属性,与名称无关。

:

命名空间分隔符;将命名空间前缀与元素名或属性名分隔。

( )

括号运算符(优先级最高),强制运算优先级。

[ ]

应用筛选模式(即谓词,包括"过滤表达式"和"轴(向前/向后)")。

[ ]

下标运算符;用于在集合中编制索引。

|

两个节点集合的联合,如://messages/message/to | //messages/message/cc

-

减法。

div,

浮点除法。

and, or

逻辑运算。

mod

求余。

not()

逻辑非

=

等于

!=

不等于

特殊比较运算符

< 或者 <

<= 或者 <=

> 或者 >

>= 或者 >=

需要转义的时候必须使用转义的形式,如在XSLT中,而在XMLDOM的scripting中不需要转义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值