我正在为企业应用程序在iOS设备和模拟器上进行一些更高级的自动化。自动化是用无浏览器的Javascript编写的。其中一种方法可在设备上运行,而不能在模拟器上运行,因此我需要编写一种解决方法。出于好奇,它是UIATarget.localTarget()。frontMostApp()。preferencesValueForKey(key)。
我们需要做的是从磁盘上的plist文件读取服务器的路径(不同)。作为模拟器的一种解决方法,我使用了以下几行来查找包含首选项的plist文件:
// Get the alias of the user who's logged in
var result = UIATarget.localTarget().host().performTaskWithPathArgumentsTimeout("/usr/bin/whoami", [], 5).stdout;
// Remove the extra newline at the end of the alias we got
result = result.replace('\n',"");
// Find the location of the plist containing the server info
result = UIATarget.localTarget().host().performTaskWithPathArgumentsTimeout("/usr/bin/find", ["/Users/"+result+"/Library/Application Support/iPhone Simulator", "-name", "redacted.plist"], 100);
// For some reason we need a delay here
UIATarget.localTarget().delay(.5);
// Results are returned in a single string separated by newline characters, so we can split it into an array
// This array contains all of the folders which have the plist file under the Simulator directory
var plistLocations = result.stdout.split("\n");
...
// For this example, let's just assume we want slot 0 here to save time
var plistBinaryLocation = plistLocations[0];
var plistXMLLocation = plistLocations[i] + ".xml";
result = UIATarget.localTarget().host().performTaskWithPathArgumentsTimeout("/usr/bin/plutil", ["-convert","xml1", plistBinaryLocation,"-o", plistXMLLocation], 100);
从这里开始,我认为获取内容的最佳方法是cat或grep文件,因为我们无法直接从磁盘读取文件。但是,我在降低语法方面遇到困难。这是我正在读取的plist文件的编辑后的片段:
<key>server_url</key>
<string>http://pathToServer</string>
文件中有一堆密钥/字符串对,其中server_url密钥是唯一的。理想情况下,我会做类似回溯的事情,但是由于JavaScript似乎不支持它,所以我认为我只是从文件中取出一对,然后稍等一下。
我可以通过以下方式搜索密钥:
// This line works
var expression = new RegExp(escapeRegExp("<key>server_url</key>"));
if(result.stdout.match(expression))
{
UIALogger.logMessage("FOUND IT!!!");
}
else
{
UIALogger.logMessage("NOPE :(");
}
escapeRegExp方法如下所示:
function escapeRegExp(str)
{
var result = str.replace(/([()[{*+.$^\\|?])/g, '\\$1');
UIALogger.logMessage("NEW STRING: " + result);
return result;
}
另外,此行返回一个值(但得到错误的行):
var expression = new RegExp(escapeRegExp("<string>(.*?)</string>"));
但是,将两者放在一起时,它(Regex语法)在终端上可用,但在代码中不起作用:
var expression = new RegExp(escapeRegExp("<key>server_url</key>[\s]*<string>(.*?)</string>"));
我想念什么?我也尝试了grep和egrep,但没有任何运气。
在这里,有两个问题会影响您使正则表达式在JavaScript代码中起作用。
(.*?)
和空格忽略[\s]*
也将被转义,并且不会按您期望的方式进行评估。您需要转义XML部分,并添加正则表达式部分而不转义它们。[\s]*
正在成为JavaScript正常的字符串转义规则的牺牲品。在输出中,“ \ s”变成“ s”。您需要使用“ \ s”对反斜杠进行转义,以便在构造正则表达式时传递的字符串中将其保留为“ \ s”。我已经构建了一个工作脚本,并已在UI自动化引擎中对其进行了验证。它应提取并打印出预期的URL:
var testString = "" +
"<plistExample>\n" +
" <key>dont-find-me</key>\n" +
" <string>bad value</string>\n" +
" <key>server_url</key>\n" +
" <string>http://server_url</string>\n" +
"</plistExample>";
function escapeRegExp(str)
{
var result = str.replace(/([()[{*+.$^\\|?])/g, '\\$1');
UIALogger.logMessage("NEW STRING: " + result);
return result;
}
var strExp = escapeRegExp("<key>server_url</key>") + "[\\s]*" + escapeRegExp("<string>") + "(.*)" + escapeRegExp("</string>");
UIALogger.logMessage("Expression escaping only the xml parts:" + strExp);
var exp = new RegExp(strExp);
var match = testString.match(exp);
UIALogger.logMessage("Match: " + match[1]);
不过,我应该指出,您需要在正则表达式中转义的唯一事情是XML结束标记中的正斜杠。这意味着您不需要escapeRegExp()
函数,可以编写所需的表达式,如下所示:
var exp = new RegExp("<key>server_url<\/key>[\\s]*<string>(.*)<\/string>");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句