it-roy-ru.com

Assertion Failure: UI Testing Failure - Ошибка получения атрибутов для элемента

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

Assertion Failure: UI Testing Failure - Ошибка получения атрибутов для элемента

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

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

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.

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

22
Gordonium

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

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

4
Jeremy Kao

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

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

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

3
xaoc1024

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

2
Citronex

Я тоже с этим столкнулся. В моем случае сервер возвращает результаты нескольких поисковых запросов в виде быстрой последовательности подряд. Целевой элемент всплывает быстро, но не всегда доступен до последнего запроса. Я решил эту проблему, дождавшись существования элемента в первом запросе через XCTWaiter. Затем поместите режим сна, чтобы охватить время всех результатов запроса, а затем ожидайте, пока элемент попадет в таблицу. НЕ ИСПОЛЬЗУЙТЕ hittable для первого результата запроса, так как это не удастся, потому что hittable также проверяет, можно ли постукивать по элементам, но пользовательский интерфейс меняется слишком быстро для того, чтобы прикасался к элементу.

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

2
BrandonZZ

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

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

0
Hasaan Ali