手机自动化测试:Appium源码分析之跟踪代码分析五

 

手机自动化测试是未来很重要的测试技术,作为一名测试人员应该熟练掌握,POPTEST举行手机自动化测试的课程,希望可以训练出优秀的手机测试开发工程师。

queue

我们先了解一下事件的集中处理方式,参考文章。从这篇文章可以知道,nodejs提供了一个Async库,该库就是用来处理事件的。里面就有这一个queue。 
在上一篇文章我们讲到了initQueue,我们这次再来看看:

Android.prototype.initQueue = function () {

this.queue = async.queue(function (task, cb) {

var action = task.action,

params = task.params;

this.cbForCurrentCmd = cb;

if (this.adb && !this.shuttingDown) {

this.uiautomator.sendAction(action, params, function (response) {

this.cbForCurrentCmd = null;

if (typeof cb === 'function') {

this.respond(response, cb);

}

}.bind(this));

} else {

this.cbForCurrentCmd = null;

var msg = "Tried to send command to non-existent Android device, " +

"maybe it shut down?";

if (this.shuttingDown) {

msg = "We're in the middle of shutting down the Android device, " +

"so your request won't be executed. Sorry!";

}

this.respond({

status: status.codes.UnknownError.code

, value: msg

}, cb);

}

}.bind(this), 1);

};

Async库中queue的定义一般如下所示:

var q = async.queue(function(task, callback) {

log(‘worker is processing task: ‘, task.name);

task.run(callback);

}, 1);

上面定义了一个工作线程为1的队列。当队列正在处理事件时,其他事件就一直等待。所以当我们使用queue的push方法时,queue会自己唤起然后执行,如果正在执行,push添加进来的事件会等到下一次执行。

uiautomator.sendAction

上面的请求,最终调用的是devices/android/uiautomator的sendAction的方法:

UiAutomator.prototype.sendAction = function (action, params, cb) {

if (typeof params === "function") {

cb = params;

params = {};

}

var extra = {action: action, params: params};

this.sendCommand('action', extra, cb);

};

然后转向sendCommand方法

uiautomator.sendCommand

UiAutomator.prototype.sendCommand = function (type, extra, cb) {

if (this.cmdCb !== null) {

logger.warn("Trying to run a command when one is already in progress. " +

"Will spin a bit and try again");

var start = Date.now();

var timeoutMs = 10000;

var intMs = 200;

var waitForCmdCbNull = function () {

if (this.cmdCb === null) {

this.sendCommand(type, extra, cb);

} else if ((Date.now() - start) < timeoutMs) {

setTimeout(waitForCmdCbNull, intMs);

} else {

cb(new Error("Never became able to push strings since a command " +

"was in process"));

}

}.bind(this);

waitForCmdCbNull();

} else if (this.socketClient) {

this.resendLastCommand = function () {

this.sendCommand(type, extra, cb);

}.bind(this);

if (typeof extra === "undefined" || extra === null) {

extra = {};

}

var cmd = {cmd: type};

cmd = _.extend(cmd, extra);

var cmdJson = JSON.stringify(cmd) + "\n";

this.cmdCb = cb;

var logCmd = cmdJson.trim();

if (logCmd.length > 1000) {

logCmd = logCmd.substr(0, 1000) + "...";

}

this.debug("Sending command to android: " + logCmd);

this.socketClient.write(cmdJson);

} else {

cb({

status: status.codes.UnknownError.code

, value: "Tried to send command to non-existent Android socket, " +

"maybe it's shutting down?"

});

}

};

最终会向设备端的socket发送一条命令,关于设备端接受命令以及如何处理,请查看我之前写的关于appium中bootstrap源码分析相关文章

手机自动化测试:Appium源码分析之跟踪代码分析五的更多相关文章

  1. 手机自动化测试:Appium源码分析之跟踪代码分析九

    手机自动化测试:Appium源码分析之跟踪代码分析九   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...

  2. 手机自动化测试:Appium源码分析之跟踪代码分析八

    手机自动化测试:Appium源码分析之跟踪代码分析八   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...

  3. 手机自动化测试:Appium源码分析之跟踪代码分析七

    手机自动化测试:Appium源码分析之跟踪代码分析七   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...

  4. 手机自动化测试:Appium源码分析之跟踪代码分析六

    手机自动化测试:Appium源码分析之跟踪代码分析六   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...

  5. 手机自动化测试:appium源码分析之bootstrap三

    手机自动化测试:appium源码分析之bootstrap三   研究bootstrap源码,我们可以通过代码的结构,可以看出来appium的扩展思路和实现方式,从中可以添加我们自己要的功能,针对app ...

  6. 手机自动化测试:appium源码分析之bootstrap二

    手机自动化测试:appium源码分析之bootstrap二   在bootstrap项目中的io.appium.android.bootstrap.handler包中的类都是对应的指令类, priva ...

  7. 手机自动化测试:appium源码分析之bootstrap一

    手机自动化测试:appium源码分析之bootstrap一   前言: poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.popte ...

  8. 手机自动化测试:appium源码分析之bootstrap十七

    手机自动化测试:appium源码分析之bootstrap十七   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

  9. 手机自动化测试:appium源码分析之bootstrap十六

    手机自动化测试:appium源码分析之bootstrap十六   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

随机推荐

  1. UE4中的单映射:TMap容器

    一.TMap<T>是么 TMap<T>是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系.因此你可以通过键名来快速查找到值.此外,单映射要求每个键都是唯一的.类似 ...

  2. 继BAT之后 第四大巨头是谁

    中国互联网三大巨头的位置,毫无疑问是属于百度腾讯阿里的,但在它们之后,哪家公司能进巨头之列?京东布局不错,走亚马逊路线:360同时占据传统和移动互联网两大领域入口:小米软硬整合,生态系统完整. 很多人 ...

  3. logistic回归和probit回归预测公司被ST的概率(应用)

    1.适合阅读人群: 知道以下知识点:盒状图.假设检验.逻辑回归的理论.probit的理论.看过回归分析,了解AIC和BIC判别准则.能自己跑R语言程序 2.本文目的:用R语言演示一个相对完整的逻辑回归 ...

  4. redis安装(针对2.8以上版本)

    1. 下载安装包 http://redis.io/ 2. 下载tcl/tck http://124.202.164.12/files/41060000061B56BD/downloads.source ...

  5. CentOS7.0安装Nginx

    安装Nginx yum install nginx 正常情况下必定是: 已加载插件:fastestmirror, langpacks base | :: docker-main | :: extras ...

  6. Delphi中TApplication详解

    转自:http://blog.sina.com.cn/s/blog_4d6f55d90100bmv9.html TApplication是用于Delphi应用程序的类型,该类在单元forms中声明.T ...

  7. 第十三篇 一个安装、管理windows服务的桌面程序

    在网上看到一个修改程序入口的程序去把windows 服务修改成控制台的程序,然后利用控制台的程序把服务安装和管理,也想起自己原来也写了一个对windows 报务管理的程序,不过是winform的.   ...

  8. 读阮一峰对《javascript语言精粹》的笔记,我有疑问。

    <javascript语言精粹>是一本很棒的书籍,其中作者在附录列出了12种他所认为的javascript语言中的糟粕. 我最近开始跟读前端前辈的博客,其中读到了阮一峰的<12种不宜 ...

  9. nginx配置之深入理解

    继上一篇<debian+nginx配置初探--php环境.反向代理和负载均衡>成功之后,有点小兴奋,终于不用整lvs那么复杂来搞定负载,但还是有很多概念没弄清楚. 什么是CGI.FastC ...

  10. how to use Prolog in C#? SWI-Prolog

    上个月突然看到Prolog这门语言,它特殊的语法吸引了我,但是经过我一段时间的学习,发现它也不像网络上传说的那样神奇,不过我依然对它很感兴趣,有前辈说Prolog本身并不强大,但是用来作为一门辅助语言 ...