测试之家
  • 社区
  • 问答
  • 招聘
  • 社区学堂新
  • 开源项目
  • 活动
  • Wiki
  • 注册
  • 登录
版主
zsx10110 (saii)
第 2269 位会员 / 2015-01-06
cvte
16 篇帖子 • 309 条回帖
149 关注者
638 正在关注
97 收藏
做好测试 ..
打赏支持
未设置 GitHub 信息.
  • 个人信息
  • 专栏
  • 话题
  • 回帖
  • 收藏
  • 关注中
  • 关注者
  • TesterHome 官方 Android 客户端 V1.0.3 版本发布 at 2016年02月26日

    V1.0.3 版本已更新
    1.修复多个崩溃问题
    2.修改个人中心 UI
    3.增加夜间模式

  • 在线录制脚本功能来袭,麻麻再也不用担心我写脚本了 at 2016年02月26日

    看上去很不错,等试用看看

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

  • [站务] TesterHome 2015年 分红发放通知 at 2016年02月22日

    收到。。。
    感谢 testerhome 2016 继续努力。

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

  • [已解决] Appium 测试 app 引导页滑屏,报错 An unknown server-side error occurred while processing the command. at 2016年02月18日

    #7 楼 @blue_momo2009 我遇到一样的错误是当时前面一个操作完以后立马 swipe 出问题的,解决方法就是加大 sleep 的时间

  • [广州] CVTE - 招聘 测试工程师 at 2016年02月17日

    #2 楼 @monkey 认真学习了下。 哈

  • appium 的 move_to 相对坐标?绝对坐标? at 2016年02月17日

    #6 楼 @spiritzl https://testerhome.com/topics/1809 看看这篇文章 里面有手势解锁。

  • appium 的 move_to 相对坐标?绝对坐标? at 2016年02月16日

    我来具体解释下,可能说明的不太清楚,因为主要这里的逻辑都是 Appium server 进行处理的。我对 node.js 不太懂,今晚勉勉强强调试了好久。。。
    首先先看第一个

    action.press(x=252, y=879).wait(10000).move_to(x=540, y=879).release().perform()
    

    我们首先分析 Server 的 log,显示的是

    POST /wd/hubssion/063350c4-bd8c-4a7c-ac0c-96e35075f1d2/touch/perform {"sessionId":"063350c4-bd8c-4a7c-ac0c-96e35075f1d2","actions":[{"action":"press","options":{"y":879,"x":252}},{"action":"wait","options":{"ms":10000}},{"action":"moveTo","options":{"y":879,"x":540}},{"action":"release","options":{}}]}
    
    

    我们首先看 controller.js 312

    这里 Server 会解析出一个 gestures 的数组里面包含了前面的 4 个 action。

    if (gestures.length === 4 &&
          gestures[0].action === 'press' &&
          gestures[1].action === 'wait' &&
          gestures[2].action === 'moveTo' &&
          gestures[3].action === 'release') {
          return exports.mobileSwipe(req, res, gestures);
      }
    

    上面这个代码就可以看出 我们的脚本直接转换成了 swipe 的操作了。下来看看 swipe 的操作 497 行

    var touchCount = req.body.touchCount || 1
       , startX =  getCoordDefault(gestures[0].options.x)
       , startY = getCoordDefault(gestures[0].options.y)
       , endX = getCoordDefault(gestures[2].options.x)
       , endY = getCoordDefault(gestures[2].options.y)
       , duration = _getSwipeTouchDuration(gestures[1])
       , element = gestures[0].options.element
       , destElement = gestures[2].options.element || gestures[0].options.element;
    

    这里就能够看出操作的是绝对坐标

    那再来我们看看第二个。
    还是一样 看看 Server 的输出吧

    {"sessionId":"dfc437da-3ad5-49c1-8944-ed408fbbb73c","actions":[{"action":"press","options":{"y":879,"x":252}},{"action":"moveTo","options":{"y":879,"x":540}},{"action":"wait","options":{"ms":10000}},{"action":"release","options":{}}]}
    
    

    因为这个顺序是不满足 swipe 的所以直接走的是
    android-controller.js 中的 865 行 performTouch

    这边 Server 的大体流程是会先将所有的命令,action 都解析然后逐个进行操作。

    performTouch 中会执行下面的 parseTouch

    // fix release action then perform all actions
       fixRelease(function (err) {
         if (err) return cb(err);
         this.parseTouch(gestures, false, function (err, fixedGestures) {
           if (err) return cb(err);
           async.eachSeries(fixedGestures, performGesture, cb);
         });
       }.bind(this));
    

    所以我们还得看下 parseTouch 做了什么。

    这里的代码很长我就不贴出来了,这里还是前面说的解析命令 将每个 action 的命令解析结果都存储在 touchStateObjects 这个数组里面。

    touchStateObjects.push(touchStateObject);

    之后就是遍历这个数组,逐个执行了。

     var prevPos = null,
    _.each(touchStateObjects, function (state) {
          if (typeof state.options.x === 'undefined' && typeof state.options.x === 'undefined') {
            // this happens with wait
            state.options.x = prevPos.x;
            state.options.y = prevPos.y;
          }
          if (state.options.offset && prevPos) {
            // the current position is an offset
            state.options.x += prevPos.x;
            state.options.y += prevPos.y;
          }
          delete state.options.offset;
          prevPos = state.options;
    
          ....
        });
    

    仔细看看就能够知道,首先执行 press 操作,这个时候的 prevPos 是为 null 的 所以 x,y 坐标不会改变,接着会执行 prevPos = state.options,所以到下一个 moveTo 的时候 就会执行到

    state.options.x += prevPos.x;
    state.options.y += prevPos.y;
    

    所以 MoveTo 的坐标就变成了 x=792.0, y=1758.0
    所以就会出现 Server 的 log 如下

    Returning result: {"value":"Coordinate [x=792.0, y=1758.0] is outside of element rect: [0,0][768,1184]","status":29}
    

    出现越界的情况了。

    以上就是我分析的大概情况了。可能有点不太正确。

  • Android 过度绘制简单分析 at 2016年02月15日

    #13 楼 @isobel 哦! 我的意思就是说在 recyclerview 中出现红色就说明不正常的现象,存在过度绘制。

  • Android 过度绘制简单分析 at 2016年02月15日

    #11 楼 @isobel 哪里显示红色,不太明白?

  • Android 过度绘制简单分析 at 2016年02月14日

    #9 楼 @chenhengjie123 嗯 是的,我把原文的链接也替换一下吧。 谢

  • 手机应用 UI 自动化测试常见问题总结 at 2016年02月04日

    很不错,赞一个

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

  • 测试与开发的对立?唯技术论?这条路真的对么??? at 2016年02月04日

    看到图里面的技术那段。感觉真的深深的戳中部分当测试的泪点了

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

  • appium 关于 rotate (ScreenOrientation orientation) 方法实现横竖屏切换的问题 at 2016年02月01日

    #3 楼 @qq329999897 ctrl+ 鼠标右键先进到 rotate 的方法,再来看到 ScreenOrientaion 还是一样的方法就看到它了。

  • appium 关于 rotate (ScreenOrientation orientation) 方法实现横竖屏切换的问题 at 2016年02月01日
    public enum ScreenOrientation {
      LANDSCAPE("landscape"),
      PORTRAIT("portrait");
    
      private final String value;
    
      private ScreenOrientation(String value) {
        this.value = value;
      }
    
      public String value() {
        return value;
      }
    }
    

    你看下 ScreenOrientation 就知道来 这个是个枚举类,你应该是使用

    rotate(ScreenOrientaion.LANDSCAPE)
    

    更简单的判断 你看参数就知道明显要求传的不是一个字符串不是吗?

  • Appium 启动报 java -version failed at 2016年01月29日

    试试运行 appium-doctor 看看环境有没有问题

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

  • Android 过度绘制简单分析 at 2016年01月28日

    #6 楼 @m13890 找熟悉的开发,跟他谈谈,推动问题解决。

  • fir.im Weekly - 深度揭秘 App 启动全过程 at 2016年01月26日

    gt 开源 真是个喜大普奔的事情,虽然代码开不太懂。

  • UiAutomator 不能识别到的元素,如何定位该元素 at 2016年01月25日

    #15 楼 @alisawu

    The problem exists in the platform software, so only newer platform has fix for it. I believe the fix was in Android 5.1 Lollipop MR1.

  • UiAutomator 不能识别到的元素,如何定位该元素 at 2016年01月20日

    #10 楼 @alisawu https://code.google.com/p/android/issues/detail?id=115418 看看这个 issue 5.0 是存在问题的。

  • 微信应用里面的混合应用怎么定位元素或切换到 web view 里面去? at 2016年01月17日

    #4 楼 @testerway 貌似是不行的。不过你如果你的公众号如果没有限制浏览器打开的话,还是可以尝试下用浏览器打开对应的连接来测试的。

  • 利用 shell 装饰一下我的 Linux 云主机~~~~ at 2016年01月12日

    有意思 赞

  • Robotium 只有 apk 的情况下如何能在 android studio 中创建测试项目? at 2016年01月09日

    http://mp.weixin.qq.com/s?__biz=MzAwNTI4NzIxMQ==&mid=401400876&idx=1&sn=1edda6b21869be5a7e6e95b17ee5aed0&scene=4#wechat_redirect
    看下这个。刚看到的

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

  • 上一页
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 下一页
  • 关于 / 活跃用户 / 中国移动互联网测试技术大会 / 反馈 / Github / API / 帮助推广
    TesterHome社区,测试之家,由众多测试工程师组织和维护的技术社区,致力于帮助新人成长,提高测试地位,推进质量发展。Inspired by RubyChina
    友情链接 WeTest腾讯质量开放平台 / InfoQ / 掘金 / SegmentFault / 测试窝 / 百度测试吧 / IT大咖说
    简体中文 / 正體中文 / English

    ©testerhome.com 测试之家   渝ICP备2022001292号
      渝公网安备 50022202000435号    版权所有 © 重庆年云聚力信息技术有限公司