我有一个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")
答案 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()
}
}