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

Ошибка утверждения: ошибка тестирования пользовательского интерфейса - атрибуты сбоя для элемента

При тестировании пользовательского интерфейса в Xcode (7.2 и 7.3) мои тесты иногда терпят неудачу с скорее общей ошибкой:

Ошибка подтверждения: ошибка тестирования пользовательского интерфейса - атрибуты сбоя для элемента

Я пытаюсь получить эту ошибку при вызове .hittable или .tap() элемента, но я не могу сказать почему. Я проверил, что элементы, с которыми я имею дело со всеми, имеют правильную настройку доступности, и что все виды контейнеров, в которых они находятся, не имеют accessibilty. Увы, это, похоже, не устраняет проблему.

Журнал консоли показывает:

UI Testing Failure - Failure fetching attributes for element <XCAccessibilityElement: 0x7e68ae50> pid: 89032, context: 4D9272C7-3024-4062-B0FA-E16EF426F17A, payload: {
    pid = 89032;
    "uid.elementID" = 1432;
    "uid.elementOrHash" = 2125772976;
}: Error Domain=XCTestManagerErrorDomain Code=13 "Error copying attributes -25202" UserInfo={NSLocalizedDescription=Error copying attributes -25202}

Я пробовал поиск и нашел, что он уже зарегистрирован, но, похоже, нет текущего решения (радарная ссылка) даже для Xcode 7.3.

Кажется, что иногда, если я перезапускаю симулятор/устройство, эта ошибка не возникает, но это не очень хорошее решение.

4b9b3361

Ответ 1

Вы можете временно использовать XCUICoordinate.tap() в качестве альтернативы. Например, замените button.tap() на button.coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.5)).tap().

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

Ответ 2

У меня есть эта проблема. Он появился после одного исправления, поэтому я выяснил, что может вызвать это в моем случае.

В моем приложении у меня есть "главный" экран. Это содержимое возвращается с сервера и кэшируется на устройстве. Этот экран приводит пользователей к различным "подробным" экранам. Каждый раз, когда пользователь возвращается с подробного экрана, на главном экране вызывается метод viewDidAppeare. В этом методе основной экран запрашивает контент. Чтобы предоставить контент, "Менеджер данных" должен либо получить из БД, либо запросить у сервера 2 разных объекта в строгом порядке, чтобы он использовал dispatch_group. Главный экран получает уведомление о новом контенте из вызова dispatch_group_notify, поэтому он асинхронен. К моменту времени, когда dispatch_group_notify выполняется, viewDidAppeare завершено и, как я понимаю, приложение переходит в режим ожидания в течение некоторого небольшого времени. Возможно, механизм тестирования пользовательского интерфейса уже создал дерево элементов доступности.

Когда эта ситуация имеет место и вызывает вызов кода tap на каком-либо элементе на главном экране сразу после просмотра, старые элементы доступности уменьшаются до существования (поскольку иерархия представления была изменена до этого времени), но был вызван метод tap для элемента с особым значением elementID и т.д., который не существует до этого времени. В результате у вас случился сбой.

Ответ 3

Кажется, что код автоматизации выполняется слишком быстро, и хотя у снимка иерархии доступности есть ваш элемент, ваш запрос слишком быстро переходит к следующей инструкции, и в рамках рамки нет возможности действовать метод tap(), который вы отправляете. Я смог свести к минимуму эту ошибку, используя Joe Masilotti вспомогательные функции, чтобы дождаться, когда элементы будут первыми быть hittable, а затем добавит sleep() прежде чем нажимать на этот элемент. Надеюсь, это поможет.

Ответ 4

Я тоже столкнулся с этим. В моем случае, сервер возвращает несколько результатов поискового запроса типа в быстрой последовательности. Целевой элемент быстро всплывает, но не доходит до окончательного запроса. Я решил это, предварительно ожидая существования элемента в первом запросе, через XCTWaiter. Затем поставьте сон, чтобы охватить время всех результатов запроса, а затем ждать, пока элемент не станет беглым. НЕ используйте hittable для первого результата запроса, так как это не будет выполнено, потому что hittable также проверяет, можно ли использовать элементы, но пользовательский интерфейс слишком быстро изменяется для элемента, который будет использоваться.

Было бы лучше, если бы вы могли вызвать только окончательный запрос для целей тестирования или через базу кода. Я также рассматривал использование UIPastboard, чтобы избежать нескольких запросов типа, но, насколько я могу судить, это недоступно для XCTest.

Ответ 5

Я попробовал waitForHittable() из http://masilotti.com/xctest-helpers/, но в моем случае мне пришлось использовать сон (секунды) перед нажатием.

Плюс, не думайте, что методы Джо Масилотти бесполезны. Они великолепны, и я добавил их в расширение XCTest и расширение XCUIElement. Это просто, что waitForHittable() не работал сразу после первого нажатия после загрузки основного экрана моего приложения.