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中不需要转义。