移动测试基础 app 测试脚本的录制工具如何实现?

cat · 2015年12月10日 · 最后由 zhonghui 回复于 2016年08月19日 · 2672 次阅读

脚本录制的实现方法

我经过调研,发现 app 的录制工具实现方式有百度 cafe,adb shell getevent 等。
cafe 使用的是 hook 方法,貌似还利用了 android 安全漏洞,但是 android4,.2 以后这个漏洞修复了,估计就没法用了吧。而且 hook 这个东西不怎么懂。
我自己想了一个录制方法,使用 android accessibility 辅助功能监听用户操作事件,通过 AccessibilityEvent 的 getSource() 方法获取事件信息。

accessibilityEvent 的事件内容

start time: 24808.582 TYPE_VIEW_CLICKED:1
current node info:android.view.accessibility.AccessibilityNodeInfo@9662; boundsInParent: Rect(0, 0 - 68, 66); boundsInScreen: Rect(60, 435 - 128, 501); packageName: cn.kuwo.player; className: android.widget.CheckBox; text: null; contentDescription: null; viewIdResName: null; checkable: true; checked: false; focusable: true; focused: false; selected: false; clickable: true; longClickable: false; enabled: true; password: false; scrollable: false; [ACTION_FOCUS, ACTION_SELECT, ACTION_CLEAR_SELECTION, ACTION_CLICK, ACTION_ACCESSIBILITY_FOCUS] familyString:root-0-0-0-0;

存在的问题

其中 view id 永远为空,AccessibilityNodeInfo 有 getViewIdResourceName 方法,但是获取的值永远为空。
请问下大家,有没有什么好的脚本录制方法? 大家一起讨论下。
此外,我还看到有些测试脚本录制工具是基于 instrumentation 的,比如 testdroid, 不知道这个如何实现录制?

录制方法比较:uiautomator 与 instrumentation 的比较

我总结了下,uiautomator 提供 AccessibilityEvent,通过这个方法,我们编写一个录制脚本,在脚本里监听 AccessibilityEvent,可以很容易捕获所有事件。但是 uiautomator 不能录制 webview。
instrumentation 框架可以通过 cafe 的方式,hook 所有的 listener,将自定义的 listener 去替换原有的 listener,并且加入录制代码。ps,这个地方有人知道 listener hook 需要 root 手机吗?
那么问题来了,uiautomator 和 instrumentation hook 这两种录制方法,到底有什么区别呢? 用哪种方法好呢? 我所了解的是 instrumentation 能够支持低版本和 webview,uiautomator 不可以,除此以外,还有什么区别吗?

共收到 17 条回复 时间 点赞

你学习下 markdown. 这是好话题, 注意下格式

这些坑我们都踩过,最后我们乖乖的用 ddms 的方式去做的,据说 testin 是用 adb shell getevent 做的

cat #4 · 2015年12月11日 Author

#3 楼 @doctorq ddms 的方式是怎么个思路呢? adb shell getevent 全部都是坐标,需要找个方法解析成控件 id,我觉得可以通过 uiautomator 测试脚本来 dump 界面 UI,从而解析出控件 id,但是不知道效率怎么样,如果延迟时间太长,就没法录制了。

#4 楼 @heavennash 就是基于坐标的方式,看你要做到什么程度了,getevent 的方式,也可以通过 sendevent 的方式回放脚本,但是问题是如何解决不同系统的差异性,如果你能找到基于控件的方式,那是最好不过了,这样就解决了兼容性问题。但是 uiautomator 的方式对于很多界面是无法操作的,先不说效率问题,就比如 webview 的控件,你就无法获取到底点击的是 webview 中的哪个控件。这一点要留意。

cat #12 · 2015年12月14日 Author

#5 楼 @doctorq 能够详细说下 ddms 的思路吗? 如果是用 adb shell getevent,那么类似于 edit 事件等较为复杂一些的,就无法录制了。

#6 楼 @heavennash 就是 ddmlib,在 PC 端有一个手机界面展示,点击 PC,手机端联动,以坐标录制。

cat #8 · 2015年12月14日 Author

#7 楼 @doctorq 如果是人在手机端操作 app,那么这种方法就没法录制了啊。

cat #9 · 2015年12月15日 Author

@seveniruby 已经把格式改过了。

cat #10 · 2015年12月16日 Author

@lihuazhang@seveniruby@monkey 能否把这个帖子从违规区移出来啊? 我已经改过格式了。

cat #11 · 2015年12月17日 Author

大家能聊聊 uiautomator 与 instrumentation 的这两种录制方法的比较吗?

#11 楼 @heavennash 不大懂,不过新的 uiautomator 是基于 instrumentation 的,你看能不能把这两种方法结合在一起。

cat #13 · 2015年12月18日 Author

我调研了一些测试脚本录制工具,比如 testin 录制工具和 testdroid 录制工具,他们都是启动一个 instrumentation 测试脚本,然后通过这个测试脚本来监控用户的操作行为,从而录制。但是 uiautomator 框架中提供了对 accessibilityEvent 的监控,也可以通过这个录制。
我想问得是,instrumentation 框架 (例如 robotium) 录制的脚本,比起 uiautomator,有哪些优势?

#13 楼 @heavennash Cafe 基于 hook 的原理,基于 instrumentation,通过自定义 listener 替换原有的 listener 进行事件的录制,而 uiautomator 是基于 accessibilityNodeInfo 中的信息进行事件的监控录制。
instrumentation 是基于控件 Id 进行录制的,因为通过 listener 这种方式可以获取非常全面的信息,只要自定义的 listener 足够全面,(貌似 Spinner 控件无法录制),可以获取当前触发事件的一系列信息,但是最大的问题是无法进行跨 App 的录制。
uiautomator 可以是通过对 AccessibilityEvent 的事件类型进行判断,但是有时候对于一条滑动事件,可能会触发多条事件流,且录制过程中可能会丢失一些事件,但优点是可以进行跨进程录制。

以 Instrumentation 录制为基础,通过 UIautomator 进行事件流信息的补充,是不错的选择~

现在正在尝试做这样的工具,通过 getevent 获取事件已经坐标,通过 uiautomator 和 hierarchy viewer 来获取 UI 信息,使用事件获取到的坐标来定位到 ui 控件,根据事件类型生成脚本。缺点就是操作一次屏幕就要获取一次屏幕信息,太慢

基于坐标的同学请教个问题,在录制时上下滑动,由于滑动的快慢,ui 上会有一定量的滞速,会导致回放的时候,定位就不准了,这个问题有人处理过吗

#15 楼 @lfchuan 请问下,你是在通过 adb shell 来获取 event 事件吗,还是做一个 app,在 app 里执行 shell 呢?

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