UiAutomator java 初学者-uiautomatorviewer 的改造

卡斯 · 2016年05月04日 · 最后由 oscillator 回复于 2017年04月27日 · 8666 次阅读
本帖已被设为精华帖!

近期看了论坛很多关于 uiautomator 的二次开发帖子,真正自己动手做发现坑不少-_-#


目前已实现的功能

1.右键菜单

(部分功能已实现,其余未填坑,请各位看官自己看代码填吧)

2.右侧增加脚本输出栏

3.属性栏增加了 xpath

使用时切记环境变量需配置ANDROID_HOME这个参数

各位看官轻拍
下载地址

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 59 条回复 时间 点赞

学习~

提供源码,好人啊,右键菜单的效果不错,学习下

学习了,多谢分享~

不多的分享源码的, 学习了

感谢分享 请教楼主代码中关于 refresh 的部分,取消注释的话能正常刷新界面嘛

//click(refresh) item15-19

item15.addSelectionListener(new SelectionAdapter(){
    @Override
    public void widgetSelected(SelectionEvent e){
        objectClick();
        //UiAutomatorViewer window=UiAutomatorViewer.getInstance();
        //ScreenshotAction screenshot=new ScreenshotAction(window, false);
        //screenshot.run();
    }
});

我这里总是报下面的错误

Unhandled event loop exception during blocked modal context.
org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.NullPointerException)
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Unknown Source)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Unknown Source)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
    at org.eclipse.jface.operation.ModalContext$ModalContextThread.block(ModalContext.java:173)
    at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:388)
    at org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:507)
    at com.android.uiautomator.actions.ScreenshotAction.run(ScreenshotAction.java:85)
    at com.android.uiautomator.UiAutomatorView$3$6.widgetSelected(UiAutomatorView.java:324)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
    at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
    at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
    at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
    at org.eclipse.jface.window.Window.open(Window.java:801)
    at com.android.uiautomator.UiAutomatorViewer.main(UiAutomatorViewer.java:91)
Caused by: java.lang.NullPointerException
    at com.android.uiautomator.UiAutomatorViewer$1.run(UiAutomatorViewer.java:117)
    at org.eclipse.swt.widgets.RunnableLock.run(Unknown Source)
    ... 16 more
java.lang.NullPointerException
    at com.android.uiautomator.actions.ScreenshotAction.showError(ScreenshotAction.java:108)
    at com.android.uiautomator.actions.ScreenshotAction.run(ScreenshotAction.java:103)
    at com.android.uiautomator.UiAutomatorView$3$6.widgetSelected(UiAutomatorView.java:324)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
    at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
    at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
    at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
    at org.eclipse.jface.window.Window.open(Window.java:801)
    at com.android.uiautomator.UiAutomatorViewer.main(UiAutomatorViewer.java:91)



@727129899 update 一下代码就好了

能不能分析下实现方式。。。

@lose 看代码吧 还有论坛的类似帖子

看大神帖子,能学到很多

为什么我的工程运行的时候报下面的错误, 求指教
Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-cocoa-3550 or swt-cocoa in swt.library.path, java.library.path or the jar file
at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
at org.eclipse.swt.internal.C.(Unknown Source)
at org.eclipse.swt.internal.cocoa.NSThread.isMainThread(Unknown Source)
at org.eclipse.swt.graphics.Device.(Unknown Source)
at org.eclipse.swt.widgets.Display.(Unknown Source)
at org.eclipse.swt.widgets.Display.(Unknown Source)
at org.eclipse.swt.widgets.Display.getDefault(Unknown Source)
at org.eclipse.swt.widgets.Shell.(Unknown Source)
at org.eclipse.swt.widgets.Shell.(Unknown Source)
at org.eclipse.jface.window.Window.createShell(Window.java:487)
at org.eclipse.jface.window.Window.create(Window.java:430)
at org.eclipse.jface.window.Window.open(Window.java:790)
at com.android.uiautomator.UiAutomatorViewer.main(UiAutomatorViewer.java:90)

卡斯 #11 · 2016年05月09日 Author

@zsg5566 swt 的 jar 包问题,你是 32 位还是 64 位

#11 楼 @kasi 我在网上搜了这个问题, 按照 http://stackoverflow.com/questions/2894954/how-do-i-resolve-no-swt-cocoa-3557-or-swt-cocoa-in-swt-library-path-java-librar 这个方法下个 64 位的 swt-cocoa-3550.jar,放在 sdk 的 tools/lib 下面,还是不行。

卡斯 #13 · 2016年05月10日 Author

@zsg5566 取你的 sdk 中的 swt 包就好了。你是 32 位就取 32 位的,加载到工程中

#13 楼 @kasi OK 了, 谢谢!

做 uiautomatorviewer 的改造是去年年初,加全路径 xpath(用到的时候不多)。今年看到论坛有使用 bootstrap 方式驱动设备端的方法又开始改进,现在也实现了跟你类似的功能。你也提供了一个非常不错的思路给大家参考,另外想请问一下 find,check 这两个方法没有写,这两个是准备做什么用呢?

卡斯 #16 · 2016年05月11日 Author

@adfghzhang 查找元素及检查点

谢谢分享

我是个初学者,下载了大神你发布的代码,请问如何运行啊,里面是否直接有可执行的文件,如 jar、exe、bat 等。
就像 SDK 自带的 uiautomatorviewer.bat,执行就打开了。
我安装的 JDK 是 jdk-8u74-windows-x64.exe
这个工程我导入了 Eclipse 中,提示有两个错误:
Errors

Description Resource    Path    Location    Type
The project cannot be built until build path errors are resolved    testtool        Unknown Java Problem
Description Resource    Path    Location    Type
Unbound classpath container: 'JRE System Library [JavaSE-1.8]' in project 'testtool'    testtool        Build path  Build Path Problem

参考网上和历史回复的教程,在 build Path 中修改了 jre 的路径,替换 64 位的 swt.jar,这下报错有 156 多条了
如何解决啊,另外这个工程的执行入口在哪里?直接点运行吗?
全是如下这样的:

Description Resource    Path    Location    Type
Cannot refer to a non-final variable item1 inside an inner class defined in a different method  UiAutomatorView.java    /testtool/src/com/android/uiautomator   line 284    Java Problem
Description Resource    Path    Location    Type
Syntax error, 'for each' statements are only available if source level is 1.5 or greater    BasicTreeNode.java  /testtool/src/com/android/uiautomator/tree  line 69 Java Problem
Description Resource    Path    Location    Type
Syntax error, annotations are only available if source level is 1.5 or greater  BasicTreeNodeContentProvider.java   /testtool/src/com/android/uiautomator/tree  line 27 Java Problem

19楼 已删除
卡斯 #20 · 2016年05月19日 Author

@darkcao 将 lib 里面的文件全部依赖

你好, 我生成的文件,替换 lib 下的 uiautomatorviewer.jar 后, 再去执行 uiautomatorviewer.bat. 提示下图, 这个怎么解决呢

卡斯 #22 · 2016年05月19日 Author

@lydiaxiao 你本地编译的时候是否正常

#20 楼 @kasi 额,作为一个初学者,真是惭愧,我在 java build Path 里研究了半天,发现还是搞不定,能否有一个比较傻瓜式的教程?

卡斯 #24 · 2016年05月20日 Author

@darkcao 百度或者 google 如何添加吧

#21 楼 @lylyliuyu jar 包里有个 MANIFEST.MF 文件,加一行 Main-Class: com.android.uiautomator.UiAutomatorViewer 就可以了

@kasi 搞了一天,现在终于能启动 UI Automator Viewer 了,但还是不能使用,选中控件点击或其它操作时报以下错误,谢谢大神指导下,非常感谢!
java.lang.Error: Unresolved compilation problems:
Cannot refer to a non-final variable item13 inside an inner class defined in a different method
Cannot refer to a non-final variable item1 inside an inner class defined in a different method

at com.android.uiautomator.UiAutomatorView$3$4.widgetSelected(UiAutomatorView.java:308)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
at org.eclipse.jface.window.Window.open(Window.java:801)
at com.android.uiautomator.UiAutomatorViewer.main(UiAutomatorViewer.java:90)

卡斯 #27 · 2016年05月23日 Author

@explorer 贴一下报错的代码 以及在报错代码上面按下 f2 看下提示

@kasi 搞定了,只是换了最新的 JDK,然后重新导入,重新更新 SWT,jar 包后就能正常使用了,感谢 kasi 的无私分享

请问下楼主,这个我如何把应用到程序中呢?直接把您写的项目打包成 jar 文件,命名为 uiautomatorviewer.jar 文件,然后放到 sdk 对应的文件里面就好了么

jdk 1.7 可以吗?希望楼主提供一个 maven 版本

#25 楼 @fwcco2605 我文件里面有这一行,但是还是报那个错误啊。。。

楼主,我用这个包覆盖了,为什么界面闪一下就没了

—— 来自 TesterHome 官方 安卓客户端

楼主,我把包覆盖了,为什么运行时闪一下就没了

—— 来自 TesterHome 官方 安卓客户端

卡斯 #35 · 2016年06月02日 Author

@q8164305 用 ide 调试看看吧

#35 楼导进 eclipse 里各种报错

—— 来自 TesterHome 官方 安卓客户端

卡斯 #37 · 2016年06月02日 Author

@q8164305 没有加载资源包 去把 lib 里面的包都加上吧

#37 楼 @kasi 正常打包没有任何问题,就是运行不起来,界面一直闪一下就没了😭

—— 来自 TesterHome 官方 安卓客户端

#37 楼 @kasi 现在是可以运行起来,无法打包了,我的天

—— 来自 TesterHome 官方 安卓客户端

卡斯 #40 · 2016年06月03日 Author

@q8164305 打包应该正常 可以看下是否文件齐全

41楼 已删除

#27 楼 @kasi 我用 eclipse 编译了你的工程源码,除了有如下这个警告提示外,

点击 OK 后,console 没任何报错信息输出,生成的 uiautomatorviewer.jar 是 1321 Kb 对吗?我把它覆盖在 sdk\tools\lib 下,然后双击 sdk\tools 下的 uiautomatorviewer.bat,功能上没看到任何变化

环境变量配置为: C:\adt-bundle-windows-x86_64-20131030\sdk

卡斯 #43 · 2016年06月03日 Author

@xiaoli jar 包都加载齐全了吗 另外也有可能需要替换一下 swt 的 jar 包

#43 楼 @kasi swt 的包我已经将 sdk 下 64 位的包覆盖到了你相应的工程下了,如 zsg5566 · #10 所说的。除此之外,还需要其他什么 jar 包吗? 打包时没任何报错。或者你能否将你打包好的 uiautomatorviewer.jar 发我测试下,我电脑是 64 位的

卡斯 #45 · 2016年06月03日 Author

@xiaoli 我传到 github 上面 你到时候去拉下吧

46楼 已删除

@kasi 出现和 10 楼一样的问题,我试了很多都没有解决,我的电脑是 64 位的,替换了你 github 上的那个 jar 发现没有出现右键的一些属性,求帮忙,最近在学这个,很感谢你的分享

查找了 N 多资料搞定了,谢谢

Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-cocoa-3550 or swt-cocoa in swt.library.path, java.library.path or the jar file
at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
at org.eclipse.swt.internal.C.(Unknown Source)
at org.eclipse.swt.internal.cocoa.NSThread.isMainThread(Unknown Source)
at org.eclipse.swt.graphics.Device.(Unknown Source)
at org.eclipse.swt.widgets.Display.(Unknown Source)
at org.eclipse.swt.widgets.Display.(Unknown Source)
at org.eclipse.swt.widgets.Display.getDefault(Unknown Source)
at org.eclipse.swt.widgets.Shell.(Unknown Source)
at org.eclipse.swt.widgets.Shell.(Unknown Source)
at org.eclipse.jface.window.Window.createShell(Window.java:487)
at org.eclipse.jface.window.Window.create(Window.java:430)
at org.eclipse.jface.window.Window.open(Window.java:790)
at com.android.uiautomator.UiAutomatorViewer.main(UiAutomatorViewer.java:90)

替换了好几个 swt 一运行就这样

#42 楼 @xiaoli 华为手机

谢谢分享。

#15 楼 @adfghzhang 关于通过 bootstrap 驱动设备 ,你已经实现了吗?可以给个联系方式吗,我想请教个问题~ 感谢。我的邮箱 alwanstest@163.com

主要实现逻辑能简单介绍一下吗?右击菜单确实会经常用到

@liuxiaoyao0602 论坛其他帖子有介绍的,我只是将其引用进去了

这个文本输入的时候是不是有些问题啊?我的是点击 editText 输入的文本,右侧脚本是显示出来了,但是刷新文本框没有东西显示啊

#54 楼 @kasi 楼主这个输入框输入中文怎么破?

@star8 我有输入中文的方法,不过还需要安装插件之类的,你给我一个邮箱我发给你

@kasihttps://testerhome.com/topics/3048这个帖子中你有提到,
页面元素的获取可以不用 dump 来获取,请问这个是用什么方法实现的,你这个源码里面好像也是用 dump 来解析的

卡斯 #59 · 2017年01月18日 Author

@yiziyan 这个是属于工具改造,增加功能,另外一个帖子中的回答说的是不是才有命令 dump 写到 xml 来获取,而是用系统的 api 获取到页面后写入内存

@kasi 页面元素的获取可以不用 dump 来获取,那样会有 1-2s 的时间耗时,可以通过将信息获取存储到内存中再进行解析,这样可以提升执行效率
这个将信息获取存储到内存中再进行解析的方法有什么具体的代码可供参考么?

请问下,进行 uiautomatorviewer 二次开发的话,Referenced Libraries 中的 jar 包是要从网站上一个个下载再添加到工程里吗?还是哪里就有这些 jar 包?

请问一下,怎么找 uiautomatorviewer 的源代码呢?我用反编译出来的,好多错误啊。

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