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.
Кажется, что иногда, если я перезагружаю симулятор / устройство, эта ошибка не возникает, но это не очень хорошее решение.
5 ответов
Вы можете временно использовать XCUICoordinate.tap()
как альтернатива. Например, заменить button.tap()
с button.coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.5)).tap()
,
Я столкнулся с той же проблемой, и обходной путь работает для меня.
У меня есть эта проблема. Он появился после одного исправления, поэтому я выяснил, что может вызвать это в моем случае.
В моем приложении у меня есть "главный" экран. Его содержимое возвращается с сервера и кэшируется на устройстве. Этот экран выводит пользователя на разные "подробные" экраны. Каждый раз, когда пользователь возвращается с подробного экрана, viewDidAppeare
метод вызывается на главном экране. В этом методе основной экран запрашивает контент. Для предоставления содержимого "Диспетчеру данных" необходимо либо извлечь данные из БД, либо запросить с сервера 2 разных объекта в строгом порядке, чтобы он использовал dispatch_group
, Главный экран получает уведомление о новом контенте от dispatch_group_notify
вызов, поэтому он асинхронный. Ко времени, когда dispatch_group_notify
выполняется, viewDidAppeare
Закончено, и, как я понимаю, приложение некоторое время простаивает. Механизм тестирования пользовательского интерфейса, возможно, уже создал дерево элементов доступности.
Когда происходит такая ситуация и проверяется код вызова tap
на каком-то элементе на главном экране сразу после отображения старые элементы доступности перестают существовать (потому что иерархия представления изменилась к тому времени), но tap
Метод был вызван для элемента с определенным elementID
и т. д., которого не существует к тому времени. В результате у вас происходит сбой.
Я тоже с этим столкнулся. В моем случае сервер возвращает результаты нескольких поисковых запросов в виде быстрой последовательности подряд. Целевой элемент всплывает быстро, но не всегда доступен до последнего запроса. Я решил эту проблему, дождавшись существования элемента в первом запросе через XCTWaiter. Затем установите режим сна, чтобы охватить время всех результатов запроса, а затем дождитесь, пока элемент попадет в таблицу. НЕ ИСПОЛЬЗУЙТЕ hittable для первого результата запроса, так как это не удастся, потому что hittable также проверяет, можно ли постукивать по элементам, но пользовательский интерфейс меняется слишком быстро для того, чтобы этот элемент был нажат.
Было бы лучше, если бы вы могли инициировать только последний запрос для целей тестирования или через базу кода. Я также подумал об использовании UIPasteboard, чтобы избежать множественных запросов типа typehahead, но, насколько я могу судить, это недоступно для XCTest.
Кажется, что код автоматизации иногда бывает слишком быстрым, и хотя моментальный снимок иерархии доступности содержит ваш элемент, ваш запрос слишком быстро перемещается к следующей инструкции, и среда не получает возможности действовать при нажатии () метод вы отправляете. Я смог минимизировать эту ошибку, используя вспомогательные функции Джо Масилотти, чтобы дождаться, когда элементы сначала станут хит-таблицами, а затем добавил sleep(), прежде чем коснуться рассматриваемого элемента. Надеюсь это поможет.
Я попытался waitForHittable() с http://masilotti.com/xctest-helpers/ но в моем случае мне пришлось использовать сон (секунды), прежде чем нажать.
Кроме того, не думайте, что методы Джо Масилотти бесполезны. Они великолепны, и я добавил их в расширение XCTest и расширение XCUIElement. Просто waitForHittable() не работала только при первом нажатии после загрузки главного экрана моего приложения.