Appium 基于 uiautomatorviewer 自动生成代码 (兼容 android 和 iOS)

hello · July 02, 2018 · Last by chen987123 replied at May 08, 2020 · 5276 hits
本帖已被设为精华帖!

缘起

公司部门调整 PC 部门和无线部门合并,原本负责主站 PC 端自动化的同事需要马上上手安卓,IOS 自动化。对于初次接触移动端的测试者来说,跨度还是有点大的。加之人员有些变动,不得不搞个工具降低学习成本,马上产出。公司 app 页面上有动态加载的元素,每次用 Appium 自带的工具抓取 Xpath 时,总是报错。为了降低自动化同学的学习成本和解决无法的问题,就对 uiautomatorviewer 二次开发。
二次开发 uiautomatorviewer 优化定位符生成自动化代码实践总结分享
和原生的 SDK 自带的 uiautomatorviewer 优点:

  • 优化截图速度,修复动态元素加载页面截图报错的问题
  • 优化 Xpath 提取规则,截取相对短的 Xpath
  • 支持截取动态加载的页面
  • 自动生成代码
  • 支持 U2 的 xpath 在改造上述工具分享帖子中,有幸得到@carl 老师的神点拨:“这个还可以兼容 ios 录制呢,好好玩😃 ”,于是就想继续对此进行再次开发,以支持 IOS,顺便也偷点懒,生成一下 IOS 自动化中机械重复的代码(driver.findElement("//xxx.xxxxx").click())。不管是不是重复造轮子,对一个刚接触初次接触安卓,和 IOS 自动化的自己来说也是一次难得的学习机会。 不足之处希望各位老师见谅。 新工具特点:
  • 不需要设置 inspector 里面的各种参数,不需要启动 appium
  • 重要的一点,不需要换定位工具,安卓那边用 uiautomatorviewer ,IOS 这边用 inspector
  • 自动生成代码,我喜欢的懒方式,机械的事情,我只想 Ctrl+C ,Ctrl+V

原理

appium 自带工具安卓端和 ios 原理都是相同的。截图 +Pagesource 的 xml 去根据坐标高亮选中元素。

  • 安卓:安卓定位基于【右上坐标】【左下坐标】两点定位元素布局
  • IOS:IOS 定位基于【右上坐标】【高度,宽度】由定位点横轴长,纵轴长去定位元素布局 其他相差无几,搞清楚这两点我们就好着手改造
  • 获取 PageSource 的 xml 参考 WebDriverAgent 的 wiki 把节点名称都换成 node(XCUIElementXXXX--->node)因为以 uiautomatorviewer 为基础,所以只能 Xml 以安卓端的为参照
  • 获取截图并压缩,不同的 IOS 机型截图像素是不同的,而且换算起来很麻烦,所以我选择压缩,压缩后也不用担心控件坐标与截图对应关系
  • 生成 xpath,基于安卓的原理稍加改造即可。 以上参考 WebDriverAgent 的 wiki 和@carl 老师的帖子传送门

使用

  • 安卓端:jar 放在【\android-sdk-windows\tools\lib】下(请先备份您自带的),启动方式猛击【\android-sdk-windows\tools\uiautomatorviewer.bat】
  • IOS 位置任意位置:shell 终端执行: java -XstartOnFirstThread -jar uiautomatorviewer.jar -XstartOnFirstThread(ios 使用时,请先确保你用 appium 的 inspector 是可以抓取元素的)

具体使用方式请参照 Git 上详细使用说明,这里不赘述了。请务必先看完 Git 上的 readme 有疑问再问问题

效果

  • 安卓端:
  • IOS 端:

实践并总结一下各路大神的无私分享,谢谢各位授之于渔,如有雷同实属参照,改造工具没别的,跟着好的思路分享,就是干!非常感谢,期待大神们分享更多更好的工具思路。
jar 包放到 Git 上了jar 包和具体使用说明
刚完成雏形,还很多要完善的地方,刚玩自动化的人伤不起啊,下班了。

再次感谢@carl 老师的神点拨 和社区的各个老师给予的帮助!

后期打算支持生成 Python 的代码,感觉现在社区 py 很多,欢迎大家不吝赐教我继续改进!觉得 OK 的 git star 一下。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 104 条回复 时间 点赞
思寒_seveniruby 将本帖设为了精华贴 02 Jul 22:37

真机可以用了吗?

hello #3 · July 03, 2018 Author
何畅 回复

我用的就是真机

刚试了下,华为的手机是可以的,苹果需要启动 appium 的 inspector 后才能抓

hello #5 · July 03, 2018 Author
对酒当歌 回复

苹果手机不起 appium 的 inspector 也是可以的。前提是手机里面 WDA 已经安装启动了。
华为,op,夜神都是可以的。

hello 回复

ios 的我这试了下,只能抓到 UICatalog 这个 app 的页面,其他 app 的页面一抓就报错(能用 appium 的 inspector 抓到),是不是哪里操作错了😂

hello #8 · July 03, 2018 Author
对酒当歌 回复

用 appium inspector 可以抓取么?

hello 回复

可以的

hello #10 · July 03, 2018 Author
对酒当歌 回复

啊。奇怪了,这个就是利用 WDA 抓取 xml。你 浏览器敲这个 127.0.0.1:8001/status 看看返回值。能拿到 Sessionid 么

Author only
hello #12 · July 03, 2018 Author
对酒当歌 回复

哈哈哈。我说错了,就是是 8100。你 app 叫什么。我这边试试看

Author only
hello #14 · July 03, 2018 Author
对酒当歌 回复

我手机 iPhone6P ios9.3.4,刚试了,是可以抓取的。你 先用 appium inspector 去抓,主要是利用 appium inspector 去启动 WDA,完事后,你再试试这个工具。

Author only
hello #16 · July 03, 2018 Author
对酒当歌 回复

应该没少啊,我明天试试 6。抱歉啊

Author only

楼主,给你反馈问题来了,看看啥问题哈
Error while parsing UI hierarchy XML file: null[Ljava.lang.StackTraceElement;@3711cea6

19Floor has deleted
枫叶 回复

同样的报错.....

hello #21 · July 04, 2018 Author
枫叶 回复

你安卓自带的 jar 这样启动能截取 xml 么?

hello #22 · July 04, 2018 Author
hello 回复

LvmamaXmlKit.jar 要推到手机里,截图截取 xml 要用到

hello 回复

自带的正常

hello #24 · July 05, 2018 Author
枫叶 回复

LvmamaXmlKit.jar 这个 jar,放到手机里了么?

hello 回复

没有,我正在看你在 git 上的介绍,一会把这个 jar 包导入手机试试

hello 回复

为啥我这个小米的手机找不到这个目录 /data/local/tmp/

hello 回复

自己新建这个路径导入是否 OK

hello #28 · July 05, 2018 Author
枫叶 回复

shell 命令 进手机里看看。不过文件管理找不到没有关系,执行那句命令,推进手机就好了。

hello #29 · July 05, 2018 Author
hello 回复

复制 LvmamaXmlKit.jar 到本地 D 盘根目录下,打开命令行窗口执行命令:adb push D:\LvmamaXmlKit.jar /data/local/tmp/
只要这个命令执行成功,不报错,就是成功了。

hello 回复

好的

hello 回复

可以了😄

hello #32 · July 05, 2018 Author
枫叶 回复

好的,抱歉啊。我那个帖子重要的一点没有忘记说了。昨晚忽然想起来补上了。LvmamaXmlKit 这个是必须的

hello 回复

恩恩,要是能出一个针对 H5 页面定位元素的类似工具就更完美啦

hello #34 · July 05, 2018 Author
枫叶 回复

h5 的,在想办法了。

hello 回复

期待成品👍

hello #36 · July 05, 2018 Author
Smile 回复

LvmamaXmlKit.jar 这个 jar,放到手机里了么?复制 LvmamaXmlKit.jar 到本地 D 盘根目录下,打开命令行窗口执行命令:adb push D:\LvmamaXmlKit.jar /data/local/tmp/
这个是取得 xml 和截图的关键所在

Author only
hello #38 · July 05, 2018 Author
AItestwork 回复

怎么加?

Author only

楼主,请问这是什么情况啊@3711cea6

hello #41 · July 06, 2018 Author
逆流 回复

Windows 还是 Mac ?
LvmamaXmlKit.jar 这个 jar,放到手机里了么?复制 LvmamaXmlKit.jar 到本地 D 盘根目录下,打开命令行窗口执行命令:adb push D:\LvmamaXmlKit.jar /data/local/tmp/
这个是取得 xml 和截图的关键所在

hello 回复

放里面了,windows 系统

hello #43 · July 06, 2018 Author
逆流 回复

这截图是和抓取 xml 是成功了的感觉。感觉没有毛病啊、app 名字是什么。方便说一下么?我本地试试

hello 回复

我就测试的时夜神模拟器里的相机

hello #45 · July 06, 2018 Author
逆流 回复


刚测试了一下。没有毛病啊。你再认真看一下操作步骤,看是否有遗漏
你先 SDK 自带 jar 的试试,自带的 jar 不行的话。那我这个工具也是不行的。

hello 回复

还有一个问题是:我连接 hierachy viewer 时,不显示列表,就是没有那个小箭头

hello #47 · July 06, 2018 Author
逆流 回复

没有小箭头,这个我就不清楚了。这个工具我没有研究过。


自带的可以

hello #49 · July 06, 2018 Author
逆流 回复

这就奇怪了、、、

hello 回复

我在真机上测试时,也是出那样的错误,是我配置有问题吗?

hello #51 · July 06, 2018 Author
逆流 回复

方便远程看一下么?感觉没有毛病啊。很奇怪

逆流 · #52 · July 06, 2018
Author only
hello #53 · July 06, 2018 Author
逆流 回复

可以啊

hello 回复

算了,不弄了,我们测试主管不让我折腾了😹 😹

hello 回复

非常感谢你👏 👏

hello #56 · July 06, 2018 Author
逆流 回复

ok

我也遇到了上面的情况

平台是 mac

hello #59 · July 06, 2018 Author
yxiaohigh 回复

Mac 电脑。先用 appium 自带的 inspector 试试看,看自带的能不能抓取。能够抓取时,在用这个工具,用的时间手机别锁屏

yxiaohigh 回复

老哥,如果你的好了,@ 我一下,告诉我怎么弄好的,谢谢

hello Ui automator viewer 无法获取页面元素 中提及了此贴 07 Jul 09:29

真机 :小米 MX2
看不到/data 目录下的东西 😅

真机看不到 data 下面东西正常,但是目录是确实存在的,实在想看那个目录的话,可以执行 shell 命令查看。执行命令后,是可以把文件推送到那个目录的,文件推送成功就可以了

不得不佩服重新造轮子的同行,但是轮子已有,还不用小白用户安装客户端软件,直接在浏览器中录制。
可以看看 macaca 是怎么玩的,看懂了,录制就是一层窗户纸,一下就捅破了,除了对 macaca 进行二次开发,否则录制没有任何技术含量。

乾行 回复

Macaca 虽好,玩家占比不多吧,Macaca 不需要安装东西?关键是 Macaca 那一套东西也不是我这样小白能看懂的啊。对你们来说是一层窗户纸,对我这样低段位玩家来说,简直是铜墙铁壁啊😂 等你分享你的基于 Macaca 二次开发的工具哦

macaca 的作者在社区里面很活跃,大家可以咨询一下

乾行 回复

其实就是 pagesource 的解析,可以先转成 json,然后前端用 tree 和 两层 canvas 就可以渲染出 inspector 的效果了,没啥难度;

king.yu 回复

同样的见解

跟我报错一样的小伙伴,把 JDK 改为 1.8 后,完美运行!附官网下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Author only
hello #71 · July 15, 2018 Author
山姆大叔 回复

好的。我看看一下

能支持 H5 就太有爱了,感谢楼主分享,已点赞!😍 😍 😍 😍 😍 😍 😍

赞一个,很方便

hello 回复

我的是推送成功了...但是还是报错..

hello #75 · July 21, 2018 Author

ios 还是安卓?

hello 回复

安卓 mix2 用自带的可以

hello #77 · July 21, 2018 Author

米 2?我周一找个米 2 测试机试试,其实写代码时完全可以用模拟器啊。不影响在真机上跑的。

hello 回复

环境
java 1.8.0 Lvxxxxx.jar 推送成功. tools 也替换 uiautomatorviewer.
等下我用模拟器看看
麻烦大佬了

@success @test_y 运行报错请检查 /data/local/tmp/local/tmp/uidump 目录是否存在,因为不存在的时候,dump xml 的时候不会报错,但是 adb pull 的时候会会找不到 xml 报错,有些手机默认是不存在这个目录的

报错:Error while parsing UI hierarchy XML file: null[Ljava.lang.StackTraceElement;@14a3c4e3
Error while parsing UI hierarchy XML file: null[Ljava.lang.StackTraceElement;@14a3c4e3
环境:MacOS,SDK 自带 uiautomatorviewer 能正常使用。
LvmamaXmlKit.jar 的 jar 包已经 push 到/data/lcoal/tmp 目录

hello #81 · July 26, 2018 Author
JamesChung 回复

大兄弟,你这个实在对不起。Mac 环境下, 我这搞成默认是 iPhone 了。不支持 Mac 下的安卓。非常抱歉啊

为什么一定要用 xpath ?

hello #83 · July 30, 2018 Author
王亮 回复

1,xpath 相对来说比较通用,2.ios 刚学习,id 对应 pagesource xml 里那个东西没有调查清楚,ios 这块还没做好

花开 回复

那我要创建是吗

hello #85 · July 31, 2018 Author

不需要创建的

请教大神, 像下面这种 Music List 怎么获取元素, UiAutomator 包括您的二次开发都获取不到呢

用 DumpHierarchy 能获取到 Text value,但是在执行 Click 的时候还是说 UiObject 不存在,这是什么原因呢?

hello #87 · August 02, 2018 Author
Lily204016 回复

兄弟,你这是啥 APP 我本地装一下试试看。定位不到,有点奇怪啊。

多谢分享,之前自己也做了一个 android 的控件获取工具,还带录制回放,大致思路都是获取 xml 解析和 android 自身的屏幕设备点击事件获取 getevent,ios 只是研究过机制,能统一一套还是挺不错的。

hello #89 · August 06, 2018 Author
jeky2017 回复

是的我也是那个思路。我是刚学 ios 的自动化,没搞定,经常报错。机制还没搞明白。公司要产出,只能先搞搞自动化了😂

hello 回复

转换下思路, 不要跟 ios 前端的各种控件死磕

楼主,我的电脑无法启动 uiautomator 无法启动,帮忙看看什么原因呢?


hello #92 · August 19, 2018 Author
first-on-line 回复

兄 dei,你用自带那个 bat 文件启动啊。自动的 bat 启动多好啊

hello 回复

尴尬,改错文件了😂

hello #94 · August 19, 2018 Author
first-on-line 回复

😂

👍 👍 👍 👋 👋 ,厉害了大神,已装好,很好用,但是如果用 po 的话还是得自己手打手的敲😂

hello #96 · August 28, 2018 Author
Hello_world 回复

这个只是辅助,确实是要手敲。适合初学者简单玩玩还行,针对你们自己的框架还是需要封装的。😂 😂

hello 回复

对了楼主问你个问题,我们公司开发一个 app 是用 Unity 开发的,但是这个用 uiautomatorviewer 捕捉不到屏幕元素。用 appium 应该是不能实现自动化了。还有其他的测试框架能适用这个吗?😭

hello #98 · August 28, 2018 Author
Hello_world 回复

大兄弟,我对这个也没有啥研究,刚刚学习。好像网页有款测试框架 叫什么 arttest,你找找看

hello 回复

好的,谢谢了。

hello #100 · August 28, 2018 Author
Hello_world 回复

airtest

101Floor has deleted
simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 13 Dec 14:44


楼主,这个如何解决??

hello #105 · January 11, 2019 Author
tester_newbee 回复

jdk 版本多少?

hello 2018 年 度个人测开账单 中提及了此贴 25 Jan 18:37

内容不错,认真学习一下

hello 回复

楼主 我把 jar push 到 data/local/tmp/下了,但是还是报这个错

hello #109 · April 22, 2019 Author
小琎 回复

具体啥错误提示

敢问作者优化好驴妈妈图片闪的问题了吗

hello #111 · May 08, 2019 Author
Hello_world 回复

对不起,最近在搞其他的项目,这个还没改


楼主,这是手机的不兼容嘛?

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up