需要用到的两个模块
init.js
log('加载了init模块')
function Work(name, flow) {
this.name = name || ''
this.flow = flow || []
this.status = 'ready'
this.timesMaxDo = 6
this.timesDo = 0
this.statusMustbeBeforeDo = {}
// {
// viewArr:[{text:'QQ'}]
// }
this.statusMustbeAfterDo = {}
this.action = function () {
for (let i = 0; i < this.flow.length; i++) {
this.flow[i].do()
}
}
this.do = function () {
if (this.timesDo > this.timesMaxDo) {
this.handleError('timesDoOver')
}
var inspectStatusBeforeDo = new Inspect(this.statusMustbeBeforeDo)
var inspectStatusAfterDo = new Inspect(this.statusMustbeAfterDo)
if (this.timesDo > 0) {
if (inspectStatusAfterDo.inspect()) {
log(util.format('%s %s is OK', this.name, 'inspectStatusAfterDo'))
this.timesDo = 0
return true;
}
}
if (!inspectStatusBeforeDo.inspect()) {
this.handleError('statusStartError')
} else {
log(util.format('%s %s is OK', this.name, 'inspectStatusBeforeDo'))
}
this.action()
this.timesDo++;
if (!inspectStatusAfterDo.inspect()) {
this.handleError('statusEndError')
} else {
log(util.format('%s %s is OK', this.name, 'inspectStatusAfterDo'))
this.timesDo = 0
}
}
this.handleError = function (err) {
switch (err) {
case 'statusStartError':
log(util.format('%s %s is error', this.name, 'inspectStatusBeforeDo'))
sleep(1000)
this.timesDo++;
this.do()
break;
case 'statusEndError':
log(util.format('%s %s is error', this.name, 'inspectStatusAfterDo'))
this.timesDo++;
this.do()
break;
case 'timesDoOver':
log(util.format('%s is error: %s', this.name, 'timesDoOver'))
throw (util.format('%s is error: %s', this.name, 'timesDoOver'))
break;
default:
throw util.format('%s occur error: ', this.name, err)
}
}
}
//做个检查类,来检查界面的状态,当然也可以拓展检查其他东西,时间,手机电量,wifi状态啦之类的,只要返回布尔值就可以了
function Inspect(status) {
this.status = status || {}
//status是指statusMustbeBeforeDo或者statusMustbeAfterDo,
//一般就是检查控件是否存在
//当然也可以是其他状态
//比如时间,文件
//毕竟状态是一种抽象的概念,
//万事万物都有状态
//至于检查的方法就各有章法了
//至于status用数组还是对象来保存,
//我都思考了好长时间
//我觉得病人的状态按照心跳,血压,气色,来观察的
//所以我就决定选择对象来保存,
//其实数组也可以保存,都一样的,
//感觉用数组或者对象保存,并没有什么区别
this.inspect = function () {
var status = this.status
for (var k in status) {
switch (k) {
case 'viewArr':
log(util.format('当前检查类型是%s', 'viewArr'))
return this.inspectViewArr(status[k])
case 'wordArr':
log(util.format('当前检查类型是%s', 'viewArr'))
return this.inspectWordArr(status[k])
default:
throw util.format('没有这种检查类型%s,你自己加吧', k)
}
}
return true
}
}
//检查控件就和检查鸭子一样,
//如果它看起来像鸭子,走起来像鸭子,叫起来像鸭子,它就是鸭子。--麦卡锡
Inspect.prototype.inspectViewArr = function (viewArr) {
log(viewArr)
var common = require('./common')
if (!(common.isArrayFn(viewArr))) {
throw 'viewArr必须是数组'
}
if (viewArr.length == 0) {
return true
}
function getSelectorRule(attr, val) {
log(attr)
switch (attr) {
case 'id':
return 'id("' + val + '").'
case 'text':
return 'text("' + val + '").'
case 'desc':
return 'desc("' + val + '").'
default:
throw '没有这个属性'
}
}
function getSelector(view) {
var arr = Object.keys(view);
if (arr.length == 0) {
throw '不允许传入空对象'
}
var findRule = 'findOnce()'
var rule = ''
for (var k in view) {
rule += getSelectorRule(k, view[k])
}
return rule + findRule
}
for (let i = 0; i < viewArr.length; i++) {
var findViewRule = getSelector(viewArr[i])
log(findViewRule)
if (eval(findViewRule)) {
log(util.format('这个规则%s找到控件了'), findViewRule)
} else {
log(util.format('这个规则%s没有找到控件'), findViewRule)
return false
}
}
return true
}
Inspect.prototype.inspectWordArr = function (wordArr) {
//检查页面是否包含指定文字
//common中存放一些公共的函数
var common = require('./common')
if (!(common.isArrayFn(wordArr))) {
throw 'wordArr必须是数组'
}
var allWords = common.getAllWords()
var result = common.bigArrContainsSmallArr(allWords, wordArr)
return result
}
module.exports = {
Work: Work
}
common.js
//点击控件
function clickView(view) {
log(arguments.callee.name + '开始')
log(view)
if (view) {
var x = view.bounds().centerX()
var y = view.bounds().centerY()
log('将要点击的坐标 %s,%s', x, y)
press(x, y, 1)
} else {
throw '传入clickView中的view异常'
}
log(arguments.callee.name + '结束')
}
//去除头尾空格
String.prototype.strip = function () {
log(arguments.callee.name + '开始')
var str = this,
whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
for (var i = 0, len = str.length; i < len; i++) {
if (whitespace.indexOf(str.charAt(i)) === -1) {
str = str.substring(i);
break;
}
}
for (i = str.length - 1; i >= 0; i--) {
if (whitespace.indexOf(str.charAt(i)) === -1) {
str = str.substring(0, i + 1);
break;
}
}
log(arguments.callee.name + '结束')
return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
}
// 随机滑动
function swipeRnd(x1, y1, x2, y2, duration) {
log(arguments.callee.name + '开始')
var k = 20
var x1 = x1 + random(-(k), k)
var y1 = y1 + random(-(k), k)
var x2 = x2 + random(-(k), k)
var y2 = y2 + random(-(k), k)
var duration = duration + random(-(k), k)
swipeRnd2(x1, y1, x2, y2, duration)
log(arguments.callee.name + '结束')
}
// 随机滑动 两点滑动 变为三点滑动
function swipeRnd3(x1, y1, x2, y2, duration) {
log(arguments.callee.name + '开始')
gesture(duration, [x1, y1], [x1 + random(10, 60), y1 - random(10, 80)], [x2, y2])
log(arguments.callee.name + '结束')
}
function swipeFromDownToUp() {
log(arguments.callee.name + '开始')
var w = device.width
var h = device.height
var x1 = Math.floor(w / 5 * 1)
var y1 = Math.floor(h / 5 * 4)
var x2 = Math.floor(w / 5 * 3)
var y2 = Math.floor(h / 5 * 1)
var duration = 300
log('滑动参数=', x1, y1, x2, y2, duration)
swipeRnd(x1, y1, x2, y2, duration)
log(arguments.callee.name + '结束')
sleep(3000)
}
Array.prototype.minus = function (arr) {
return this.filter(function (element) {
for (let i = 0; i < arr.length; i++) {
if (JSON.stringify(element) == JSON.stringify(arr[i])) {
return false
}
}
return true
});
};
Array.prototype.intersect = function (arr) {
return this.filter(function (element) {
for (let i = 0; i < arr.length; i++) {
if (JSON.stringify(element) == JSON.stringify(arr[i])) {
return true
}
}
return false
});
};
function bigArrContainsSmallArr(bigArr, smallArr) {
//对于重复的元素采用计数的方式对比
var bigArrObj = {}
var smallArrObj = {}
for (let i = 0; i < bigArr.length; i++) {
var has = bigArrObj.hasOwnProperty(bigArr[i])
if (has) {
bigArrObj[bigArr[i]]++;
} else {
bigArrObj[bigArr[i]] = 1
}
}
for (let i = 0; i < smallArr.length; i++) {
var has = smallArrObj.hasOwnProperty(smallArr[i])
if (has) {
smallArrObj[smallArr[i]]++;
} else {
smallArrObj[smallArr[i]] = 1
}
}
for (var k in smallArrObj) {
if (bigArrObj.hasOwnProperty(k) && bigArrObj[k] >= smallArrObj[k]) {} else {
return false
}
}
return true
}
/**
* @method getAllWords
* @param setting 是个对象, 决定是否获取text,desc,id,以及是否去重; 默认获取text和desc,不获取id,默认去重
* @desc 默认设置为{
getText: true,
getDesc: true,
getId: false,
removeRepetitiveElements: true
}
* @desc 获取页面所有文字,可以指定text,desc,id三个中的任意几个
* @return 所有文字组成的数组
*/
function getAllWords(setting) {
var setting = setting || {}
var defaultSetting = {
getText: true,
getDesc: true,
getId: false,
removeRepetitiveElements: false
}
Object.assign(defaultSetting, setting);
log(defaultSetting)
var allStr = []
var getDescAndTextAndIdOfNode = function (node) {
if (node) {
if (defaultSetting.getText) {
var text = node.text()
if (!!text) {
allStr.push(text)
}
}
if (defaultSetting.getDesc) {
var desc = node.desc()
if (!!desc) {
allStr.push(desc)
}
}
if (defaultSetting.getId) {
var id = node.id()
if (!!id) {
allStr.push(id)
}
}
}
for (let i = 0; i < node.childCount(); i++) {
getDescAndTextAndIdOfNode(node.child(i));
}
}
var getFrameLayoutNode = function () {
return className('FrameLayout').findOne(2000)
}
getDescAndTextAndIdOfNode(getFrameLayoutNode())
function removeRepetitiveElements(arr) {
var obj = {}
for (let i = 0; i < arr.length; i++) {
if (obj.hasOwnProperty(arr[i])) {} else {
obj[arr[i]] = true
}
}
return Object.keys(obj)
}
if (defaultSetting.removeRepetitiveElements) {
allStr = removeRepetitiveElements(allStr)
}
return allStr
}
// JavaScript 标准文档中定义: [[Class]] 的值只可能是下面字符串中的一个: Arguments, Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String.
function isArrayFn(value) {
if (typeof Array.isArray === "function") {
return Array.isArray(value);
} else {
return Object.prototype.toString.call(value) === "[object Array]";
}
}
function isObjectFn(value) {
return Object.prototype.toString.call(value) === "[object Object]";
}
var common = {
clickView: clickView,
bigArrContainsSmallArr: bigArrContainsSmallArr,
swipeRnd: swipeRnd,
swipeRnd3: swipeRnd3,
swipeFromDownToUp: swipeFromDownToUp,
getAllWords: getAllWords,
isArrayFn: isArrayFn,
isObjectFn: isObjectFn
}
module.exports = common
欢迎加入autojs资料收集,群聊号码:703407652