Appium android 录制回放讨论帖

思寒_seveniruby · 2013年12月17日 · 最后由 sanbo 回复于 2016年06月23日 · 3905 次阅读

在微博上跟百度的鲁晓宇讨论了一些关于 android 录制回放的实现方式.
他在 github 上开了一个讨论帖
https://github.com/BaiduQA/Cafe/issues/22

luxiaoyu opened this issue 2 hours ago
【讨论】录制回放改进讨论帖
No milestone No one is assigned
有同学想写一个不需要keystore的录制回放工具,http://weibo.com/1907875417/AnpfUmmTB
我想了一下,应该可以实现(没实现过)
在有uiautomator的android版本上:
1.可以通过uiautomator获得当前所有可见UI的(x,y,w,h)
2.通过adb shell getevent获得当前操作的(x,y)
3.根据1、2的信息判断操作落在哪个控件上,这样就能做到控件级的录制回放了
但是如果是ListView类的操作不太好准确记录滑动的停止位置

在没有有uiautomator的android版本上:
可以利用android的签名检查漏洞将Cafe的录制回放的代码注入到dex中而不改变签名,详见http://blog.sina.com.cn/s/blog_be6dacae0101bmq3.html

我跟 appium 的维护者也在讨论这个话题, 帖子地址在
https://github.com/appium/appium/issues/1487#issuecomment-30638047

目前基本思路都有了, 已经可以开始做这个录制工具了. 我会先制作一个 demo 版本.
下下周开始搞.

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

如果只有 Android 有, ios 没有的话,那多让人伤心。。

#1 楼 @lihuazhang appium 的人说了, 他们已经开始考虑跟我用同样的方式搞 ios 了, 我估计 ios 上出录制回放工具会比 android 更快更早. 我要到下个星期才搞.

如下是在淘宝的 app 上做了一个简单的搜索和收藏.
根据 uiautomator 提供的 event 数据来看, 还不足以定位一个元素.

他提供的属性里面,有用的信息只有这些

  1. text
  2. content-desc
  3. ItemCount 和 CurrentItemIndex, 这个数据只有个别元素才有, (这个数据我没理解, 他是如何计算的. 这有个连接可以参考.http://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html)
  4. 其他附加属性

没有任何 id 和 index 可以识别出某个控件, 也只能模糊定位, 甚至都没有事件的坐标.

Invalid int: ""

12-15 11:37:57.597 EventType: TYPE_WINDOW_STATE_CHANGED; EventTime: 62093829; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: com.taobao.tao.homepage.MainActivity3; Text: [淘宝]; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: true; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:37:57.601 EventType: TYPE_VIEW_FOCUSED; EventTime: 62093830; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.LinearLayout; Text: [搜索, 请输入搜索关键字]; ContentDescription: null; ItemCount: 6; CurrentItemIndex: 2; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:37:58.015 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62094491; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:37:58.384 EventType: TYPE_VIEW_FOCUSED; EventTime: 62094862; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.EditText; Text: [请输入搜索关键字]; ContentDescription: null; ItemCount: 6; CurrentItemIndex: 1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:37:58.460 EventType: TYPE_NOTIFICATION_STATE_CHANGED; EventTime: 62094905; PackageName: android; MovementGranularity: 0; Action: 0 [ ClassName: android.app.Notification; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: false; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: Notification(pri=0 contentView=android/0x1090071 vibrate=null sound=null defaults=0x0 flags=0x2 kind=[android.system.imeswitcher]) ]; recordCount: 0

12-15 11:37:58.467 EventType: TYPE_NOTIFICATION_STATE_CHANGED; EventTime: 62094910; PackageName: android; MovementGranularity: 0; Action: 0 [ ClassName: android.app.Notification; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: false; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: Notification(pri=0 contentView=android/0x1090071 vibrate=null sound=null defaults=0x0 flags=0x2 kind=[android.system.imeswitcher]) ]; recordCount: 0

12-15 11:37:58.610 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62095089; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:37:58.762 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62095241; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:37:59.045 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62095525; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:37:59.056 EventType: TYPE_VIEW_SCROLLED; EventTime: 62095536; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.support.v4.view.ViewPager; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:37:59.181 EventType: TYPE_VIEW_SCROLLED; EventTime: 62095661; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.support.v4.view.ViewPager; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:37:59.282 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62095760; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:37:59.298 EventType: TYPE_VIEW_SCROLLED; EventTime: 62095775; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.support.v4.view.ViewPager; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:00.009 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62096487; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:01.000 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62097478; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:01.259 EventType: TYPE_VIEW_TEXT_CHANGED; EventTime: 62097739; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.EditText; Text: [小米]; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: ; FromIndex: 0; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: 2; RemovedCount: 0; ParcelableData: null ]; recordCount: 0

12-15 11:38:01.263 EventType: TYPE_VIEW_TEXT_SELECTION_CHANGED; EventTime: 62097743; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.EditText; Text: [小米]; ContentDescription: null; ItemCount: 2; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: 2; ToIndex: 2; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:01.382 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62097861; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:02.047 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62098526; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:02.064 EventType: TYPE_VIEW_SCROLLED; EventTime: 62098543; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.support.v4.view.ViewPager; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:02.198 EventType: TYPE_VIEW_SCROLLED; EventTime: 62098678; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.support.v4.view.ViewPager; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:02.215 EventType: TYPE_VIEW_CLICKED; EventTime: 62098694; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ImageButton; Text: [搜索]; ContentDescription: 搜索; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:02.240 EventType: TYPE_VIEW_TEXT_SELECTION_CHANGED; EventTime: 62098714; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.EditText; Text: [请输入搜索关键字]; ContentDescription: null; ItemCount: 0; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: 0; ToIndex: 0; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:02.246 EventType: TYPE_NOTIFICATION_STATE_CHANGED; EventTime: 62098718; PackageName: android; MovementGranularity: 0; Action: 0 [ ClassName: android.app.Notification; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: false; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: Notification(pri=0 contentView=android/0x1090071 vibrate=null sound=null defaults=0x0 flags=0x2 kind=[android.system.imeswitcher]) ]; recordCount: 0

12-15 11:38:02.290 EventType: TYPE_VIEW_FOCUSED; EventTime: 62098769; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.LinearLayout; Text: [搜索, 请输入搜索关键字]; ContentDescription: null; ItemCount: 6; CurrentItemIndex: 2; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:02.408 EventType: TYPE_VIEW_TEXT_SELECTION_CHANGED; EventTime: 62098881; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.EditText; Text: [请输入搜索关键字]; ContentDescription: null; ItemCount: 0; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: 0; ToIndex: 0; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:02.420 EventType: TYPE_NOTIFICATION_STATE_CHANGED; EventTime: 62098897; PackageName: android; MovementGranularity: 0; Action: 0 [ ClassName: android.app.Notification; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: false; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: Notification(pri=0 contentView=android/0x1090071 vibrate=null sound=null defaults=0x0 flags=0x2 kind=[android.system.imeswitcher]) ]; recordCount: 0

12-15 11:38:02.704 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62099184; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:02.950 EventType: TYPE_WINDOW_STATE_CHANGED; EventTime: 62099429; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: com.taobao.tao.SearchListActivity; Text: [淘宝]; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: true; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:02.952 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62099430; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:02.973 EventType: TYPE_VIEW_TEXT_SELECTION_CHANGED; EventTime: 62099453; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.EditText; Text: [请输入搜索关键字]; ContentDescription: null; ItemCount: 0; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: 0; ToIndex: 0; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 1

12-15 11:38:03.010 EventType: TYPE_VIEW_SCROLLED; EventTime: 62099490; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 2; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: 0; ToIndex: 1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.016 EventType: TYPE_VIEW_FOCUSED; EventTime: 62099496; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 2; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: 0; ToIndex: 1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.083 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62099563; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.262 EventType: TYPE_VIEW_TEXT_SELECTION_CHANGED; EventTime: 62099740; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.EditText; Text: [小米]; ContentDescription: null; ItemCount: 2; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: 0; ToIndex: 0; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 1

12-15 11:38:03.279 EventType: TYPE_VIEW_TEXT_SELECTION_CHANGED; EventTime: 62099757; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.EditText; Text: [小米]; ContentDescription: null; ItemCount: 2; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: 2; ToIndex: 2; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 1

12-15 11:38:03.288 EventType: TYPE_VIEW_FOCUSED; EventTime: 62099768; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 2; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: 0; ToIndex: 1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.389 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62099868; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.520 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62099999; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.550 EventType: TYPE_VIEW_FOCUSED; EventTime: 62100028; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 14; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: 0; ToIndex: 1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.700 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62100179; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.704 EventType: TYPE_VIEW_FOCUSED; EventTime: 62100184; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 14; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: 0; ToIndex: 4; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.772 EventType: TYPE_VIEW_SCROLLED; EventTime: 62100252; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 14; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: 0; ToIndex: 4; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.817 EventType: TYPE_VIEW_FOCUSED; EventTime: 62100296; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 14; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: 0; ToIndex: 4; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.834 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62100313; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.850 EventType: TYPE_VIEW_FOCUSED; EventTime: 62100329; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 14; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: 0; ToIndex: 4; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:03.956 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62100435; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:05.285 EventType: TYPE_VIEW_FOCUSED; EventTime: 62101757; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 14; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: 0; ToIndex: 4; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:05.373 EventType: TYPE_VIEW_CLICKED; EventTime: 62101846; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: [MIUI/小米 小米手机3 M3 小米3代Mi3正品 官网原封带票 现货包邮, ¥2100.00, ¥2625.00, 已售:, 134, 深圳]; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 1

12-15 11:38:05.427 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62101906; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 14; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: 0; ToIndex: 4; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:05.436 EventType: TYPE_VIEW_TEXT_SELECTION_CHANGED; EventTime: 62101914; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.EditText; Text: [小米]; ContentDescription: null; ItemCount: 2; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: 2; ToIndex: 2; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 1

12-15 11:38:05.746 EventType: TYPE_VIEW_FOCUSED; EventTime: 62102225; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ScrollView; Text: [分享, 收藏, 价格 : ..., 运费 : ..., 更多服务、优惠、活动信息, 店铺信息, 描述相符, 高, 0.0%, 服务态度, 高, 0.0%, 发货速度, 高, 0.0%, 联系我, 进微淘, 进店铺]; ContentDescription: null; ItemCount: 5; CurrentItemIndex: 3; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: 0; ScrollY: 0; MaxScrollX: 0; MaxScrollY: 277; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:05.850 EventType: TYPE_WINDOW_STATE_CHANGED; EventTime: 62102329; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: com.taobao.tao.detail.DetailActivity; Text: [淘宝]; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: true; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:05.855 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62102331; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:05.996 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62102476; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:06.224 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62102704; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:06.341 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62102820; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:06.488 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62102967; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:07.331 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62103811; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:07.404 EventType: TYPE_VIEW_SCROLLED; EventTime: 62103883; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 25; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: 0; ToIndex: 4; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:07.410 EventType: TYPE_VIEW_SCROLLED; EventTime: 62103888; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 0; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: 0; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:07.459 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62103939; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:07.578 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62104058; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:07.744 EventType: TYPE_VIEW_SCROLLED; EventTime: 62104223; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.ListView; Text: []; ContentDescription: null; ItemCount: 25; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: 0; ToIndex: 1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:07.745 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62104224; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:15.978 EventType: TYPE_NOTIFICATION_STATE_CHANGED; EventTime: 62112449; PackageName: com.tencent.qqpimsecure; MovementGranularity: 0; Action: 0 [ ClassName: android.app.Notification; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: false; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: Notification(pri=0 contentView=com.tencent.qqpimsecure/0x7f030019 vibrate=null sound=null defaults=0x0 flags=0x2 kind=[null]) ]; recordCount: 0

12-15 11:38:21.134 EventType: TYPE_VIEW_CLICKED; EventTime: 62117606; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.Button; Text: [加入购物车]; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:21.157 EventType: TYPE_NOTIFICATION_STATE_CHANGED; EventTime: 62117637; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.Toast$TN; Text: [请先选择商品属性。]; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: false; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:21.559 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62118039; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:21.645 EventType: TYPE_VIEW_SCROLLED; EventTime: 62118124; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.RelativeLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:21.780 EventType: TYPE_VIEW_SCROLLED; EventTime: 62118259; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.RelativeLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:21.923 EventType: TYPE_VIEW_SCROLLED; EventTime: 62118401; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.RelativeLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:22.099 EventType: TYPE_VIEW_SCROLLED; EventTime: 62118576; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.RelativeLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:23.042 EventType: TYPE_VIEW_CLICKED; EventTime: 62119514; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

12-15 11:38:23.205 EventType: TYPE_WINDOW_CONTENT_CHANGED; EventTime: 62119684; PackageName: com.taobao.taobao; MovementGranularity: 0; Action: 0 [ ClassName: android.widget.FrameLayout; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0


录制回放的方法大概了解了下.一般实现原理有:
1.基于坐标的实现,monkeyrunner 为主要代表.通过截屏获取屏幕,进行缩放解析动作点,monkeyrunner 使用的截图方法效率较低,对于 root 的手机可以使用类似 gsnap 之类的截图模式进行改进,另外采用的 python 脚本,对于 java 开发的 android 额外增加了语言复杂度.还有不同的手机设备响应时间不固定,导致脚本可执行行也较差.但是可以跨 app 录制.
2.利用 asjectJ 来进行录制的.通过对 class 文件的 weaving,来监控类似的 onClick 等事件并进行记录,对于有源代码的 app 较容易实现,编译 apk 时进行 weaving 即可.只有 apk 的模式,需要反汇编出 jar,再对 jar 进行 weaving 再编译回 apk 实现,对于无法反编译出 jar 的,就无法使用了.真针对单一的 app.
3.通过 getevent 获取事件信息解析的.通过解析事件类型,可以监控手机全部操作,也可以跨 app.实现形式也是解析成坐标点,是另一种获取坐标点的方式.
4.通过修改事件处理的 baidu cafe,拦截所有的事件,添加日志记录.
5.还有看到的资料说 JDPA 监听 VM stackframe 解析的

#3 楼 @seveniruby uiautomator events 这些信息可不可以不链接数据线获取这些信息?

@seveniruby 不知道楼主进展的怎么样了?

这两天试图用 AccessibilityService 去捕捉 event, 可以用 getSource() 得到控件坐标变化,text 等信息,目测可以实现 click drag 和输入 这些操作

但是好像检测不到 menu home back。。。 求解惑

@seveniruby 在 AccessibilityService 里面找到方法 onKeyEvent 可以拿到 menu 这些

不过 api 需要 4.3。。。 只能自己写着玩了

#4 楼 @bobotiger 分析的不错, asjectJ 是个很好的路, 适合企业, 更通用的方法也有, 没有源码没关系, 其实可以注入代码到 dalvik

#5 楼 @michailclj 可以有, 有 wifi 模式

#7 楼 @strayhrt 高版本上录制, 然后生成低版本的自动化代码即可.

问下楼主,通过 uiautomator 获得当前所有可见 UI 的 (x,y,w,h), 这个怎么获取? 是通过 uiautomator dump 吗? dump 的速度太慢了,根本来不及解析啊。

#11 楼 @heavennash 解析快,dump 慢

你好,你现在有很好的方案吗。

#4 楼 @bobotiger getevent 获取的是事件的片段, 你有办法将之解析成 input text/tap ... 相关的方案吗?

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