如何开发sptt工程的原子操作

回顾

原子操作须有客户端开发人员提供。之所以这样是由于只有客户端开发人员可以方便的、可控的修改应用的源码,用于更为快捷的UI元素的定位。

关于原子操作的详细介绍,请查看

sptt规范之atom操作一节

关于示例,请看

移动端测试方案--sptt

工具之app-inspector

app-inspector是测试工具macaca提供的基于浏览器的审查元素工具,它基于node运行,并在浏览器渲染,因此app-inspector最大的好处就是兼容性,它可以运行在主流的拥有图形化界面的操作系统上,因此不论你的macbook的xcode版本是多少都可以使用app-inspector.

app-inspector会根据当前视图构建出一颗DOM树,每个DOM节点采用xml的标签表示,因此采用xpath定位元素是最方便的,但是性能确是最差。

安装app-inspector

上节提供的app-inspector官方文档其实也介绍了安装方法,这里简要说明:

1,首先确保系统安装nodejs环境
2,npm install macaca-cli -g
3,macaca doctor(环境检查)
4,npm install app-inspector -g(安装app-inspector)

前三步用于确保app-inspector的运行环境,第四步安装app-inspector命令

运行app-inspector

命令行执行:

app-inspector -u deviceID  

因此需要提供设备号。

iOS下获取设备号

1,xcrun simctl list,这行命令会列出你的所以模拟器信息,里面有类似 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 的代码,就是模拟器 UDID。

2, 从xcode获取。打开模拟器,从菜单中打开 Hardware - devices - manage devices。 然后你会看到模拟器信息界面,里面有个 identifier,就是 UDID。

android下获取设备号 命令行中执行adb devices,输出

List of devices attached  
0123456789ABCDEF           device  

其中“0123456789ABCDEF”即为设备ID。

使用app-inspector开发atom

android篇

首先按照上节的介绍,连接实体机,运行app-inspector。工具会默认打开浏览器的页面,显示当前视图的结构(需要注意的是页面不会自动刷新,每次在手机中滑动或者切换视图都必须手动刷新浏览器的页面): 1 可以看到图片左侧是对应实体机的视图界面,中间栏是DOM结构,右侧则是每个DOM元素的相关属性。通过点击中间栏的DOM结构可以定位目的UI元素,查找属性实现定位。

sptt提供了“id定位、name定位、className定位、xpath定位和accessibilityId定位”,其中适用于android的则有id定位、className定位和xpath定位三种方式,不过app-inspector只能在android下提供className和xpath信息,因此只能使用这两种方式定位。

xpath定位

通过查看每个元素的属性,可发现所有元素都有xpath属性,因此可以通过sptt提供的xpath方式定位元素(但是前文中多次说了采用xpath定位性能相对较差,因此在可以使用其他定位方式的情况下尽量不要使用xpath)。根据上图,如果要定位“进入我的店铺”按钮,并点击进入店铺,使用xpath方式可以:

go to my shop 1:  
  ui_xpath: 
//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.ScrollView[1]/android.widget.LinearLayout[1]/android.widget.Button[6]
  ui_action: click

再次强调,在可以通过其他定位方式定位的情况下,不要使用xpath方式定位

className定位

className方式定位相对比较繁琐,而且在UI视图发生变动的情况下有可能出现元素查找失败。通过className定位,首先会将当前视图中的所有相同的className的元素聚合为一个数组,再根据待定位元素的在视图中的索引值获取该元素。因此,我们不仅需要提供对应的className,还需要提供待定位元素在所有相同className数组中的索引。

2 上图展开了所有的DOM元素,可以看到我们查找的className为“android.widget.Button”,索引值为7(数组项从0开始):

ui_className: android.widget.Button|7  
ui_action: click  

采用className方式定位严格依赖于布局元素的排列顺序,因此不利于可维护和扩展。

iOS篇

同样,按照上节的介绍,运行模拟器,找到对应模拟器的UID,运行app-inspector。

app-inspector -u E226CF84-CBF4-490C-A17F-6D384D47DF7A --verbose  

命令后面加入“--verbose”可以实时看到命令交互,用于调试。

3 刷新页面,会显示当前模拟器中的视图,如上图所示。

iOS下,元素定位方式可以使用“id定位、name定位、className定位、xpath定位和accessibilityId定位”这五种,也就是说sptt提供的所有方式都可以使用。

xpath定位

针对“测试入口”按钮,采用xpath定位,很简单直接拷贝右侧的xpath属性即可(但是前文中多次说了采用xpath定位性能相对较差,因此在可以使用其他定位方式的情况下尽量不要使用xpath)。

the entrance of test 1:  
  ui_xpath: 
 //XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeButton[1]
  ui_action: click

id定位

3 在右侧元素属性栏中并没有id属性,不过id等同于label属性,因此可以通过label的值定位。

ui_id: 测试入口  
ui_action: click  

采用id定位速度快,而且只要确保id的唯一性,不管视图布局如何改变都不会影响定位,在确保唯一性的前提下最优先使用。

name定位

可以看到name属性和label属性的值相同,使用类似的方法也可以定位元素:

ui_name: 测试入口  
ui_action: click  

优先使用id和name方式定位。

className定位

3 类似于android的className定位,仍需要提供class和索引值。

ui_className: Button|0  
ui_action: click  

缺点是扩展性差,依赖于视图元素的布局。

accessibilityId定位

iOS的某些元素可能无法设置对应的name和id属性,但是Objective-C的UI对象默认都会有一个accessibilityIdentify属性,可以为对象的该属性赋一个唯一的值(类似于id)用于定位。这样做的意义在于“性能优化,有很多情况下被定位元素没有id、name属性,为了快速找到它就可以在源码中添加accessibilityIdentify而不影响布局”,从而实现类似id和name定位的效果。
4 待定位元素为导航栏的右侧“home”图标,右侧属性栏中rawIdentifier为“回到首页”,采用该属性定位即为accessibilityIdentify定位:

ui_accessibilityIdentify: 回到首页  
ui_action: click  

以上,即为android和iOS下定位元素的基本原理。

工具之appium-ui(不建议使用)

目前appium@1.5.3提供了ui监视工具,但是最新的appium@1.6.3取消了该工具。我们可以在mac下首先安装appium@1.5.3的dmg包,再通过npm安装appium@1.6.3,使用ui监视工具。

采用官方提供的ui工具只能在mac上开发android的atom,原因是appium@1.5.3不兼容xcode8以上的版本

步骤:

1,命令行运行appium命令
2,设置好android的appPackage, appActivity,deviceName,app等属性
3,运行inspect

appium-ui只作为另一种备选方案,兼容性较差,不推荐使用。

欲休

继续阅读此作者的更多文章

海创园尚妆