uiautomator-client-slef
Version:
Node.js wrapper for UIAutomator
140 lines (117 loc) • 2.93 kB
JavaScript
;
const macacaUtils = require('xutil');
const childProcess = require('child_process');
var _ = macacaUtils.merge({}, macacaUtils);
_.sleep = function(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms);
});
};
_.retry = function(func, interval, num) {
return new Promise((resolve, reject) => {
func().then(resolve, err => {
if (num > 0 || typeof num === 'undefined') {
_.sleep(interval).then(() => {
resolve(_.retry(func, interval, num - 1));
});
} else {
reject(err);
}
});
});
};
_.waitForCondition = function(func, wait/*ms*/, interval/*ms*/) {
wait = wait || 5000;
interval = interval || 500;
let start = Date.now();
let end = start + wait;
const fn = function() {
return new Promise((resolve, reject) => {
const continuation = (res, rej) => {
let now = Date.now();
if (now < end) {
res(_.sleep(interval).then(fn));
} else {
rej(`Wait For Condition timeout ${wait}`);
}
};
func().then(isOk => {
if (!!isOk) {
resolve();
} else {
continuation(resolve, reject);
}
}).catch(e => {
continuation(resolve, reject);
});
});
};
return fn();
};
_.escapeString = function(str) {
return str
.replace(/[\\]/g, '\\\\')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t')
.replace(/[\"]/g, '\\"')
.replace(/\\'/g, "\\'");
};
_.exec = function(cmd, opts) {
return new Promise((resolve, reject) => {
childProcess.exec(cmd, _.merge({
maxBuffer: 1024 * 512,
wrapArgs: false
}, opts || {}), (err, stdout) => {
if (err) {
return reject(err);
}
resolve(_.trim(stdout));
});
});
};
_.spawn = function() {
var args = Array.prototype.slice.call(arguments);
return new Promise((resolve, reject) => {
var stdout = '';
var stderr = '';
var child = childProcess.spawn.apply(childProcess, args);
child.on('error', error => {
reject(error);
});
child.stdout.on('data', data => {
stdout += data;
});
child.stderr.on('data', data => {
stderr += data;
});
child.on('close', code => {
var error;
if (code) {
error = new Error(stderr);
error.code = code;
return reject(error);
}
resolve([stdout, stderr]);
});
});
};
var Defer = function() {
this._resolve = null;
this._reject = null;
this.promise = new Promise((resolve, reject) => {
this._resolve = resolve;
this._reject = reject;
});
};
Defer.prototype.resolve = function(data) {
this._resolve(data);
};
Defer.prototype.reject = function(err) {
this._reject(err);
};
_.Defer = Defer;
module.exports = _;