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

success · 2018年07月02日 · 最后由 success 回复于 2018年08月28日 · 6626 次阅读
本帖已被设为精华帖!

缘起

公司部门调整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一下。

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

真机可以用了吗?

chorushe 回复

我用的就是真机

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

lancelot 回复

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

success Py 福利 Python 自动化代码自动生成工具分享 中提及了此贴 07月03日 17:23
success 回复

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

lancelot 回复

用appium inspector可以抓取么?

success 回复

可以的

lancelot 回复

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

仅楼主可见
lancelot 回复

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

仅楼主可见
lancelot 回复

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

仅楼主可见
lancelot 回复

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

仅楼主可见

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

19楼 已删除
FengYeLoveCode 回复

同样的报错.....

FengYeLoveCode 回复

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

success 回复

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

success 回复

自带的正常

FengYeLoveCode 回复

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

success 回复

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

success 回复

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

success 回复

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

FengYeLoveCode 回复

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

success 回复

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

success 回复

可以了😄

FengYeLoveCode 回复

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

success 回复

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

FengYeLoveCode 回复

h5的,在想办法了。

success 回复

期待成品👍

williamxin 回复

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

仅楼主可见
AItester 回复

怎么加?

仅楼主可见

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

niliu 回复

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

success 回复

放里面了,windows系统

niliu 回复

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

success 回复

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

niliu 回复


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

success 回复

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

niliu 回复

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


自带的可以

niliu 回复

这就奇怪了、、、

success 回复

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

niliu 回复

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

仅楼主可见
niliu 回复

可以啊

success 回复

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

success 回复

非常感谢你👏 👏

niliu 回复

ok

我也遇到了上面的情况

平台是mac

yxiaohigh 回复

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

yxiaohigh 回复

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

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

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

test_y 回复

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

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

iqianxing 回复

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

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

iqianxing 回复

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

kinget007 回复

同样的见解

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

仅楼主可见
wxlsh114 回复

好的。我看看一下

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

赞一个,很方便

success 回复

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

test_y 回复

ios 还是安卓?

success 回复

安卓 mix2 用自带的可以

test_y 回复

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

success 回复

环境
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目录

zhonglinlins 回复

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

为什么一定要用xpath ?

gunstar 回复

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

yaming116 回复

那我要创建是吗

test_y 回复

不需要创建的

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

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

Lily204016 回复

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

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

zzljeky 回复

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

success 回复

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

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


chenxuchun 回复

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

success 回复

尴尬,改错文件了😂

chenxuchun 回复

😂

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

Wangwangfan 回复

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

success 回复

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

Wangwangfan 回复

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

success 回复

好的,谢谢了。

success #100 · 2018年08月28日 作者
Wangwangfan 回复

airtest

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册