一、元素定位工具WEditor的介绍
引用自:web-editor/README_ZH.md at master · alibaba/web-editor (github.com)
编辑器能够提供辅助编写脚本,查看组件信息,调试代码等功能。
相关文档:
web-editor/README_ZH.md at master · alibaba/web-editor (github.com)
web-editor/DEVELOP.md at master · alibaba/web-editor (github.com
二、界面布局
在weditor启动成功后,会自动打开浏览器进入如下图页面(这里连接的是MuMu模拟器)
网页的基本布局分为Screen、Properties和Tree。Screen标签用于实时显示连接设备的屏幕,Properties标签的主要作用是罗列元素的的属性,Tree标签是代码功能区、元素结构区(Hierarchy)和输出区(Console)的集合。
首次进入,优先选择Android系统,输入连接地址,最后点击Connect按钮。
需要adb成功连接目标设备,WEditor才会显示设备屏幕,以下是一些常用的adb命令:
1)常用命令
adb devices #查看连接设备
adb -s cf27456f shell # 指定连接设备使用命令
adb install test.apk # 安装应用
adb install -r demo.apk #安装apk 到sd 卡:
adb uninstall cn.com.test.mobile #卸载应用,需要指定包
adb uninstall -k cn.com.test.mobile #卸载app 但保留数据和缓存文件
adb shell pm list packages #列出手机装的所有app 的包名
adb shell pm list packages -3 #列出除了系统应用的第三方应用包名
adb shell pm clear cn.com.test.mobile #清除应用数据与缓存
adb shell am start -ncn.com.test.mobile/.ui.SplashActivity #启动应用
adb shell dumpsys package #包信息Package Information
adb shell dumpsys meminfo #内存使用情况Memory Usage
adb shell am force-stop cn.com.test.mobile #强制停止应用
adb logcat #查看日志
adb logcat -c #清除log 缓存
adb reboot #重启
adb get-serialno #获取序列号
adb shell getprop ro.build.version.release #查看Android 系统版本
adb shell top -s 10 #查看占用内存前10 的app
adb push <local> <remote> #从本地复制文件到设备
adb pull <remote> <local> #从设备复制文件到本地
adb bugreport #查看bug 报告
adb help #查看ADB 帮助
2)连接设备
adb连接指定设备:adb [-d|-e|-s <serialNumber>] <command>
参数:
-d 指定当前唯一通过USB 连接的Android 设备为命令目标
-e 指定当前唯一运行的模拟器为命令目标
-s <serialNumber> 指定相应serialNumber 号的设备/模拟器为命令目标
command 为所需对设备执行的命令
3)启动停止服务
adb start-server #启动adb 服务,基本不会用到,因为只要设备连接正确,会自动启动adb server
adb kill-server #停止adb server
adb -P <port> start-server #指定adb server 的网络端口port (默认为5037)启动服务
3)查看版本设备
adb version #查看adb 版本信息
adb devices #查看adb 连接设备
adb shell getprop ro.product.model #查看设备型号
adb get-serialno #获取设备序列号
adb bugreport #查看bug 报告
adb logcat #查看日志
adb shell wm size #查看屏幕分辨率
adb shell wm density #查看屏幕密度
三、元素定位的使用
UI测试自动化的本质是界面元素的定位,通过使用WEditor可以对UI中的元素快速定位。
对UI中的文字进行检验时,笔者在这里提出一种解决思路,需要有一定的代码能力。首先需要Android的XML布局格式和控件有一定的了解,比如控件名称。在对界面的基本布局有一定的了解后,根据操作进入需要检查文字的界面,这里可以记录下Coding,可以用于自动化代码的编写。对界面截图保存到本地,使用文字识别进行匹配判别需求和实现是否保持一致。(文字的排版可能会影响识别结果,这里需要对算法有一些基本认识,参数的更改会影响部分算法的输出结果)
这里以“海豚股票”APP为例,只为举例方便,无任何商业行为!
启动WEditor,成功连接设备后,会自动打开浏览器,如下图所示:
3.1 元素定位
ui2中支持Android中UiSelector类中所有的定位方式,详情见谷歌官网
名称 | 描述 |
text | text是指定文本的元素 |
textContains | text中包含有指定文本的元素 |
textMatches | text符合指定正则的元素 |
textStartsWith | text以指定文本开头的元素 |
className | className是指定类名的元素 |
classNameMatches | className类名符合指定正则的元素 |
description | description是指定文本的元素 |
descriptionContains | description中包含有指定文本的元素 |
descriptionMatches | description符合指定正则的元素 |
descriptionStartsWith | description以指定文本开头的元素 |
checkable | 可检查的元素,参数为True,False |
checked | 已选中的元素,通常用于复选框,参数为True,False |
clickable | 可点击的元素,参数为True,False |
longClickable | 可长按的元素,参数为True,False |
scrollable | 可滚动的元素,参数为True,False |
enabled | 已激活的元素,参数为True,False |
focusable | 可聚焦的元素,参数为True,False |
focused | 获得了焦点的元素,参数为True,False |
selected | 当前选中的元素,参数为True,False |
packageName | packageName为指定包名的元素 |
packageNameMatches | packageName为符合正则的元素 |
resourceId | resourceId为指定内容的元素 |
resourceIdMatches | resourceId为符合指定正则的元素 |
3.2 设备交互
注:因为工具是python代码开发的,这里使用的示例代码都是python
启动海豚APP->行情->更多->沪深京A股,对所有的单股进行遍历截图。截图包括单股详情一张,十字光标移动K线图两张,并对截图前置股票代码命名文件。
# coding: utf-8 # import uiautomator2 as u2 import re import time import os d = u2.connect() #竖屏截图 def screenshotVertical(stockCode,stockName): savePath = "d:\\screenshot" PathExist(savePath) #展开单股详情信息 d.xpath('//*[@resource-id="com.ss.android.caijing.stock:id/root"]/android.widget.LinearLayout[1]').click() d.screenshot('%s\\%s-%s.png'%(savePath,stockCode,stockName)) #收回单股详情信息 d.xpath('//*[@resource-id="com.ss.android.caijing.stock:id/root"]/android.widget.LinearLayout[1]').click() d.touch.down(100, 1000) # 模拟按下 time.sleep(1.5) d.touch.move(200, 1000) # 模拟移动 d.screenshot('%s\\%s-%s-move200-竖屏.png'%(savePath,stockCode,stockName)) #time.sleep(0.1) d.touch.move(300, 1000) # 模拟移动 d.screenshot('%s\\%s-%s-move300-竖屏.png'%(savePath,stockCode,stockName)) #time.sleep(0.1) d.touch.move(400, 1000) # 模拟移动 d.touch.up(400,1000) # 模拟抬起 def PathExist(path): if os.path.isdir(path): pass else: os.makedirs(path) #启动海豚app d.app_start("com.ss.android.caijing.stock") #点击行情 d.xpath('//*[@resource-id="com.ss.android.caijing.stock:id/tabLayoutLl"]/android.widget.LinearLayout[3]').click() #点击更多 d.xpath('//*[@resource-id="com.ss.android.caijing.stock:id/pageContainer"]/android.widget.LinearLayout[1]/android.widget.LinearLayout[2]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/androidx.recyclerview.widget.RecyclerView[1]/android.widget.FrameLayout[6]').click() #单击沪深京A股 #也可以使用d(text='沪深京A股').click() d(resourceId="com.ss.android.caijing.stock:id/mainText", text="沪深京A股").click() #点击第一个股票,不使用text定位,可能会找不到元素,改用xpath定位 d.xpath('//*[@resource-id="com.ss.android.caijing.stock:id/recycler_content_list"]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]').click() d.xpath('//*[@resource-id="com.ss.android.caijing.stock:id/root"]/android.widget.LinearLayout[1]').click() while True: #点击日K d(resourceId="com.ss.android.caijing.stock:id/dayKlineTab").click() #获取股票名称 stockName = d.xpath('//*[@resource-id="com.ss.android.caijing.stock:id/stockName"]').get_text() stockName = re.sub('[\/:*?"<>|]','-',stockName)#去掉非法字符 stockCode = d.xpath('//*[@resource-id="com.ss.android.caijing.stock:id/stockCode"]').get_text() #截图函数 screenshotVertical(stockCode,stockName) #如果没有下一个,退出当前循环 if str(d(resourceId="com.ss.android.caijing.stock:id/nextStockIv").click_exists()) == 'False' : break else : #点击下一个 d(resourceId="com.ss.android.caijing.stock:id/nextStockIv").click #退出单股详情 d(resourceId="com.ss.android.caijing.stock:id/ivBack").click() #退出沪深京A股股票列表 d(resourceId="com.ss.android.caijing.stock:id/back").click()