【问题标题】:Prevent XCUIElementQuery from being reevaluated防止重新评估 XCUIElementQuery
【发布时间】:2017-04-20 03:06:11
【问题描述】:

在关于 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

所以我想知道,有没有办法在测试期间临时改变这种行为并且只查询一次元素?

【问题讨论】:

    标签: xctest xcode-ui-testing


    【解决方案1】:

    我遇到了类似的问题,需要在表格视图上快速垂直滑动。没有找到使用 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上可用。

    【讨论】:

      猜你喜欢
      • 2014-03-04
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多