rubick
Version:
tools for mtc
248 lines (229 loc) • 9.55 kB
JavaScript
/**
* Created by hongzhiyuan on 2017/5/11.
*/
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;