Macaca 基于 录制脚本 的 nodejs 模型 对象拖拽方法

孟德 · 2017年04月20日 · 最后由 孟德 回复于 2017年04月21日 · 2779 次阅读

最近学习 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});
};


共收到 1 条回复 时间 点赞

通过写这个方法 ,对 Promise 有些理解了!

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