【问题标题】:UI test fails when it types text into a text view when run by an Xcode bot由 Xcode 机器人运行时在文本视图中键入文本时 UI 测试失败
【发布时间】:2016-01-26 08:03:45
【问题描述】:

我有以下 XCTest UI 测试,可将文本键入文本视图。

let textView = app.textViews.elementBoundByIndex(0)
textView.tap()
textView.typeText("Hello world")

当作为 Xcode 机器人运行时,它会为 typeText 调用显示以下错误。

断言:UI 测试失败 - 失败:等待关键事件完成超时

有趣的是,当我在同一台计算机上从 Xcode 手动运行它时,测试通过了。在升级到 Xcode 7.1 / iOS 9.1 之前,该测试也在 Xcode bot 中通过。问题的根源是什么?

这是一个带有 UI 测试的独立演示: https://github.com/exchangegroup/UITestTextViewDemo

iOS 9.1 模拟器、OS X 10.11.1 (15B42)、Xcode 7.1 (7B91b)、OS X Server 5.0.15 (15S4033)

向 Apple 报告。

【问题讨论】:

  • Apple 在 XC7.1/iOS 9.1 更新中搞砸了 Bots。我们的绿色测试套件瞬间变成了红色。失败并出现此错误,“超时等待屏幕截图”或“超时启动 sim”。我真的希望 XC7.2 能解决这个问题。
  • 我遇到了同样的问题。我不认为我有一个“修复”,但我发现如果我“等待”一段时间,有时测试会通过。我的特殊问题是具有内部“内容可编辑”字段的 WKWebView,但这里的原理是相同的。在编辑器上“点击”后,我发出运行循环等待: NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 3))
  • 有什么新东西吗?我在 xcode 7.3.1 中遇到了同样的问题

标签: ios swift uitextview xcode-ui-testing


【解决方案1】:

我认为根本问题是“连接硬件键盘”默认处于打开状态。即使您为主用户关闭它,_xcsbuildd 用户仍然使用默认值。我能够通过使用以下脚本向方案添加预测试操作来解决问题:

if [ `defaults read com.apple.iphonesimulator ConnectHardwareKeyboard` -eq 1 ]
 then
  defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool false
  killall "Simulator"
fi

【讨论】:

  • 脚本真的很有用,我总是要记住在我的开发机器上运行测试时禁用硬件键盘。我从未在 Xcode Server 上遇到过这个问题,但确保它按预期工作很有用。
【解决方案2】:

我找到了适合我的案例的解决方案,希望对您也有帮助。

在我的setUp()tearDown() 中(我知道这似乎是多余的)我输入了XCUIApplication().terminate()。这是为了确保在运行下一个测试之前终止应用程序,并且它似乎正在完成这项工作。

override func setUp() {
    XCUIApplication().terminate()
    super.setUp()
    continueAfterFailure = false
    XCUIApplication().launch()
}
override func tearDown() {
    super.tearDown()
    XCUIApplication().terminate()
}

我向 Apple 提交了一个错误,但目前这让我绕过了您看到的错误。希望对您有所帮助!

【讨论】:

    【解决方案3】:

    我发现了另一种解决方案,因为 Konnor 提出的解决方案对我不起作用:我在 Xcode Bot 上使用 UITest 时遇到了很多问题,常见的症状是在模拟器上进行测试所花费的时间比在本地机器上,所以我认为用于运行测试的 _xcsbuildd 用户在某种程度上变慢了。

    我的解决方案很简单:只需将 _xcsbuildd 用户提升为“普通”用户即可。这还有另一个好处:如果您愿意,您可以使用该用户登录并在集成期间查看模拟器中运行的测试,因此更容易调试!

    我是这样做的:

    sudo dscl . -create /Users/_xcsbuildd UserShell /bin/bash
    sudo dscl . -create /Users/_xcsbuildd FirstName Xcode
    sudo dscl . -create /Users/_xcsbuildd LastName Server
    sudo dscl . -create /Users/_xcsbuildd FullName "Xcode Server"
    sudo dscl . -create /Users/_xcsbuildd PrimaryGroupID 20
    

    然后修改密码:

    sudo dscl . -passwd /Users/_xcsbuildd
    

    我无法让用户显示在快速登录窗口中,无论如何您应该会看到一个“其他用户”,您可以在其中插入用户名“_xcsbuildd”和您选择的密码

    【讨论】:

      【解决方案4】:

      我也遇到了这个问题。我编写了一个 UI 测试来使用 Snapshot (fastlane) 捕获屏幕截图,它在 iPad Air & Pro 模拟器上运行良好。但是,在 iPad Retina 或 iPad 2 模拟器上,我收到此错误消息,无论是从命令行运行还是直接从 Xcode 运行。

      我的一个解决方案是在 typeText() 语句之间添加一些 sleep() 函数,然后错误就消失了。

      编辑:这仅修复了从 Xcode 手动运行,通过命令行仍然会导致测试失败。我还注意到它适用于所有 64 位设备的模拟器,但不适用于早期的设备。

      编辑 2:我找到了解决此问题的方法,方法是使用 iOS 9.0 模拟器而不是 iOS 9.3,如此答案中所述:https://stackoverflow.com/a/36334816/5334132。这似乎是一个很好的解决方法,直到它在新版本的 Xcode 中得到修复。

      【讨论】:

        【解决方案5】:

        除了连接硬件键盘之外,这些东西都没有真正适合我。起作用的是在系统设置中关闭 Mac 的屏幕保护程序并显示睡眠。我的怀疑是,当 Mac 被锁定或没有显示器可供绘制时,模拟器会表现异常。

        关闭这两个设置后,我仍然会遇到一些随机的 UI 测试失败。连接硬件监视器或屏幕共享以便将模拟器绘制在某处的屏幕上似乎可以解决这些问题。

        【讨论】:

          【解决方案6】:

          我正在使用 xcode 8.2.1 并在 ios 9.3 版本上运行测试。一个简单的技巧是在点击文本框后和输入之前添加 2-5 秒的睡眠。不过,这不是一个永久的解决方案。

          另一个可靠的解决方案

          在运行测试之前取消选择设置中的所有键盘首选项。

          "KeyboardAllowPaddle": false,
          "KeyboardAssistant": false,
          "KeyboardAutocapitalization": false,
          "KeyboardAutocorrection": false,
          "KeyboardCapsLock": false,
          "KeyboardCheckSpelling": false,
          "KeyboardPeriodShortcut": false,
          "KeyboardPrediction": false,
          "KeyboardShowPredictionBar": false
          

          【讨论】:

            猜你喜欢
            • 2015-10-04
            • 2017-07-07
            • 1970-01-01
            • 2014-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-04
            • 1970-01-01
            相关资源
            最近更新 更多