近期看了论坛很多关于 uiautomator 的二次开发帖子,真正自己动手做发现坑不少-_-#
目前已实现的功能
(部分功能已实现,其余未填坑,请各位看官自己看代码填吧)
使用时切记环境变量需配置ANDROID_HOME这个参数
各位看官轻拍
下载地址
学习~
提供源码,好人啊,右键菜单的效果不错,学习下
学习了,多谢分享~
不多的分享源码的, 学习了
感谢分享 请教楼主代码中关于 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)
@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 下面,还是不行。
@zsg5566 取你的 sdk 中的 swt 包就好了。你是 32 位就取 32 位的,加载到工程中
做 uiautomatorviewer 的改造是去年年初,加全路径 xpath(用到的时候不多)。今年看到论坛有使用 bootstrap 方式驱动设备端的方法又开始改进,现在也实现了跟你类似的功能。你也提供了一个非常不错的思路给大家参考,另外想请问一下 find,check 这两个方法没有写,这两个是准备做什么用呢?
@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
@darkcao 将 lib 里面的文件全部依赖
你好, 我生成的文件,替换 lib 下的 uiautomatorviewer.jar 后, 再去执行 uiautomatorviewer.bat. 提示下图, 这个怎么解决呢
@lydiaxiao 你本地编译的时候是否正常
@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)
@explorer 贴一下报错的代码 以及在报错代码上面按下 f2 看下提示
@kasi 搞定了,只是换了最新的 JDK,然后重新导入,重新更新 SWT,jar 包后就能正常使用了,感谢 kasi 的无私分享
请问下楼主,这个我如何把应用到程序中呢?直接把您写的项目打包成 jar 文件,命名为 uiautomatorviewer.jar 文件,然后放到 sdk 对应的文件里面就好了么
jdk 1.7 可以吗?希望楼主提供一个 maven 版本
#25 楼 @fwcco2605 我文件里面有这一行,但是还是报那个错误啊。。。
楼主,我用这个包覆盖了,为什么界面闪一下就没了
—— 来自 TesterHome 官方 安卓客户端
楼主,我把包覆盖了,为什么运行时闪一下就没了
—— 来自 TesterHome 官方 安卓客户端
@q8164305 用 ide 调试看看吧
@q8164305 没有加载资源包 去把 lib 里面的包都加上吧
@q8164305 打包应该正常 可以看下是否文件齐全
@xiaoli jar 包都加载齐全了吗 另外也有可能需要替换一下 swt 的 jar 包
@xiaoli 我传到 github 上面 你到时候去拉下吧
@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 一运行就这样
谢谢分享。
#15 楼 @adfghzhang 关于通过 bootstrap 驱动设备 ,你已经实现了吗?可以给个联系方式吗,我想请教个问题~ 感谢。我的邮箱 alwanstest@163.com
666
主要实现逻辑能简单介绍一下吗?右击菜单确实会经常用到
@liuxiaoyao0602 论坛其他帖子有介绍的,我只是将其引用进去了
这个文本输入的时候是不是有些问题啊?我的是点击 editText 输入的文本,右侧脚本是显示出来了,但是刷新文本框没有东西显示啊
@star8 我有输入中文的方法,不过还需要安装插件之类的,你给我一个邮箱我发给你
@kasi 在https://testerhome.com/topics/3048这个帖子中你有提到,
页面元素的获取可以不用 dump 来获取,请问这个是用什么方法实现的,你这个源码里面好像也是用 dump 来解析的
@yiziyan 这个是属于工具改造,增加功能,另外一个帖子中的回答说的是不是才有命令 dump 写到 xml 来获取,而是用系统的 api 获取到页面后写入内存
@kasi 页面元素的获取可以不用 dump 来获取,那样会有 1-2s 的时间耗时,可以通过将信息获取存储到内存中再进行解析,这样可以提升执行效率
这个将信息获取存储到内存中再进行解析的方法有什么具体的代码可供参考么?
请问下,进行 uiautomatorviewer 二次开发的话,Referenced Libraries 中的 jar 包是要从网站上一个个下载再添加到工程里吗?还是哪里就有这些 jar 包?
请问一下,怎么找 uiautomatorviewer 的源代码呢?我用反编译出来的,好多错误啊。