手机自动化测试:Appium源码分析之跟踪代码分析一 2
2015-12-23 15:09
411 查看
解析命令行参数process.chdir(path.resolve(__dirname, '../..')); 上面的代码是将当前运行的路径提升到根目录,也就是appium的根目录。process是一个全局变量,所以不需要通过require来加载,process.chdir()方法用来改变工作目录,path.resolve()方法是将当前目录项上倒退2个级别,也就是appium项目的根目录。if (require.main === module) { args = parser.parseArgs(); noPermsCheck = args.noPermsCheck; logFactory.init(args);}require.main标识的是启动脚本的模块,也就是你在命令行中node命令后面跟的模块,比如我们这个地方require.main就是lib/server/main.js。而module与文件/目录是一一对应的关系,当前文件中module自然指代该文件的结构。这样说法可能有点抽象,我们来看看module的变量
: 里面可以看出当前module的filename值为lib/server/main.js,其还含有两个子module,一个lib/server/parser.js和lib/server/logger.js。这两个刚好是我们在初始化的时候通过require加载的模块。所以我们应该能够得出这个module一定程度上能够反映出各个模块之间的依赖关系。
那么上面的require.main==module就是看是否是程序的入口程序,如果是的话,就需要解析参数。解析参数用的就是main.js同级目录下的parse.js模块来解析的,我们会在下一篇的博客中介绍。解析完成后,会给变量args,noPermsCheck 赋值,且初始化log工厂。 权限检查logger = logFactory.get('appium'); if (!noPermsCheck) { ...... }首先初始化变量logger,我们就拥有了log器。然后判断是否需要进行权限的检查,由于我们的noPermsCheck变量为false,所以是需要检查的。那么进入到检查代码块:var appiumPermStat = fs.statSync(path.resolve(__dirname, '../../package.json')); var launchCmd = (process.env.SUDO_COMMAND || "").toLowerCase(); var isWindows = require('appium-support').system.isWindows();上面的语句初始化3个局部变量并赋值:appiumPermStat:首先获得package.json文件对象。launchCmd:判断系统环境下SUDO_COMMAND命令是否为undefined或null,如果不是这两个值,那么该值就为SUDO_COMMAND的值,否则该值就为空字符串(”“),最后再将字符串转化为小写的。isWindows:判断是否是windows系统,调用的是第三方模块appium-support的方法。上面3个对象赋值以后,就会判断当前环境是否具有用户权限,但是该检查只在unix和linux环境下才会做。 if ( !isWindows && // Appium should be run by user who owns files in Appium installation directory appiumPermStat.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); } 1.上面的判断条件中isWindows这个很容易理解的,我们上面也说非windows下才会做这个检查,
2.然后判断文件的uid和进程的uid是否相等,如果相等了说明当前用户拥有该文件的执行权限,所以如果既不在window下,又不能拥有执行权限,就需要继续判断launchCmd了。
3.判断launchCmd:利用的正则表达式方法match来判断,正斜杠(/)包裹的就是带查找的字符串,上面的结果就是判断launchCmd是否包含authorize这个字符串。该判断的目的是查看是否以sudo命令启动的该脚本,因为本身该脚本不是启动程序的用户所能执行的,就需要显式的用sudo来执行。
4.当上面的3个条件有一个判断失败,就会打印下面的信息。
说明上面的种种判断都是为检查我们是否在安装appium的时候,错误的使用sudo命令。
: 里面可以看出当前module的filename值为lib/server/main.js,其还含有两个子module,一个lib/server/parser.js和lib/server/logger.js。这两个刚好是我们在初始化的时候通过require加载的模块。所以我们应该能够得出这个module一定程度上能够反映出各个模块之间的依赖关系。
那么上面的require.main==module就是看是否是程序的入口程序,如果是的话,就需要解析参数。解析参数用的就是main.js同级目录下的parse.js模块来解析的,我们会在下一篇的博客中介绍。解析完成后,会给变量args,noPermsCheck 赋值,且初始化log工厂。 权限检查logger = logFactory.get('appium'); if (!noPermsCheck) { ...... }首先初始化变量logger,我们就拥有了log器。然后判断是否需要进行权限的检查,由于我们的noPermsCheck变量为false,所以是需要检查的。那么进入到检查代码块:var appiumPermStat = fs.statSync(path.resolve(__dirname, '../../package.json')); var launchCmd = (process.env.SUDO_COMMAND || "").toLowerCase(); var isWindows = require('appium-support').system.isWindows();上面的语句初始化3个局部变量并赋值:appiumPermStat:首先获得package.json文件对象。launchCmd:判断系统环境下SUDO_COMMAND命令是否为undefined或null,如果不是这两个值,那么该值就为SUDO_COMMAND的值,否则该值就为空字符串(”“),最后再将字符串转化为小写的。isWindows:判断是否是windows系统,调用的是第三方模块appium-support的方法。上面3个对象赋值以后,就会判断当前环境是否具有用户权限,但是该检查只在unix和linux环境下才会做。 if ( !isWindows && // Appium should be run by user who owns files in Appium installation directory appiumPermStat.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); } 1.上面的判断条件中isWindows这个很容易理解的,我们上面也说非windows下才会做这个检查,
2.然后判断文件的uid和进程的uid是否相等,如果相等了说明当前用户拥有该文件的执行权限,所以如果既不在window下,又不能拥有执行权限,就需要继续判断launchCmd了。
3.判断launchCmd:利用的正则表达式方法match来判断,正斜杠(/)包裹的就是带查找的字符串,上面的结果就是判断launchCmd是否包含authorize这个字符串。该判断的目的是查看是否以sudo命令启动的该脚本,因为本身该脚本不是启动程序的用户所能执行的,就需要显式的用sudo来执行。
4.当上面的3个条件有一个判断失败,就会打印下面的信息。
说明上面的种种判断都是为检查我们是否在安装appium的时候,错误的使用sudo命令。
相关文章推荐
- 老李性能测试分享
- 你想不到:咖啡馆里上工具课
- 移动端自动化测试开课了
- 老李分享:什么是好战略
- 性能调优案例分享:Mysql的cpu过高
- 性能测试分享:性能测试工具开发的案例分享(上)
- 性能测试分享:性能测试工具开发的案例分享(下)
- 性能测试培训:批量执行Jmeter脚本之ant调用 2
- 性能测试培训:分布式测试之jmeter1
- 老李案例分享:MAT分析应用程序服务出现内存溢出过程1
- 老李案例分享:MAT分析应用程序服务出现内存溢出过程2
- 老李案例分享:定位JAVA内存溢出 1
- 老李案例分享:定位JAVA内存溢出 2
- 性能测试培训: 建立压力模型
- 老李分享:你知道有哪些持续集成工具
- 老李分享知识:性能测试之TPS和吞吐率
- 老李分享知识:性能测试之吞吐量
- 性能测试培训:分析内训泄露的案例
- 自动化测试培训:qtp脚本获取获取汇率数据
- 性能测试培训:sql server性能测试分析局部变量的性能影响1