将 iOS UIAutomation 作为操作后构建脚本运行会作为 posix spawn 错误返回

Posted

技术标签:

【中文标题】将 iOS UIAutomation 作为操作后构建脚本运行会作为 posix spawn 错误返回【英文标题】:Running iOS UIAutomation as a post-action build script is return as a posix spawn error 【发布时间】:2014-07-17 21:26:23 【问题描述】:

我对使用 bash 和 Xcode 构建脚本完全陌生,所以我的代码可能是一个充满错误的丛林。

这里的想法是触发下面的脚本,该脚本将为任何 .js 自动化脚本抓取保存它的目录。然后它将这些脚本发送到仪器,以便一次运行一个。我发现了一些创建时间戳文件的漂亮代码,所以我用它来创建一个更有意义的存储系统。

#!/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="Plans.app"

# 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$"`
echo "$BUILT_PRODUCTS_DIR"
echo "$PRODUCT_NAME"
EXECUTABLE="$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/"
SCRIPTS=`find $ROOT -name '*.js'`

# Prepare traces folder
TRACES="$ROOT/Traces/`date +%Y-%m-%d_%H-%M-%S`"
mkdir -p "$TRACES"

printf "\n" >> "$ROOT/results.log"
echo `date +%Y-%m-%d_%H-%M-%S` >> "$ROOT/results.log"

# 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 "iPhone 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"

# Run all the tests.
for SCRIPT in $SCRIPTS; do
    echo -e "\nRunning test script $SCRIPT"
    TESTC="sudo -u $USER xcrun instruments -l -c -t $TEMPLATE $EXECUTABLE -e UIARESULTSPATH $TRACES/$TRACENAME -e UIASCRIPT $SCRIPT >> $ROOT/results.log"
#echo "$COMMAND"
    echo "Executing command $TESTC" >> "$ROOT/results.log"
echo "here $TESTC" >> "$ROOT/results.log"
    OUTPUT=$(TESTC)

    echo $OUTPUT >> "$ROOT/results.log"
    echo "Finished logging" >> "$ROOT/results.log"
    SCRIPTNAME=`basename "$SCRIPT"`
    TRACENAME=`echo "$SCRIPTNAME" | sed 's_\.js$_.trace_g'`

    for i in $(ls -A1t $PWD | grep -m 1 '.trace')
    do
        TRACEFILE="$PWD/$i"
    done

    if [ -e $TRACEFILE ]; then
        mv "$TRACEFILE" "$TRACES/$TRACENAME"
    fi

    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

其中很大一部分来自另一个 Stack Overflow 答案,但由于我正在使用的存储库设置,我需要保持路径抽象并与脚本的根文件夹分开。除了启动仪器的实际 xcrun 命令外,一切似乎都有效(尽管可能效率不高)。

TESTC="sudo -u $USER xcrun instruments -l -c -t $TEMPLATE $EXECUTABLE -e     UIARESULTSPATH $TRACES/$TRACENAME -e UIASCRIPT $SCRIPT >> $ROOT/results.log"
echo "Executing command $TESTC" >> "$ROOT/results.log"
OUTPUT=$(TESTC)

无论 Bash 运行什么黑魔法,这都会变成以下内容:

sudo -u Braains xcrun instruments -l -c -t 
/Users/Braains/Documents/Automation/AppName/TestCases/UIAutomationTemplate.tracetemplate
/Users/Braains/Library/Developer/Xcode/DerivedData/AppName-
ekqevowxyipndychtscxwgqkaxdk/Build/Products/Debug-iphoneos/AppName.app/ -e UIARESULTSPATH
/Users/Braains/Documents/Automation/AppName/TestCases/Traces/2014-07-17_16-31-49/ -e 
UIASCRIPT /Users/Braains/Documents/Automation/AppName/TestCases/Test-Case_1js 

(^ 为了问题的清晰,插入了换行符^)

我看到的结果错误是:

posix spawn failure; aborting launch (binary == 
/Users/Braains/Library/Developer/Xcode/DerivedData/AppName-
ekqevowxyipndychtscxwgqkaxdk/Build/Products/Debug-iphoneos/AppName.app/AppName).

我已经到处寻找解决方案,但我找不到任何东西,因为 Appium 也有类似的问题。不幸的是,我对系统的了解不够深入,无法知道如何将 Appium 的修复程序转换为我自己的代码,但我想这是一个类似的问题。

我知道 posix spawn 失败与线程有关,但我对 xcrun 的了解还不够,无法说出导致线程问题的原因。

相关信息: - 我正在为模拟器构建,但在真实设备上工作也很棒 - 我正在使用 xCode 5.1.1 和 iOS Simulator 7.1 - 此脚本旨在作为 xCode 中的构建后操作脚本运行 - 在我打破它之前我确实让它短暂工作过一次,并且无法让它恢复到工作状态。所以我认为这意味着我的所有权限都设置正确。

更新:所以我已经找到了这个问题的根源,虽然我还没有找到解决办法。首先,我不知道 xcrun 是干什么用的,所以我放弃了它。然后在玩了之后,我发现我的 Xcode 环境变量返回了错误的路径,可能是因为某处的某些项目设置。如果您从上面复制 Bash 命令,但将 Debug-iphoneos 替换为 Debug-iphonesimulator,则该脚本可以从命令行运行并按预期工作。

【问题讨论】:

【参考方案1】:

因此,对于遇到这种情况的任何人,我能找到的唯一解决方案是硬编码模拟器的脚本。

我将EXECUTABLE="$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/" 更改为EXECUTABLE="$SYMROOT/Debug-iphonesimulator/$EXECUTABLE_PATH"。这显然不是一个很好的解决方案,但它现在有效。

【讨论】:

以上是关于将 iOS UIAutomation 作为操作后构建脚本运行会作为 posix spawn 错误返回的主要内容,如果未能解决你的问题,请参考以下文章

iOS/UIAutomation:如何将 isVisible() 用于第二个未标记工具栏中的按钮?

如何使用 Instruments UIAutomation 测试 iOS Web 应用程序

即使在应用退出后,如何使用 UIAutomation 工具继续测试 iOS 应用?

连接到 Mac 系统时,使用 Xcode UIAutomation 记录 ios 应用程序上的用户交互

有人对 Xcode 的 UIAutomation 有经验吗?

IOS中的UIAutomation错误