Add find by id for Android

This commit is contained in:
bootstraponline
2013-05-29 14:03:56 -04:00
parent 674d1e2667
commit d0326a1d64
2 changed files with 52 additions and 1 deletions
+52 -1
View File
@@ -15,6 +15,7 @@ var errors = require('./errors')
, temp = require('temp')
, async = require('async')
, path = require('path')
, getTempPath = require('./helpers').getTempPath
, UnknownError = errors.UnknownError;
var Android = function(opts) {
@@ -50,6 +51,7 @@ var Android = function(opts) {
, databaseEnabled: false
};
this.lastCmd = null;
this.apkStrings = null;
};
// Clear data, wait for app close, then start app.
@@ -299,7 +301,7 @@ Android.prototype.findElements = function(strategy, selector, cb) {
this.findElementOrElements(strategy, selector, true, "", cb);
};
Android.prototype.findElementOrElements = function(strategy, selector, many, context, cb) {
Android.prototype.findElementOrElementsMain = function(strategy, selector, many, context, cb) {
var params = {
strategy: strategy
, selector: selector
@@ -347,6 +349,55 @@ Android.prototype.findElementOrElements = function(strategy, selector, many, con
}
};
Android.prototype.findElementOrElements = function(strategy, selector, many, context, cb) {
if (strategy === "id") {
var me = this;
var ensureStringsExist = function(innerCb) {
if (me.apkStrings === null) {
var stringsFromApkJarPath = path.resolve(__dirname, '../app/android/strings_from_apk.jar');
var outputPath = path.resolve(getTempPath(), me.appPackage);
var makeStrings = ['java -jar ', stringsFromApkJarPath,
' ', me.adb.apkPath, ' ', outputPath].join('');
logger.debug(makeStrings);
exec(makeStrings, {}, function(err, stdout, stderr) {
if (err) {
logger.debug(stderr);
return innerCb("error making strings");
}
logger.debug("Made strings");
var jsonFile = path.resolve(outputPath, 'strings.json');
me.apkStrings = JSON.parse(fs.readFileSync(jsonFile, 'utf8'));
innerCb(null);
});
} else {
innerCb(null);
}
};
var findElementById = function(innerCb) {
var oldSelector = selector;
selector = me.apkStrings[selector];
if (typeof selector === "undefined") {
return innerCb(null,{
status: status.codes.UnknownError.code
, value: "ID " + oldSelector + " doesn't exist in res/values/strings.xml"
});
}
// Perform a name search using the string value for the given id.
strategy = "name";
innerCb(null);
};
var topCb = cb;
return async.series([
function(cb) { ensureStringsExist(cb); },
function(cb) { findElementById(cb); }
], function(cb) { me.findElementOrElementsMain(strategy, selector, many, context, topCb); });
} else {
this.findElementOrElementsMain(strategy, selector, many, context, cb);
}
};
Android.prototype.findElementFromElement = function(element, strategy, selector, cb) {
this.findElementOrElements(strategy, selector, false, element, cb);
};
Binary file not shown.