Вопрос:

Xcode UITest иногда не находит свойства XCUIElement

xcode properties xcode-ui-testing xcuitest

3964 просмотра

3 ответа

7628 Репутация автора

В моих тестах пользовательского интерфейса свойство frame у одних XCUIElementнайдено, а у других нет.
Используемые ниже идентификаторы доступности устанавливаются в раскадровке и appинициализируются setUp()как XCUIApplication().

Вот схема раскадровки:

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

В тесте используются два элемента пользовательского интерфейса: текстовое поле и кнопка добавления .

Вот соответствующий код:

func test() {
    // given
    let mainViewNavigationBar = app.navigationBars[„NavBar“]
    let navBarHeight = mainViewNavigationBar.frame.size.height
    print("navBarHeight: \(navBarHeight)") // is printed out correctly

    let addShoppingItemTextField = app.textFields["TextField"]
    let textFieldHeight = addShoppingItemTextField.frame.size.height // error breakpoint here
    print("textFieldHeight: \(textFieldHeight)")
}

Тест останавливается на контрольной точке ошибки во второй последней строке со следующим сообщением:

No matches found for Find: Descendants matching type TextField from input {(
    Application, 0x60000019f070, pid: 13114, label: ‚xxx‘
)}

Я не понимаю, почему frameсвойство, которое должно быть определено для всех XCUIElement, находится в первом случае, а не во втором.

РЕДАКТИРОВАТЬ

Oletha указал ниже, что моя константа addShoppingItemTextFieldявляется , XCUIElementQueryчто должно быть решено , когда я пытаюсь прочитать frameсвойство объекта textField.
Действительно, когда программа останавливается на контрольной точке ошибки и я печатаю ее описание, я получаю

Printing description of addShoppingItemTextField:
Query chain:
 →Find: Target Application 0x6080000a6ea0
  ↪︎Find: Descendants matching type TextField
    ↪︎Find: Elements matching predicate '"TextField" IN identifiers'  

Но поиск завершается неудачно, хотя Accessibility включен, и Accessibility Identifier установлен в TextField:

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

Я тоже вставил в приложение

print(textField.accessibilityIdentifier!)

в viewDidLoad(), и он распечатан TextFieldправильно.

В качестве обходного пути я установил тест на запись и нажал кнопку textField. Это созданный код для доступа к textField. Затем я заменил let addShoppingItemTextField = app.textFields["TextField"]на (правая сторона была сгенерирована записью):

let addShoppingItemTextField = app.otherElements.containing(.navigationBar, identifier:"WatchNotOK")
.children(matching: .other).element.children(matching: .other).element
.children(matching: .other).element

И теперь код работает без ошибок.

Поэтому мне кажется, что запрос идентификатора доступности a textFieldне работает правильно.

РЕДАКТИРОВАТЬ 2

Я сдаюсь: не изменяя ничего в раскадровке, тест теперь останавливается с той же самой ошибкой теста ( не найдено совпадений для Find: совпадения элементов с предикатом «идентификаторы WatchNotOK IN» ) в строке let navBarHeight = mainViewNavigationBar.frame.size.height. Это работало все время.
Это указывает на то, что тесты пользовательского интерфейса XCode не работают.

Автор: Reinhard Männer Источник Размещён: 03.01.2018 10:45

Ответы (3)


0 плюса

4522 Репутация автора

Проблема не в том, что frameсвойство не найдено в элементе, а в том, что сам элемент не может быть найден.

Каждый XCUIElementпроисходит от XCUIElementQuery. Первая попытка выполнить запрос - не то, что вы ожидаете, когда вы присваиваете значение addShoppingItemTextField, а первый раз, когда вы получаете доступ к свойству (отличному от exists) addShoppingItemTextField.

Поэтому, когда вы пытаетесь получить доступ к frameсвойству XCUIElementобъекта, запрос на поиск этого элемента разрешается, но элемент не найден, поэтому вы получаете сообщение «Нет совпадений найдено ...» в строке, к которой вы обращаетесь frame. Это может вводить в заблуждение, но проблема, с которой вы сталкиваетесь, заключается в том, что элемент не может быть найден. Попробуйте настроить ваш запрос.

Автор: Oletha Размещён: 04.01.2018 10:05

14 плюса

7628 Репутация автора

Решение

Я связался с Apple, и они обнаружили мою ошибку:
у accessibilityсвойства моего основного контроллера просмотра было установлено свойство true. Это было неправильно; он должен быть установлен false:

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

Объяснение можно найти в документации к isAccessibilityElement:

Значение по умолчанию для этого свойства равно false, если получатель не является стандартным элементом управления UIKit, в этом случае значение равно true.
Вспомогательные приложения могут получать информацию только об объектах, представленных элементами доступности. Поэтому, если вы реализуете пользовательский элемент управления или представление, которое должно быть доступно пользователям с ограниченными возможностями, установите для этого свойства значение true. Единственным исключением из этой практики является представление, которое просто служит контейнером для других элементов, которые должны быть доступны. Такое представление должно реализовывать протокол UIAccessibilityContainer и устанавливать для этого свойства значение false.

Как только я установил доступность основного представления на false, тест пользовательского интерфейса прошел успешно.

Автор: Reinhard Männer Размещён: 20.01.2018 10:09

1 плюс

350 Репутация автора

В дополнение к приведенным выше ответам ... Я хотел бы добавить одно замечание. Это может произойти из-за того, что элемент XCUIE, к которому вы обращаетесь, недоступен на экране . Предположим, вы выполняете тест-кейс для экрана входа в систему, и симулятор запускается с панели инструментов, а не с экраном входа в систему. Это случилось с моим делом. Я попытался выйти из системы, а затем выполнить контрольный пример. Ошибка исчезает

Автор: pallavi Размещён: 28.05.2019 11:20
Вопросы из категории :
32x32