最近学习 nodejs 想用 macaca 录制生成的脚本,构造一套能够快速固化录制用例的模型,碰到不少问题,现分享一部分,并希望有大神能指点一下!
方法代码如下: 其实是参考 https://testerhome.com/topics/7658 的!
再次改造了一下,终于将 移动距离 乘了一个变量 times;学习了一下 yield 的使用!
再次修改 解决 连续两次调用 报错问题!
/*
*等待 对象的出现 ,向指定 方向 拖拽
* @param androidElem 安卓对应的元素对象的获取方式 及 值
* @param iosElem ios对应的元素对象的获取方式 及 值
* @param elementDesc 控件描述文案
* @param waitTime 等待元素对象刷新的 等待时间
* @param type 滑动的方向 'up'、down'、'right'、'left'
* @param index 元素的位标 从 0 开始
* @param times 移动距离(宽或高)的倍数,默认1
*/
exports.waitElemAndSwipe = function (parameter,type,index,times){
var androidElem = parameter.androidElem;
var iosElem = parameter.iosElem?parameter.iosElem:parameter.androidElem; //如果没有传ios的默认使用Android的
var elementDesc = parameter.elementDesc;
var waitTime = parameter.waitTime?parameter.waitTime:5000;
var index = index || 0;
var times = times || 1;
var type = type || 'up';
it('将第 ' + index + ' 个 ' + elementDesc + ' 元素,向' + type + '拖拽' + times + '个自身高度或宽度', function (){
if(platformName === 'Android'){
return driver.wait(androidElem, waitTime).get(index)
.rect()
.then(_get_element_rect)
.then(function(par){
console.log(par);
return _swipeElemByType(par, type, times);
});
}else{
return driver.wait(iosElem, waitTime).get(index)
.rect()
.then(_get_element_rect)
.then(function(par){
console.log(par);
return _swipeElemByType(par, type, times);
});
};
});
};
/*
*等待 对象的出现 ,向指定 方向 拖拽
* @param par 元素的坐标信息
* @param type 滑动的方向 'up'、down'、'right'、'left'
* @param times 元素的位标
*/
function _swipeElemByType(par, type, times){
var times = times || 1;
var type = type || 'up';
switch (type)
{
case 'up': _swipeElemUp(par, times);
break;
case 'down': _swipeElemDown(par, times);
break;
case 'right': _swipeElemRight(par, times);
break;
case 'left': _swipeElemLeft(par, times);
break;
};
};
/*
* 滑屏函数,以元素底部中心坐标,向上拖拽自身的高度
* @param fromX,fromY 起点的x/y坐标
* @param toX,toY 终点的x/y坐标
* @param times 滑动距离是 高度的 times 倍
*/
function _swipeElemUp(par, times){
var times = times || 1;
var fromX = par.x_center;
var fromY = par.y_down;
var toX = par.x_center;
var toY = par.y_down - par.height * times;
_swipe(fromX, fromY, toX, toY);
};
/*
* 滑屏函数,以元素顶部中心坐标,向下拖拽自身的高度
* @param fromX,fromY 起点的x/y坐标
* @param toX,toY 终点的x/y坐标
* @param times 滑动距离是 高度的 times 倍
*/
function _swipeElemDown(par, times){
var times = times || 1;
var fromX = par.x_center;
var fromY = par.y_up;
var toX = par.x_center;
var toY = par.y_up + par.height * times;
_swipe(fromX, fromY, toX, toY);
};
/*
* 滑屏函数,以元素左边中心坐标,向右拖拽自身的宽度
* @param fromX,fromY 起点的x/y坐标
* @param toX,toY 终点的x/y坐标
* @param times 滑动距离是 宽度的 times 倍
*/
function _swipeElemRight(par, times){
var times = times || 1;
var fromX = par.x_left;
var fromY = par.y_center;
var toX = par.x_left + par.width * times;
var toY = par.y_center;
_swipe(fromX, fromY, toX, toY);
};
/*
* 滑屏函数,以元素右边中心坐标,向左拖拽自身的宽度
* @param fromX,fromY 起点的x/y坐标
* @param toX,toY 终点的x/y坐标
* @param times 滑动距离是 宽度的 times 倍
*/
function _swipeElemLeft(par, times){
var times = times || 1;
var fromX = par.x_right;
var fromY = par.y_center;
var toX = par.x_right - par.width * times;
var toY = par.y_center;
_swipe(fromX, fromY, toX, toY);
};
/*
* 获取元素对象的信息,返回坐标信息
* @param element 元素对象
* @return x_center,y_center 元素对象的中心x/y坐标
* @return x_left,y_up 元素对象的左上角x/y坐标
* @return x_right,y_down 元素对象的左右下x/y坐标
*/
function _get_element_rect(rect) {
var x_center,y_center,x_left,y_up,x_right,y_down,width,height;
x_center = rect['x'] + rect['width'] / 2;
y_center = rect['y'] + rect['height'] / 2;
x_left = rect['x'];
y_up = rect['y'];
x_right = rect['x'] + rect['width'];
y_down = rect['y'] + rect['height'];
width = rect['width'];
height = rect['height'];
var par = {
x_center: x_center,
y_center: y_center,
x_left: x_left,
y_up: y_up,
x_right: x_right,
y_down: y_down,
width: width,
height: height
};
return par;
};
/*
* 滑屏函数,从坐标(fromX,fromY) 滑到坐标(toX,toY)
* @param fromX,fromY 起点的x/y坐标
* @param toX,toY 终点的x/y坐标
* @param steps 滑动查找element是通过指定最大滑动次数(默认10次)steps表示滑动的这个距离分为几步完成,数目越少,滑动幅度越大
*/
function _swipe(fromX, fromY, toX, toY, steps){
var steps = steps || 10 ; //默认为 5
driver
.sendActions('drag', {'fromX': fromX, 'fromY': fromY, 'toX': toX, 'toY': toY, 'steps': steps});
};