Appium Server 源码分析 (二) - main 方法

news/2025/2/12 19:36:09

上一节 Appium Server 源码分析 (一) 中我们大体讲了,appium server在正确运行前做的一些判断,下来我们正式看看main 方法

在看main方法之前我们可以得看看main.js引用的那一大堆第三方的模块的主要作用是什么。

变量模块作用
httphttphttp模块
expressexpressappium server 采用的是express的web框架
faviconserve-favicon网页图标模块
bodyParserbody-parserexpress项目中参数解析
methodOverridemethod-override重写http请求的一些方法
morganmorganlogger(记录器),在控制台中显示req请求的信息
routing./routing.jsappium的路由表,就是指明了每一个请求过来时,应该要如何处理
appiumpathnodejs 处理目录的对象
http../appium.js存储配置信息,以及服务端的对象,另外还有设备的判断处理
parserWrap./middleware看了大体的代码应该是对python的客户端做了特殊的处理
appiumVer../../package.jsonappium的版本
appiumRevnull
asyncasync流程控制工具包,解决地狱式回调的问题,很强大的工具
helpers./helpers.js本地的一个帮助模块
logFinalWarning./helpers.js处理使用了将要废弃的api的警告,给出提示信息
getConfig./helpers.js获取appium的配置信息
allowCrossDomain./helpers.js对于请求头的安全校验,对于匹配的请求头才返回200
catchAllHandler./helpers.js500的异常处理
checkArgs./helpers.jsappium 参数配置的检查
configureServer./helpers.jsappium server的配置检查(暂时没看懂)
startListening./helpers.js启动http server 监听对应的端口
conditionallyPreLaunch./helpers.jsappium的预创建模式(没懂)
prepareTmpDir./helpers.js创建一个tmp目录
requestStartLoggingFormat./helpers.js格式化log,使用colors插件
requestEndLoggingFormat./helpers.js同上
domainMiddleware./helpers.js没懂

好了,下来正式看看我们的主角吧。

var nodeVer = Number(process.version.match(/^v(\d+\.\d+)/)[1]);if (nodeVer < 0.10) {logger.error("Appium requires Node >= 0.10");process.exit(1);}if (nodeVer < 0.12) {logger.warn("Appium support for versions of node < 0.12 has been " +"deprecated and will be removed in a future version. Please " +"upgrade!");}

判断nodejs的版本如果是小于0.10版本则直接退出,若小于0.12版本则给出相应的警告。

var rest = express(), server = http.createServer(rest);rest.use(domainMiddleware());rest.use(morgan(function (tokens, req, res) {// morgan output is redirected straight to winstonlogger.info(requestEndLoggingFormat(tokens, req, res),(res.jsonResp || '').grey);}));rest.use(favicon(path.join(__dirname, 'static/favicon.ico')));rest.use(express.static(path.join(__dirname, 'static')));rest.use(allowCrossDomain);rest.use(parserWrap);rest.use(bodyParser.urlencoded({extended: true}));// 8/18/14: body-parser requires that we supply the limit field to ensure the server can// handle requests large enough for Appium's use cases. Neither Node nor HTTP spec defines a max// request size, so any hard-coded request-size limit is arbitrary. Units are in bytes (ie "gb" == "GB",// not "Gb"). Using 1GB because..., well because it's arbitrary and 1GB is sufficiently large for 99.99%// of testing scenarios while still providing an upperbounds to reduce the odds of squirrelliness.rest.use(bodyParser.json({limit: '1gb'}));rest.use(morgan(function (tokens, req, res) {// morgan output is redirected straight to winstonvar data = '';try {if (req.body) data = JSON.stringify(req.body).substring(0, 1000);} catch (ign) {}logger.info(requestStartLoggingFormat(tokens, req, res), data.grey);}, {immediate: true}));rest.use(methodOverride());// Instantiate the appium instancevar appiumServer = appium(args);// Hook up REST http interfaceappiumServer.attachTo(rest);routing(appiumServer);rest.use(catchAllHandler);

创建express的http服务,并通过rest.use加载一系列的中间件,这些中间件的作用在前面的表格里其实已经大部分都说明了,并且在这中间件中还在夹带着初始化了一个appiumServer。实际上appiumServer就是一个附带着参数配置以及http服务的对象

async.series([function (cb) {configureServer(getConfig(), appiumVer, appiumServer, function (err, rev) {if (err) return cb(err);appiumRev = rev;cb();});},function (cb) {prepareTmpDir(args, cb);},function (cb) {conditionallyPreLaunch(args, appiumServer, cb);},function (cb) {startListening(server, args, parser, appiumVer, appiumRev, appiumServer, cb);}], function (err) {if (err) {process.exit(1);} else if (typeof readyCb === "function") {readyCb(appiumServer);}});server.on('close', function () {logFinalWarning();doneCb();});

最后是一系列的同步操作async.series是顺序执行,最后添加close事件,关闭服务的时候,会调用设置好的回调函数。


https://dhexx.cn/news/show-4010549.html

相关文章

Linux下JProfiler 9安装部署及使用

JProfiler[1] 是一个商业授权的Java剖析工具&#xff0c;由EJ技术有限公司&#xff0c;针对的Java EE和Java SE应用程序开发的。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler的是一个独立的应用程序&#x…

结合testng实现用例失败重跑

我们在运行自动化测试用例的时候&#xff0c;经常会出现一些异常的情况的情况导致用例失败的问题。所以我们可能会希望对于失败的测试用例再重新运行一次&#xff0c;下来我们来看看结合testng如何使用这个功能 你需要在你的项目中添加如下两个类 Retry.java import org.test…

Spring-Boot原理及应用布署

一、Spring Boot的理念 从最根本上来讲&#xff0c;Spring Boot就是一些库的集合&#xff0c;它能够被任意项目的构建系统所使用。简便起见&#xff0c;该框架也提供了命令行界面&#xff0c;它可以用来运行和测试Boot应用。框架的发布版本&#xff0c;包括集成的CLI&#xff0…

Appium Server 源码分析 (三) - 路由及控制器

上一篇文章 Appium Server 源码分析 (二) - main 方法 中我们讲了appium的运行。下来我们得讲讲appium Server的路由以及它的控制器 其实路由这块没有什么需要详细说明的&#xff0c;我们只要理解路由这个概念就行了&#xff0c;可以想象成当你访问任意一个页面的时候&#xf…

Python学习笔记__12.5章 hashlib

# 这是学习廖雪峰老师python教程的学习笔记1、概览Python的hashlib提供了常见的摘要算法&#xff0c;如MD5&#xff0c;SHA1等等。摘要算法又称哈希算法、散列算法。它通过一个函数&#xff0c;把任意长度的数据转换为一个长度固定的数据串&#xff08;通常用16进制的字符串表示…

testng + reportng 测试结果邮件发送

其实大多数的时候我们的测试报告的发送可能都是结合Jenkins发送的&#xff0c;所以这方面更多的都是依赖于它&#xff0c;可是如果有的时候我们不需要Jenkins的时候&#xff0c;我们应该如何去处理这部分的内容呢 项目情况 由于我们使用的是maven&#xff0c;所以我们主要来看…

javascript Web-API(选讲)详解及面试相关

一、DOM本质 浏览器把拿到的html代码&#xff0c;结构化一个浏览器能识别并且js可操作的一个模型而已。 二、Ajax 2.1 XMLHttpRequest 2.2 状态码说明 readyState 0-(未初始化)还没有调用send()方法 1-(载入)已调用send()方法&#xff0c;正在发送请求 2-(载入)send()方法执行…

21045234黄斐《java程序设计》第四周

教材学习内容总结 第六章部分 - 继承与多态 何谓继承 继承面向对象中&#xff0c;子类继承父类&#xff0c;避免重复的行为定义。一般来说&#xff0c;父类的父类也称父类&#xff0c;且同一个子类只允许拥有一个父类&#xff0c;而同一个父类则可以拥有多个子类。继承的出现提…

Sikuli 结合selenium的一些使用

其实很多人在使用selenium 做自动化的时候都会遇到这样子的一个问题&#xff0c;就是要进行文件的上传。对于简单一些的元素 如 这种可能可以通过直接的sendkey进行赋值&#xff0c;但是对于flash的这种 selenium就无能为力了。并且还得操作windows的文件上传框。 其实这个解决…

zabbix用户密码修改

zabbix完装完成默认用户名为admin用户密码修改方法为use zabbix;desc users;select alias,passwd from users;select *from zabbix.users where aliasadminupdate zabbix.users set passwdmd5(zabbix) where userid1;update zabbix.users set aliaszabbix where userid1;转载于…