有没有办法清除/刷新辅助功能层次结构缓存

时间:2015-12-16 19:28:31

标签: xcode-ui-testing

我有一个UI测试,它检查静态文本元素的值,等待几秒钟,然后再次检查以确认更改。起初它没有工作,因为层次结构没有更新。我在日志中注意到了这一点;

使用

的缓存辅助功能层次结构

我已经通过简单地添加一个菜单并打开/关闭它以便合成事件并更新层次结构来为此设置解决方法。

但是,如果有办法直接清除缓存或强制更新,那会更好。我还没有在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")

4 个答案:

答案 0 :(得分:8)

为了强制更新辅助功能层次结构,请为任何count请求XCUIElementQuery属性:

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

// examine
print(XCUIApplication().debugDescription)

以上结果为:" 获取匹配数量:符号类型NavigationBar的后代"和" com.myapp的快照辅助功能层次结构"。

答案 1 :(得分:0)

你应该使用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秒。

答案 2 :(得分:0)

在我的情况下,这是一个问题,因为我试图测试Facebook登录,使用Safari controller。看起来Facebook已经在缓存后更新了UI。

所以你需要wait一点,在这里使用wait函数https://stackoverflow.com/a/42222302/1418457

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

但以上只是解决方法而且非常不稳定。更正确的方法是等待某个元素出现,请参阅https://stackoverflow.com/a/44279203/1418457

答案 3 :(得分:0)

以下在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()
    }
}