防止重新评估XCUIElementQuery

时间:2017-04-20 03:06:12

标签: xctest xcode-ui-testing

在Xcode中关于UI测试的WWDC会议中,您可以了解在实际合成属性或读取值时会对查询进行评估。

  

那么什么时候评估查询?因此,只有在创建它们时才会对它们进行实际评估。

     

按需或按需评估它们。这意味着使用元素时,将在合成事件或读取属性值时评估查询。

     

您可以创建元素,但在使用之前,不会对查询进行评估。类似地,如果直接创建查询,则在获得匹配数时或者如果您调用返回所有匹配项的API之一时将对其进行评估。它必须在那时进行评估,我们将在UI更改时重新评估查询。因此,您始终使用应用程序的最新视图而不是十秒前或两分钟前的数据,具体取决于测试的长度。因此,通过这种方式,您可以将查询和元素视为与URL有些相似。

总是确保您正在使用UI的最新状态,这很好,但它可能非常慢并且阻止您执行需要高速的测试。请参阅以下内容:

CFTimeInterval startTime = CACurrentMediaTime();
XCUIElement *button = [[XCUIApplication alloc] init]/*@START_MENU_TOKEN@*/.scrollViews/*[[".windows[@\"\\n[FYB Debug]: Reachability Flag Status: -R t------ networkStatus\"].scrollViews",".scrollViews"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.otherElements.buttons[@"StartSDK_Button"];
[button tap];
[button tap];
[button tap];
[button tap];
[button tap];
CFTimeInterval endTime = CACurrentMediaTime();

NSLog(@"EXECUTION TIME = %f", endTime - startTime);

2017-04-20 11:04:03.381102+0800 XCTRunner[6368:854885] EXECUTION TIME = 5.619870

所以我想知道,有没有办法在测试期间临时更改该行为并仅查询元素一次?

1 个答案:

答案 0 :(得分:0)

我遇到类似的问题,需要在桌面视图上进行非常快速的垂直滑动。没有找到使用XCTest框架加速事件的方法我最终构建了一个相当棘手的解决方法:不是通过XCTest框架请求点击/滑动手势我向一个能够控制鼠标的定制开发的mac应用程序发送请求主机的指针。 如果您只是在模拟器上进行测试,那么它将非常好用且易于使用。

将重复点击XCUIElement

的示例测试
func testMultipleTap() {
    let app = XCUIApplication()
    app.launch()

    host.connect()

    let btn = app.buttons["mybutton"]

    let mouseClick = SBTUITunneledHostMouseClick(element: btn, completionPause: 0.05)

    let mouseCliks = Array(repeating: mouseClick, count: 3)
    host.execute(mouseCliks)
}

host是允许您与mac应用程序通信的对象。

该项目可在GitHub上找到。