Не могу коснуться второго элемента в массиве

Я пытаюсь коснуться UITextField с помощью Calabash. Когда я использую query("UITextField")[x], где x — число в массиве текстовых полей на экране, я могу правильно запросить только одно текстовое поле. Однако, когда я использую touch("UITextField")[x], он всегда будет касаться первого текстового поля. Это происходит при использовании консоли и при использовании огурца для запуска тестов.

Вот соответствующая информация о моей настройке:

xcode-select --print-path
/Applications/Xcode.app/Contents/Developer

xcodebuild -version
Xcode 7.2
Build version 7C68

calabash-ios version
0.16.4

person Bill L    schedule 04.01.2016    source источник


Ответы (1)


Пытаться

touch("UITextField index:x")

где x == your index.

Также, пожалуйста, обновитесь до calabash 0.17.0 :)

Объяснение

Среда Calabash состоит из клиента и сервера. Сервер работает на устройстве/симуляторе как часть приложения и получает команды/запросы от клиента. В этом случае клиент — это ruby-интерфейс, через который вы взаимодействуете с приложением.

Клиент отвечает за отправку на сервер достаточной информации для выбора объектов, на которых будут выполняться жесты. После выполнения жестов/запросов результаты отправляются обратно клиенту в виде json/хэшей, что вы и видите в консоли. Различие важно: сервер выполняет запросы, а клиент — нет.

К тому времени, когда вы видите результаты запроса/жеста в консоли irb, он уже был выполнен: возвращаемый json просто представляет состояние представлений, не сами фактические представления.

Итак, когда вы бежите

touch("UITextField")[index]

Это на самом деле эквивалентно

touch_results = touch("UITextField")
touch_results[index]

В первой строке touch_results получает json-представление элементов, затронутых выполнением touch результатов запроса "UITextField", что означает, что событие touch уже завершилось к тому времени, когда вы пытаетесь получить доступ к результатам с помощью touch_results[index].

Другой способ думать об этом таков: учитывая res = touch(query), query — это часть, используемая для указания фактических представлений, а res — это просто json, который представляет состояние этих представлений/результатов запроса или жеста.

В заключение

Если вам нужна дополнительная конкретизация запроса, спецификаторы должны находиться внутри запроса. Например.,

touch("all UIScrollView UITextField marked:'some text' index:2")

(это будет искать все UIScrollViews , найдет все UITextFields внутри них, которые содержат текст, соответствующий 'some text' и вернуть третий из таких результатов).

Полное объяснение синтаксиса языка запросов см. в документах.

person Christopher Fuentes    schedule 04.01.2016
comment
Это сделало это! Ваше объяснение также имеет массу смысла, спасибо, что включили его! - person Bill L; 05.01.2016