iOS Instruments Automation setValue не работает

Я просто хочу протестировать свой пользовательский интерфейс iOS с помощью автоматизации пользовательского интерфейса, но я застрял, когда дело доходит до ввода текста в UITextFields. В документации сказано, что метод "setValue(...)" должен сработать, но это не так.

Я всегда получаю эту ошибку:

Script threw an uncaught JavaScript error: Unexpected error in -[UIATextField_0x9952690 setValue:], /SourceCache/UIAutomation_Sim/UIAutomation-271/Framework/UIAElement.m line 1142, kAXErrorSuccess on line 15 of login.js, #0 setValue() 

Код выглядит следующим образом:

var textfields = UIATarget.localTarget().frontMostApp().mainWindow().textFields();
username = textfields["username"];
username.setValue("test");

Поле имени пользователя не пустое и не неопределенное.

Моим вторым решением был этот проект JS: https://github.com/alexvollmer/tuneup_js#readme У него есть метод typeString для текстовых полей, но он немного глючит и не работает, когда дело доходит до ввода цифр и заглавных букв.

Я работаю с iOS6.1, Instruments версии 4.6 (46000), Xcode версии 4.6 (4H127).

Любая помощь приветствуется!


person ralphbert    schedule 13.02.2013    source источник
comment
Хм. Я могу установить значение текстовых полей в своем приложении с помощью автоматизации пользовательского интерфейса. Ваш код автоматизации выглядит правильно. Я подозреваю, что что-то не так в мире Objective C. Используете ли вы собственный подкласс UITextField? Можете ли вы создать фиктивное приложение с одним текстовым полем и попытаться установить значение этого поля на своем компьютере? Это может помочь отследить проблему.   -  person Jonathan Penn    schedule 14.02.2013
comment
В других проектах работает функция setValue(). Я думаю, что проблема вызвана незаконченной анимацией. когда пользователь нажимает на текстовое поле, основное представление прокручивается вверх, чтобы быть видимым, когда появляется клавиатура. target.delay(1) делает то, что я искал, и теперь работает функция setValue().   -  person ralphbert    schedule 18.02.2013


Ответы (2)


Проверьте, работает ли ниже для вас,

цель.задержка(1); UIATarget.localTarget().frontMostApp().mainWindow().textFields()["имя пользователя"].tap(); цель.задержка(1); UIATarget.localTarget().frontMostApp().mainWindow().textFields()["имя пользователя"].setValue("test");

Проверьте правильность иерархии, если она у вас не работает.

person San27    schedule 15.02.2013
comment
Кажется, что target.delay(1) сделал свое дело. Ваш код отлично работает для меня, спасибо! - person ralphbert; 18.02.2013

Я пришел сюда, пытаясь понять, как работают сценарии автоматизации пользовательского интерфейса, поскольку документации и примеров кода действительно не хватает (или они написаны с очень конкретной точки зрения, которая не объясняет все случаи).

Вот две вещи по этому вопросу, которые я узнал:

  1. Прежде всего, вы должны включить специальные возможности для элемента. Я отключил его в своих испытаниях, и все вело себя очень странно, пока я снова не включил его (получив аналогичную «неожиданную ошибку», как и вы). Поэтому убедитесь, что у вас включен доступ к специальным возможностям. Но обратите внимание, что некоторые вещи по-прежнему работают, даже если он отключен. Например, вы по-прежнему можете найти элемент по его имени (accessibilityIdentifier), но не сможете коснуться его или вызвать setValue().

введите здесь описание изображения

  1. Вы должны копаться в иерархии приложений. Мое предположение заключалось в том, что присвоение элементу accessibilityIdentifier позволит мне просто найти элемент с этим идентификатором, например getElementById в HTML. Но это не совсем не так. Вы должны копаться в своей иерархии уровень за уровнем, даже при использовании идентификатора доступа. К счастью, вы можете использовать UIAElement.logElementTree(), чтобы получить некоторые подсказки относительно правильной иерархии.

Пока я совсем не впечатлен этой структурой, но я очень медленно продвигаюсь вперед.

person devios1    schedule 29.10.2015