V1.0.3 版本已更新
1.修复多个崩溃问题
2.修改个人中心 UI
3.增加夜间模式
看上去很不错,等试用看看
—— 来自 TesterHome 官方 安卓客户端
收到。。。
感谢 testerhome 2016 继续努力。
—— 来自 TesterHome 官方 安卓客户端
#7 楼 @blue_momo2009 我遇到一样的错误是当时前面一个操作完以后立马 swipe 出问题的,解决方法就是加大 sleep 的时间
#6 楼 @spiritzl https://testerhome.com/topics/1809 看看这篇文章 里面有手势解锁。
我来具体解释下,可能说明的不太清楚,因为主要这里的逻辑都是 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}
出现越界的情况了。
以上就是我分析的大概情况了。可能有点不太正确。
#9 楼 @chenhengjie123 嗯 是的,我把原文的链接也替换一下吧。 谢
很不错,赞一个
—— 来自 TesterHome 官方 安卓客户端
看到图里面的技术那段。感觉真的深深的戳中部分当测试的泪点了
—— 来自 TesterHome 官方 安卓客户端
#3 楼 @qq329999897 ctrl+ 鼠标右键先进到 rotate 的方法,再来看到 ScreenOrientaion 还是一样的方法就看到它了。
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-doctor 看看环境有没有问题
—— 来自 TesterHome 官方 安卓客户端
gt 开源 真是个喜大普奔的事情,虽然代码开不太懂。
#10 楼 @alisawu https://code.google.com/p/android/issues/detail?id=115418 看看这个 issue 5.0 是存在问题的。
#4 楼 @testerway 貌似是不行的。不过你如果你的公众号如果没有限制浏览器打开的话,还是可以尝试下用浏览器打开对应的连接来测试的。
有意思 赞