Есть ли способ очистить/обновить кеш иерархии доступности

У меня есть тест пользовательского интерфейса, который проверяет значение статического текстового элемента, ждет несколько секунд и снова проверяет, чтобы подтвердить изменение. Сначала это не работало, потому что иерархия не обновлялась. Я заметил это в журнале;

Используйте кешированную иерархию доступности для

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

Однако было бы лучше, если бы был способ очистить кеш напрямую или принудительно обновить. Я не нашел его в API. Я что-то упускаю?

Любые идеи?

это то, что я делаю;

XCTAssertEqual(app.staticTexts["myText"].label, "Expected 1")
sleep(20)
menu.tap()
sleep(1)
menu.tap()
XCTAssertEqual(app.staticTexts["myText"].label, "Expected 2")

Что я хотел бы быть в состоянии сделать это

XCTAssertEqual(app.staticTexts["myText"].label, "Expected 1")
sleep(20)
app.elements.refresh()
XCTAssertEqual(app.staticTexts["myText"].label, "Expected 2")

person Robert Schmid    schedule 16.12.2015    source источник
comment
Можете ли вы включить код, который вы используете? Вы используете expectationForPredicate и waitForExpectationsWithTimeout для ожидания или что-то еще?   -  person Michael    schedule 17.12.2015
comment
Сказав это, я пришел сюда из-за аналогичной проблемы. Я делаю myButton.tap(), которая перемещает кнопку на экране, а затем myButton таинственным образом ссылается на другую кнопку, возможно, из-за магии кэширования   -  person Michael    schedule 17.12.2015
comment
добавил код выше. В вашем случае, я думаю, у вас противоположная проблема. Вы нажимаете кнопку, которая синтезирует событие и, таким образом, перезагружает иерархию элементов, поэтому кэш очищается при нажатии кнопки.   -  person Robert Schmid    schedule 17.12.2015


Ответы (4)


Чтобы принудительно обновить иерархию доступности, запросите свойство count для любого XCUIElementQuery:

// refresh
_ = XCUIApplication().navigationBars.count

// examine
print(XCUIApplication().debugDescription)

Приведенный выше результат приводит к следующему результату: «Получить количество совпадений для: Потомки, соответствующие типу NavigationBar» и «Иерархия доступности моментальных снимков для com.myapp».

person Gary    schedule 28.09.2016
comment
Спасибо. Я использую этот помощник, чтобы сделать его удобным (сделано как категория в XCUIElement): [[[[XCUIApplication alloc] init] childrenMatchingType:XCUIElementTypeAny] count]; - person Oleksiy Ivanov; 10.08.2017
comment
У меня это не сработало (Xcode9.3). Обычно все мои представления обновляются в дереве элементов, за исключением очень немногих, которые являются пользовательскими представлениями. Я предполагаю, что разработчик не вызвал какой-то суперметод в некоторых переопределениях в подклассе пользовательского представления, который обновляет присутствие этих элементов в дереве. Хотя это всего лишь предположение. Мой обходной путь, чтобы надежно справляться с такими элементами, состоит в том, чтобы вернуться назад и снова открыть тот же экран, и теперь дерево элементов отражает фактические элементы на экране. - person Hasaan Ali; 25.06.2018

В Xcode 10.2 (10E125) у меня работает следующее:

import XCTest

extension XCUIApplication {
    // WORKAROUND:
    // Force XCTest to update its accessibility cache. When accessibility data
    // like NSObject.accessibility{Label|Identifier} changes, it takes a while
    // for XCTest to catch up. Calling this method causes XCTest to update its
    // accessibility cache immediately.
    func updateAccessibilityCache() {
        _ = try? snapshot()
    }
}
person Rudolf Adamkovič    schedule 03.04.2019

Вы должны использовать expectationForPredicate в соответствии с...

let myText = app.staticTexts["myText"]
let waitFor = NSPredicate(format: "label = 'Expected 2'")
label.tap()
self.expectationForPredicate(waitFor, evaluatedWithObject: myText, handler: nil)
self.waitForExpectationsWithTimeout(2.0, handler: nil)

Это будет ждать, пока метка myText не станет «Ожидается 2» или не будет достигнуто время ожидания 2 секунды.

person Michael    schedule 18.12.2015
comment
Проблема заключается в том, что начиная с Xcode 8.0 (iOS 10) XCUI часто аварийно завершает работу, если вы пытаетесь выполнить waitForExpectationsWithTimeout для панели навигации (или любого из ее дочерних элементов), пока переход контроллера навигации еще не завершен. Вы должны сначала waitForExpectationsWithTimeout для любого другого элемента пользовательского интерфейса, такого как отображаемый вид прокрутки или кнопка, и только затем повторно XCUIElementQuery для панели навигации. - person Gary; 28.09.2016

В моем случае это проблема, потому что я пытаюсь проверить вход в Facebook, который использует Safari controller. Похоже, Facebook обновил пользовательский интерфейс после кеша.

Итак, вам нужно немного wait, используйте функцию wait здесь https://stackoverflow.com/a/42222302/1418457

wait(for: 2)
let _ = app.staticTexts.count

Но это просто обходной путь и очень ненадежный. Более правильным подходом было бы дождаться появления определенного элемента, см. https://stackoverflow.com/a/44279203/1418457< /а>

person onmyway133    schedule 30.05.2017