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

Posted

技术标签:

【中文标题】Swift 3 更新后 iOS UITests 无法执行基本操作【英文标题】:iOS UITests can't do basics actions after Swift 3 update 【发布时间】:2017-02-27 11:13:03 【问题描述】:

在我的 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 之前就可以使用。 任何的想法?提前致谢!

【问题讨论】:

您可以在模拟器中手动点击按钮,使用相同的构建版本而不会使应用崩溃吗? @Oletha,是的,我可以 【参考方案1】:

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

从 Swift3 开始,出于某种原因,UI 测试无法使用 loadMore 模式管理视图。如果我在我的视图中有一个TableView 并且在代码中的某个位置手动管理loadMore 模式,并且在测试中我点击一个按钮,loadMore 在一种无限循环中被调用,这会占用应用程序的资源,导致测试失败。

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

在测试设置中:

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 的混合感到抱歉,希望这对某人有所帮助。

【讨论】:

NSProcessInfo 的环境属性是只读的。这对我不起作用。【参考方案2】:

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

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

【讨论】:

以上是关于Swift 3 更新后 iOS UITests 无法执行基本操作的主要内容,如果未能解决你的问题,请参考以下文章

UI 测试 - isSelected 总是返回 false

如何在 swift UITests 中的 XCUIApplication 中设置暗模式?

UITests:如何测试标签是不是在更改后包含一些文本?

Xcode8/Swift 3 更新后缺少 Firebase 标头警告

Xamarin.UITests - 在真实设备上进行测试 - iOS - 应用权限弹出窗口问题

从 iOS 的 UITests 中读取 Info.plist?