Swift 3更新后,iOS UITests无法执行基本操作

时间:2017-02-27 11:13:04

标签: ios swift3 xcode-ui-testing

在我的iOS中,我使用XCUITest实现UITests。自从我使用Swift 2.3以来它运行得很好,但在将应用程序更新为Swift 3后,tap()之类的基本操作不再适用。

只是一个不再有效的简单代码:

XCUIApplication().buttons["orgMenu"].tap()

引发

Assertion Failure: <unknown>:0: UI Testing Failure - Failure getting snapshot Error Domain=XCTestManagerErrorDomain Code=9 "Error -25204 getting snapshot for element <AXUIElement 0x7f8297d15a50> {pid=32375}" UserInfo={NSLocalizedDescription=Error -25204 getting snapshot for element <AXUIElement 0x7f8297d15a50> {pid=32375}}

按钮的名称是正确的:如果我记录测试并点击按钮,则上面的行就是我得到的。

按钮在视图中,因为我等待它的存在(手动尝试,通过断点,并以编程方式尝试:

let exists = NSPredicate(format: "exists == 1")
expectation(for: exists, evaluatedWith: XCUIApplication().buttons["orgMenu"], handler: nil
waitForExpectations(timeout: time, handler: nil)

无论如何,它在Swift 3之前有效。 任何的想法?提前谢谢!

2 个答案:

答案 0 :(得分:0)

我只是回答我自己的问题,因为我找到了解决方法。

由于Swift3,由于某种原因,UI测试无法管理loadMore模式的视图。如果我在我的视图中有一个TableView和代码中的某处,则手动管理loadMore模式,在测试中我点击一个按钮,loadMore以一种无限循环调用,并且开销应用程序的资源,使测试失败。

解决方法:如果正在运行UI测试,请停用任何loadMore

在测试中&#39;设置:

override func setUp() {
    super.setUp()
    let app = XCUIApplication()

    continueAfterFailure = false
    app.launchEnvironment = ["isUITest":"YES"]
    app.launch()
}

在带有loadData的视图中:

-(void)loadMore
{
    if ([Utils isRunningUITest]) {
        return;
    }
    // My actual function.
}

和我的实用程序

+(BOOL)isRunningUITest {
    NSDictionary *environment = [[NSProcessInfo processInfo] environment];
    return environment[@"isUITest"];
}

抱歉Swift和Objective-C混合,希望这对某人有帮助。

答案 1 :(得分:0)

您可以尝试执行以下操作:

let app = XCUIApplication()
XCTAssert(app.buttons["orgMenu"].waitForExistence(timeout: 10))
app.buttons["orgMenu"].tap()