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

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

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

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

Было бы лучше, однако, если бы был способ очистить кеш напрямую или принудительно и обновить. Я не нашел его в 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")

Ответ 1

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

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

// examine
print(XCUIApplication().debugDescription)

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

Ответ 2

Вы должны использовать 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 секунды.

Ответ 3

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

Итак, вам нужно wait немного, используйте функцию wait здесь fooobar.com/questions/51704/...

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

Но вышесказанное просто обходное и очень шелушащееся. Более правильным подходом было бы ожидать появления определенного элемента, см. fooobar.com/questions/624316/...

Ответ 4

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

import XCTest

// 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.

extension XCUIElement {
    func updateAccessibilityCache() {
        _ = try? snapshot()
    }
}