有没有人成功在Xcode中设置自动化UIAutomation测试?
我正在尝试在我的Xcode项目中设置一个目标,该目标应该运行我准备的所有UIAutomation脚本。目前,此目标的唯一构建阶段是运行脚本块:
TEMPLATE="/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate"
MY_APP="/Users/Me/Library/Application Support/iPhone Simulator/6.0/Applications/564ED15A-A435-422B-82C4-5AE7DBBC27DD/MyApp.app"
RESULTS="/Users/Me/Projects/MyApp/Tests/UI/Traces/Automation.trace"
SCRIPT="/Users/Me/Projects/MyApp/Tests/UI/SomeTest.js"
instruments -t $TEMPLATE $MY_APP -e UIASCRIPT $SCRIPT -e UIARESULTSPATH $RESULTS
当我构建此目标时,它会在几秒钟后成功,但脚本实际上并未运行。在构建日志中,我得到以下错误:
instruments[7222:707] Failed to load Mobile Device Locator plugin
instruments[7222:707] Failed to load Simulator Local Device Locator plugin
instruments[7222:707] Automation Instrument ran into an exception while trying to run the script. UIATargetHasGoneAWOLException
+0000 Fail: An error occurred while trying to run the script.
Instruments Trace Complete (Duration : 1.077379s; Output : /Users/Me/Projects/MyApp/Tests/UI/Traces/Automation.trace)
我很确定,我的javascript和我的运行脚本都是正确的,因为如果我在bash中运行完全相同的仪器命令,它会按预期工作。 这可能是Xcode中的一个错误吗?
答案 0 :(得分:4)
我终于找到了解决这个问题的方法。似乎Xcode正在运行具有有限权限的Run Scripts。我不完全确定,导致instrument命令失败的原因,但使用su
更改为您的用户将修复它。
su $USER -l -c <instruments command>
显然,这会询问您的密码,但在作为脚本运行时无法输入密码。我没有找到指定su
密码的方法,但是如果以root身份运行它,则不必指定密码。幸运的是sudo
可以通过管道接受密码:
echo <password> | sudo -S su $USER -l -c <instruments command>
如果您不想硬编码密码(总是一个坏主意),您可以使用一些AppleScript来索取密码。
我在下面发布了生成的脚本。将其复制到项目中的* .sh文件,然后从运行脚本运行该脚本。
#!/bin/bash
# This script should run all (currently only one) tests, independently from
# where it is called from (terminal, or Xcode Run Script).
# REQUIREMENTS: This script has to be located in the same folder as all the
# UIAutomation tests. Additionally, a *.tracetemplate file has to be present
# in the same folder. This can be created with Instruments (Save as template...)
# The following variables have to be configured:
EXECUTABLE="TestApp.app"
# Optional. If not set, you will be prompted for the password.
#PASSWORD="password"
# Find the test folder (this script has to be located in the same folder).
ROOT="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Prepare all the required args for instruments.
TEMPLATE=`find $ROOT -name '*.tracetemplate'`
EXECUTABLE=`find ~/Library/Application\ Support/iPhone\ Simulator | grep "${EXECUTABLE}$"`
SCRIPTS=`find $ROOT -name '*.js'`
# Prepare traces folder
TRACES="${ROOT}/Traces/`date +%Y-%m-%d_%H-%M-%S`"
mkdir -p "$TRACES"
# Get the name of the user we should use to run Instruments.
# Currently this is done, by getting the owner of the folder containing this script.
USERNAME=`ls -l "${ROOT}/.." | grep \`basename "$ROOT"\` | awk '{print $3}'`
# Bring simulator window to front. Depending on the localization, the name is different.
osascript -e 'try
tell application "iOS Simulator" to activate
on error
tell application "iOS-Simulator" to activate
end try'
# Prepare an Apple Script that promts for the password.
PASS_SCRIPT="tell application \"System Events\"
activate
display dialog \"Password for user $USER:\" default answer \"\" with hidden answer
text returned of the result
end tell"
# If the password is not set directly in this script, show the password prompt window.
if [ -z "$PASSWORD" ]; then
PASSWORD=`osascript -e "$PASS_SCRIPT"`
fi
# Run all the tests.
for SCRIPT in $SCRIPTS; do
echo -e "\nRunning test script $SCRIPT"
COMMAND="instruments -t \"$TEMPLATE\" \"$EXECUTABLE\" -e UIASCRIPT \"$SCRIPT\""
COMMAND="echo '$PASSWORD' | sudo -S su $USER -l -c '$COMMAND'"
echo "$COMMAND"
eval $COMMAND > results.log
SCRIPTNAME=`basename "$SCRIPT"`
TRACENAME=`echo "$SCRIPTNAME" | sed 's_\.js$_.trace_g'`
mv *.trace "${TRACES}/${TRACENAME}"
if [ `grep " Fail: " results.log | wc -l` -gt 0 ]; then
echo "Test ${SCRIPTNAME} failed. See trace for details."
open "${TRACES}/${TRACENAME}"
exit 1
break
fi
done
rm results.log
答案 1 :(得分:1)
好像这可能是一个Xcode问题;无论如何,至少有一个人filed a Radar report on it。 this other thread中有人声称您可以通过断开当前连接到计算机的任何iDevices来解决此异常,但我怀疑当您尝试将脚本作为Xcode目标运行时,这不适用。
我建议同时提交Radar report;您可以从Apple获得有关该问题的更多详细信息,或者至少让他们相信many people遇到了问题并且他们应该弄清楚发生了什么。
很抱歉有一个非常有用的答案(应该是评论,但评论和链接/格式不能很好地混合)。请使用您在此问题上找到的任何内容更新此问题。
答案 2 :(得分:1)
注意:这不是问题的直接答案,但它是潜在问题的替代解决方案。
在搜索有关UIAutomation的深入信息时,我偶然发现了Square称为KIF的框架(保持功能)。它是一个集成测试框架,允许许多与UIAutomation相同的功能,但最棒的是你可以在Objective-C中编写集成测试。
设置非常简单(通过CocoaPods),它们也有很好的例子,最好的办法就是像Jenkins一样设置你的CI系统。
答案 3 :(得分:1)
游戏后期但我有一个适用于Xcode 5.1的解决方案。不知道是否有什么违反了上述解决方案。使用旧的解决方案,我仍然得到:
Failed to load Mobile Device Locator plugin, etc.
但是,这适用于Xcode 5.1的发布版本。
echo <password> | sudo -S -u username xcrun instruments
注意我删除了不需要的su命令并添加了xcrun命令。 xcrun是需要的魔力。
这是我的完整命令:
echo <password> | sudo -S -u username xcrun instruments\
-w "iPhone Retina (3.5-inch) - Simulator - iOS 7.1"\
-D "${PROJECT_DIR}/TestResults/Traces/Traces.trace"\
-t "${DEVELOPER_DIR}/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate"\
"${BUILT_PRODUCTS_DIR}/MyApp.app"\
-e UIARESULTSPATH "${PROJECT_DIR}/TestResults"\
-e UIASCRIPT "${PROJECT_DIR}/UITests/main.js"
顺便说一下,如果你输入:
instruments -s devices
您将获得可用于-w选项的所有受支持设备的列表。
修改:要让不同的人检查项目,请更换以下内容:
echo <password> | sudo -S -u username xcrun instruments
与
sudo -u ${USER} xcrun instruments
由于您只是对同一用户执行sudo,因此无需密码。
答案 4 :(得分:0)
看一下本教程,该教程解释了如何使用Jenkins进行自动UI测试。它虽然在教程中也使用了Jasmine。 http://shaune.com.au/automated-ui-testing-for-ios-apps-uiautomation-jasmine-jenkins/希望这会有所帮助。它有一个示例项目文件,因此您可以将其下载为模板。希望这会有所帮助。
答案 5 :(得分:0)
在XCode中 - 如果你加载组织者(XCode-&gt; Window-&gt; Organizer)
然后在设备下选择您的机器 - &gt; &#39;启用开发者模式&#39;
这样就不需要使用乐器提示了。