UNPKG

rubick

Version:

tools for mtc

248 lines (229 loc) 9.55 kB
/** * Created by hongzhiyuan on 2017/5/11. */ "use strict" let os = require('os'); let fs = require('fs'); let path = require('path'); let co = require('co'); let logger = require('../../log').init('rubick'); let collectionUtil = require('../../utils/collectionUtil'); let childProcess = require('child_process'); let cmdUtil = require('../../utils/cmd') class RecordManager { /** * 构造方法 * * @param {String} serial * @param {String} adbStatus */ constructor() { this.commonCode = '\nindex++;\nSystemClock.sleep(#timeout#);\nhelper.logAndScreenShot(index, tag + "#description#");\n'; this.singleSelectCode = '\nhelper.find(new UiSelector().#method#("#key#").instance(#index#)).click();'; this.childSelectCode = '\nhelper.find(new UiSelector().resourceId("#parentKey#").instance(#parentIndex#)' + '.childSelector(new UiSelector().#method#("#key#").instance(#index#))).click();'; this.initPageNodes(); } initPageNodes() { this.resourceIdMap = new Map(); this.classNameMap = new Map(); this.textMap = new Map(); this.nodes = new Map(); } refreshPageNodes(nodes) { this.initPageNodes(); if (nodes != null) { this.nodes = nodes; } } // hashPageNodes() { // let self = this; // let nodeList = self.nodes.values(); // for (let [key, node] of self.nodes) { // let element = node.element; // if (element.resourceId != null && element.resourceId !== '') { // if (self.resourceIdMap.has(element.resourceId)) { // node.element.resourceIdIndex = self.resourceIdMap.get(element.resourceId) + 1; // } else { // node.element.resourceIdIndex = 0; // } // self.resourceIdMap.set(element.resourceId, node.element.resourceIdIndex); // } // if (element.text != null && element.text !== '') { // if (self.textMap.has(element.text)) { // node.element.textIndex = self.textMap.get(element.text) + 1; // } else { // node.element.textIndex = 0; // } // self.textMap.set(element.text, node.element.textIndex); // } // if (element.className != null && element.className !== '') { // if (self.classNameMap.has(element.className)) { // node.element.classNameIndex = self.classNameMap.get(element.className) + 1; // } else { // node.element.classNameIndex = 0; // } // self.classNameMap.set(element.className, node.element.classNameIndex); // } // self.nodes.set(key, node); // } // } getNode(key) { if (this.nodes != null && this.nodes.has(key)) { return this.nodes.get(key); } return null; } // getGenCode(key, timeout, description) { // if (this.nodes != null && this.nodes.has(key)) { // return this.codeGenerate(this.nodes.get(key), timeout, description); // } else { // return 'can not generate code: node is null'; // } // } // codeGenerate(node, timeout, description) { // if (!node || !node.element) { // return 'can not generate code'; // } // console.log('generate code'); // let self = this; // let codeTemplate = self.singleSelectCode; // let currentNodeSelector = null; // let parentKey = ''; // let parentIndex = 0; // // let rootNode = self.getNodeByResourceId(node); // if (rootNode !== null) { // if (rootNode.element.id === node.element.id) { // currentNodeSelector = self.getNodeSelector(node); // } else { // codeTemplate = self.childSelectCode; // currentNodeSelector = self.getNodeSelector(node); // if (currentNodeSelector !== null) { // currentNodeSelector['#index#'] = self.getChildNodeIndex(rootNode, node, currentNodeSelector['#method#'], currentNodeSelector['#key#']); // } // currentNodeSelector['#parentKey#'] = rootNode.element.resourceId; // currentNodeSelector['#parentIndex#'] = rootNode.element.resourceIdIndex; // } // } else { // currentNodeSelector = self.getNodeSelector(node); // } // // if (currentNodeSelector === null) { // return 'can not generate code: selector is null'; // } else { // let code = codeTemplate; // for (let [key, value] of collectionUtil.objectEntry(currentNodeSelector)) { // code = code.replace(key, value); // } // code = code + self.commonCode; // code = code.replace('#timeout#', '' + timeout); // code = code.replace('#description#', description); // return code; // } // } getNodeByResourceId(root) { let self = this; if (!root && !root.element) { return null; } if (root.element.resourceId != null && root.element.resourceId !== '') { return root; } else { let parentId = root.parentId + ''; let parentNode = self.nodes.has(parentId) ? self.nodes.get(parentId) : {}; return self.getNodeByResourceId(parentNode); } } getNodeSelector(node) { if (!node || !node.element) { return null; } if (node.element.resourceId != null && node.element.resourceId !== '') { return { '#method#': 'resourceId', '#key#': node.element.resourceId, '#index#': node.element.resourceIdIndex }; } else if (node.element.text != null && node.element.text !== '') { return {'#method#': 'text', '#key#': node.element.text, '#index#': node.element.textIndex}; } else if (node.element.className != null && node.element.className !== '') { return {'#method#': 'className', '#key#': node.element.className, '#index#': node.element.classNameIndex}; } else { return null; } } analysisApk(path) { logger.debug(`analysis apk file start`); return co(function* (self) { let output = yield cmdUtil.exec('aapt d badging ' + path).then((stdout) => { let result = []; console.log(stdout.split('\n')); console.log(stdout); return stdout; }); let appInfo = {packageName: '', fileName: path}; let packageMatch = output.toString('utf-8').match(/package: name='(\S+)'/); // let appName = output.toString('utf-8').match(application-label-en:) if (packageMatch && packageMatch.length > 1) { appInfo.packageName = packageMatch[1]; } return appInfo; }(this)).catch((e) => { logger.error(`read file error` + e.message); return ''; }); } getChildNodeIndex(parentNode, currentNode, method, key) { let self = this; if (!parentNode || !parentNode.element || !currentNode || !currentNode.element) { return -1; } let parentId = parentNode.element.id; let currentId = currentNode.element.id; let index = -1; for (var i = parentId + 1; i <= currentId; i++) { let node = self.nodes.get(i + ''); if (node.element[method] === key) { index++; } } return index; } runScript() { return cmdUtil.exec(__dirname + '/test').then((stdout) => { let result = []; console.log(stdout); return result; }); } compileCode(codeData) { logger.debug(`read file start`); return co(function* (self) { let fileData = fs.readFileSync(__dirname + '/test.java', {flag: 'r+', encoding: 'utf8'}); if (fileData) { fileData = fileData.replace('###code###', codeData.code); fileData = fileData.replace('###package###', codeData.packageName); } console.log(fileData); logger.info('before write'); fs.writeFileSync(__dirname + '/WandabpTest.java', fileData, {flag: 'w'}); logger.info('after write'); let scriptPath = path.dirname(fs.realpathSync(__filename)); logger.info(scriptPath); yield cmdUtil.exec(scriptPath + '/update.sh').then((stdout) => { let result = []; logger.info(stdout); return result; }, (error) => { logger.error(error); }); logger.info('after exec'); return true; }(this)).catch((e) => { logger.error(`read file error` + e.message); return false; }); } } module.exports = RecordManager;