您的位置:首页 > 移动开发

手机自动化测试: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命令。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  软件测试开发