Appium Server 源码分析(一)

news/2025/2/12 18:47:57

姗姗来迟的 appium Server 的源码学习,其实github上 appium server的版本已经更新到了1.5的版本了,并且代码已经基本上进行重构了。但是还是出于初衷的原因吧,还是好好学些下appium server 1.4的源码,同时也学习一下nodejs吧。

目录结构

这里写图片描述

还是一样 我们首先来看看项目的目录结构吧,首先我们得知道程序的入口是main.js。

分析

再来我们逐一的来看看代码吧。

process.chdir(path.resolve(__dirname, '../..'));

上面这句代码的意思是修改当前的工作目录,从appium/lib/server 路径修改到appium路径下。 这里我们看到process并没有使用require命令进行加载,这个是因为process是一个全局的变量。

process.chdir() //修改工作目录path.resolve(__dirname, '../..') //将参数 to 位置的字符解析到一个绝对路径里。

下来我们再看

if (require.main === module) {args = parser.parseArgs(); // 由parse模块来解析参数,并且将解析到的参数中的noPermsCheck赋值给noPermsCheck,同时初始化Log工厂。noPermsCheck = args.noPermsCheck; logFactory.init(args);
}
require.main === module; //用来判当前的模块是否是直接运行的,例如 foo.js文件通过node foo.js运行的话,那么会返回true,而如果通过require('./foo'),将会返回false.
if (!noPermsCheck) {var appiumPermStat = fs.statSync(path.resolve(__dirname,'../../package.json'));var launchCmd = (process.env.SUDO_COMMAND || "").toLowerCase();var isWindows = require('appium-support').system.isWindows();if (!isWindows &&// Appium should be run by user who owns files in Appium installation directoryappiumPermStat.uid !== process.getuid() &&// authorize* commands could be run using sudo!launchCmd.match(/authorize/)) {logger.error("Appium will not work if used or installed with sudo. " +"Please rerun/install as a non-root user. If you had to " +"install Appium using `sudo npm install -g appium`, the " +"solution is to reinstall Node using a method (Homebrew, " +"for example) that doesn't require sudo to install global " +"npm packages.");process.exit(1);}
}

默认情况下 我们的noPermsCheck是为false的,所以就是需要进行权限检查的。
首先:

var appiumPermStat = fs.statSync(path.resolve(__dirname, '../../package.json'));

这句的意思是读取 package.json 会返回一个stat数组对象,里面包含了文件的uid、gid、文件大小、创建时间、修改时间等等

var isWindows = require('appium-support').system.isWindows();// 这里通过 appium-support的第三方模块进行判断当前的系统是否为windows系统,查看 appium-support 发现实际上是最终是通过os.type来判断是否为"Windows_NT","Darwin"或者其他来说明是否为windows系统

最后我们再看判断语句吧!

if (!isWindows &&// Appium should be run by user who owns files in Appium installation directoryappiumPermStat.uid !== process.getuid() &&// authorize* commands could be run using sudo!launchCmd.match(/authorize/)) {.....}

这里的判断满足条件是非windows的环境下,并且判断package.json文件的uid和进程的uid是否相等,因为只有相等才能够说明当前的用户对该文件具有执行的权限。最后如果都不满足就判断launchCmd是否包含authorize,就是已sudo的权限运行了。

所以我们再安装appium的时候记住不要使用sudo npm install -g appium 来安装哦。

最最后:

if (require.main === module) {main(args);
}
module.exports.run = main;

可以看出 main提供给外部的是一个run方法的调用,并且if (require.main === module) {}会判断当前的模块是否是通过node调用,如果是的话,那么它自己就还去调用main方法。


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

相关文章

胡振波:我的芯片之路

​点击关注异步图书,置顶公众号每天与你分享 IT好书 技术干货 职场知识​​参与文末话题讨论,每日赠送异步图书——异步小编胡振波,上海交通大学电子工程系本科、微电子学院硕士。拥有业界多年ASIC和CPU设计与验证经验,先后在Marv…

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

上一节 Appium Server 源码分析 (一) 中我们大体讲了,appium server在正确运行前做的一些判断,下来我们正式看看main 方法 在看main方法之前我们可以得看看main.js引用的那一大堆第三方的模块的主要作用是什么。 变量模块作用httphttphttp模块expressex…

Linux下JProfiler 9安装部署及使用

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

结合testng实现用例失败重跑

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

Spring-Boot原理及应用布署

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

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

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

Python学习笔记__12.5章 hashlib

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

testng + reportng 测试结果邮件发送

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

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

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

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

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