【问题标题】:XCTestCase: Wait for app to idleXCTestCase:等待应用空闲
【发布时间】:2015-11-10 07:12:29
【问题描述】:

我的 UI 测试失败,因为测试无休止地等待,直到应用空闲。我看不到后台发生了什么,比如加载微调器。

它只出现在一个标签上。所有其他选项卡都是可点击的,但屏幕 3 上的测试失败。我在屏幕 3 上捕获测试后单击另一个选项卡,测试继续并成功完成。

有什么想法吗?

- (void)testExample
{

    XCUIElementQuery* tabBarsQuery = self.app.tabBars;

    [tabBarsQuery.buttons[@"Screen2"] tap];
    [tabBarsQuery.buttons[@"Screen3"] tap];
    [tabBarsQuery.buttons[@"Screen1"] tap];
    [tabBarsQuery.buttons[@"Screen4"] tap];

}

【问题讨论】:

    标签: ios xcode7 xcode-ui-testing xctestcase


    【解决方案1】:

    也许您有一些动画或其他一些后台(或前台)活动,它们经常在主线程上更新您的 UI。这会导致应用程序永远不会“停顿” - 至少在此选项卡上。在我们的应用程序中,我们有带有重复选项的 UIView 动画。 CPU 使用率很好,也没有消耗电池,但每次测试都失败了。禁用动画解决了这个问题。我找不到强制测试不等待空闲的方法,所以我们最终禁用了动画使用#ifdef for UI test target使用运行时参数,如下所述:https://stackoverflow.com/a/33466038/168996

    【讨论】:

    • 很奇怪。必须有一种方法可以强制测试过程忽略动画......动画在应用程序中很正常,不是吗?动画对测试流程没有任何意义。仅仅因为某物在移动并不意味着在 UI 中不能点击另一个按钮。
    • 也许这只是早期版本中 XCTest 的一个错误。我不是 100% 确定,但我认为这现在工作正常,即有一个重复的动画,但它并没有通过测试。
    【解决方案2】:
    let tabBarsQuery = self.app.tabBars
    let button = tabBarsQuery.buttons[@"Screen2"]
    

    在编写 UI 测试用例时,系统需要时间使其可点击,因此我们正在为其创建谓词并等待按钮。

    let predicate = NSPredicate(format: "isHittable == 1") expectation(for: 
    predicate, evaluatedWith: button, handler: nil)
    waitForExpectations(timeout:10, handler: nil)
    button.tap()
    

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2019-07-07
    • 2023-02-03
    • 1970-01-01
    • 2017-03-02
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多