Подтвердить что ты не робот

Запуск сценариев UIAutomation из Xcode

Кто-нибудь преуспел в настройке автоматических тестов UIAutomation в Xcode?

Я пытаюсь настроить цель в моем проекте Xcode, который должен запускать все сценарии UIAutomation, которые я подготовил. В настоящее время единственным Фазой сборки этой цели является этот Запуск Script:

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

Когда я создаю эту цель, она завершается через несколько секунд, но script фактически не запускается. В журнале сборки я получаю следующие ошибки:

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 и мой run script оба правильны, потому что, если я запустил ту же самую команду инструментов в bash, она работает так, как ожидалось. Может ли это быть ошибкой в ​​Xcode?

4b9b3361

Ответ 1

Наконец, я нашел решение этой проблемы. Кажется, что Xcode запускает Run Scripts с ограниченными правами. Я не совсем уверен, что приводит к сбою команды инструментов, но с помощью su для изменения вашего пользователя это исправит.

su $USER -l -c <instruments command>

Очевидно, что это потребует вашего пароля, но вы не можете ввести его при запуске как script. Я не нашел способ указать пароль для su, однако если вы запустили его как root, вам не нужно указывать его. К счастью, sudo может принимать пароль через канал:

echo <password> | sudo -S su $USER -l -c <instruments command>

Если вы не хотите жестко указывать свой пароль (всегда плохая идея), вы можете использовать AppleScript для запроса пароля.

Я отправил итоговый script ниже. Скопируйте это в файл *.sh в своем проекте и запустите script из Run script.

#!/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

Ответ 2

Кажется, что это действительно может быть проблемой Xcode; во всяком случае, по крайней мере один человек подал отчет о радаре. Кто-то из этого другого потока утверждает, что вы можете обойти это исключение, отключив любые iDevices, которые в настоящее время подключены к компьютеру, но я подозреваю, что это не применяется, когда вы пытаетесь для запуска script в качестве цели Xcode.

Я бы предложил подать радарный отчет; вы можете получить более подробную информацию об этой проблеме от Apple или, по крайней мере, убедить их, что многие люди имеют проблему, и они должны выяснить, что происходит.

Извините за неправдоподобный ответ (должен был быть комментарий, но комментарии и ссылки/форматирование не очень хорошо сочетаются). Пожалуйста, обновите этот вопрос, если вы узнаете о проблеме.

Ответ 3

Примечание. Это не прямой ответ на вопрос, но это альтернативное решение основной проблемы.

При поиске углубленной информации о UIAutomation я наткнулся на фреймворк с помощью Square под названием KIF (Keep it functional). Это платформа тестирования интеграции, которая позволяет использовать многие из тех же функций, что и UIAutomation, но главное в том, что вы можете просто написать свои интеграционные тесты в Objective-C.

Очень легко настроить (через CocoaPods), у них также есть хорошие примеры, и самое лучшее, что вам нужно настроить вашу систему CI, например, Jenkins.

Посмотрите: http://github.com/square/KIF

Ответ 4

Поздно к игре, но у меня есть решение, которое работает для 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 для одного и того же пользователя, пароль не требуется.

Ответ 5

Взгляните на этот учебник, в котором объясняется, как иметь автоматическое тестирование пользовательского интерфейса с Jenkins. Тем не менее, он использует Jasmine в учебнике. http://shaune.com.au/automated-ui-testing-for-ios-apps-uiautomation-jasmine-jenkins/ надеюсь, что это поможет. В нем есть пример файла проекта, поэтому вы можете загрузить его в качестве шаблона. Надеюсь, это поможет.

Ответ 6

В XCode - если вы загружаете организатор (XCode- > Window- > Organizer)

Затем выберите устройство под устройствами → "Включить режим разработчика"

Это должно устранить необходимость в подсказках с инструментами.