Есть ли способ очистить/обновить кеш иерархии доступности
У меня есть тест пользовательского интерфейса, который проверяет значение статического текстового элемента, ждет несколько секунд и снова проверяет подтверждение изменения. Сначала он не работал, потому что иерархия не обновлялась. Я заметил это в журнале;
Используйте кэшированную иерархию доступности для
Я применил обходной путь для этого, просто добавив кран в меню и открыв/закрыв его, чтобы было синтезировано событие и обновлена иерархия.
Было бы лучше, однако, если бы был способ очистить кеш напрямую или принудительно и обновить. Я не нашел его в 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()
}
}