51Testing软件测试论坛

标题: Macaca App Inspector 原理解析 [打印本页]

作者: 草帽路飞UU    时间: 2017-6-20 10:50
标题: Macaca App Inspector 原理解析
Macaca 提供元素查看器(app-inspector),能够查看 iOS 和 Android 应用的元素属性值,如 name, id, XPath 等。

app-inspector 有如上几个组成部分,分别介绍主要用途:
设计原则
开放和标准化是贯穿 Macaca 整体的理念,可以看到能够 web 化的工具都是使用 web 实现的。
实现原理处理渲染
app-inspector 用户端分三部分,中间的部分用来将界面 Hierarchy 渲染为树形组件。当操作中间的树控件时,将节点的信息同时展示在右侧,同时将节点携带的 width 和 height 坐标等渲染在左侧,高亮显示。
处理事件
  1. export function boundsSize(bounds) {
  2.   const [
  3.     x,
  4.     y,
  5.     width,
  6.     height
  7.   ] = bounds;
  8.   return width * height;
  9. };
  10. export function compareBoundsSize(rectA, rectB) {
  11.   return boundsSize(rectA) > boundsSize(rectB);
  12. };
  13. export function isInRect(x, y, bounds) {
  14.   const [
  15.     _x,
  16.     _y,
  17.     width,
  18.     height
  19.   ] = bounds;
  20.   return x >= _x
  21.     && x <= _x + width
  22.     && y >= _y
  23.     && y <= _y + height;
  24. };
复制代码
当操作左侧屏幕展示区时,通过后序遍历的方式查找到用户端操作到的区域,然后将后面的遍历操作都终结掉,同时高亮当前区域。
  1. export function getNodePathByXY(tree, isIOS, x, y) {
  2.   let bestBounds = null;
  3.   let bestPath = null;
  4.   function walk(node, path) {
  5.     let bounds = node.bounds;
  6.     let inRect = isInRect(x, y, bounds);
  7.     if (inRect) {
  8.       if (!bestBounds || compareBoundsSize(bestBounds, bounds)) {
  9.         bestBounds = bounds;
  10.         bestPath = path;
  11.       }
  12.       if (node.nodes) {
  13.         node.nodes.forEach((child, index) => {
  14.           walk(child, path.concat([index]));
  15.         });
  16.       }
  17.     }
  18.   }
  19.   walk(tree, []);
  20.   return bestPath;
  21. };
复制代码
处理 XPath如何应对 WebviewMacaca app-inspector 弥补了社区 Native 元素查看器的空白,Webview 又如何处理?
不建议将 Webview 透出到 Native 元素上来当做 Native 元素处理,虽然 Android 能够这样实现,因为毕竟是已经标准化运行时的 View,暂时没法与 Naitve 等同看待。
由于历史渊源,Android 还是 iOS 中提供的 Webview 底层都支持 WebKit 远程调试协议的,协议的统一是 Web 调试工作的福音,借助现有的 devtools 工具就能够完成 inspector 的功能。
$ ios_webkit_debug_proxy -f chrome-devtools://devtools/bundled/inspector.html或打开 chrome://inspect/#devices 浏览器调试界面就可以找到 Webview 的页面了。



欢迎讨论,互相学习。


作者: 乐哈哈yoyo    时间: 2017-6-20 10:54
分析的很透彻,通俗易懂!
作者: 草帽路飞UU    时间: 2017-6-20 10:55
乐哈哈yoyo 发表于 2017-6-20 10:54
分析的很透彻,通俗易懂!

谢谢支持
作者: jingzizx    时间: 2017-6-20 13:10

作者: 岛屿soliloquy    时间: 2017-6-21 15:15
先进来占个坑。
晚点学习……
谢谢版主的资料了……
分享的可以哦……




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2