2017-04-20 114 views
0

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

那么何时对查询进行评估?所以他们并没有实际评估,只是当你创建它们。

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

您可以创建该元素,但在您使用它之前,不会评估该查询。同样,如果您直接创建查询,则会在您获得匹配数时或者您调用返回所有匹配的API之一时对其进行评估。它将不得不在这一点上进行评估,我们将在UI更改时重新评估查询。因此,根据测试的长度,您总是使用最新的应用程序视图,而不是十秒前或两分钟前的数据。所以通过这种方式,您可以将查询和元素与URL有点类似。

这是非常好的事,以确保您正在使用最新的UI状态,但它可能会非常缓慢,并阻止您执行需要高速度的测试。看到以下内容:

CFTimeInterval startTime = CACurrentMediaTime(); 
XCUIElement *button = [[XCUIApplication alloc] init]/*@[email protected]*/.scrollViews/*[[".windows[@\"\\n[FYB Debug]: Reachability Flag Status: -R t------ networkStatus\"].scrollViews",".scrollViews"],[[[-1,1],[-1,0]]],[0]]@[email protected]*/.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 

所以我想知道,有没有办法在测试过程中暂时改变这种行为和查询元素只有一次?

回答

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