【问题标题】:Xcode 11 XCUITest Failed to get matching snapshots: Error getting main window kAXErrorServerNotFoundXcode 11 XCUITest 无法获取匹配的快照:获取主窗口时出错 kAXErrorServerNotFound
【发布时间】:2020-03-04 13:19:14
【问题描述】:

在 Xcode 11 中构建我的应用程序并运行我的 XCUITests 套件后,我遇到了以下许多随机故障。

获取匹配快照失败:获取主窗口 kAXErrorServerNotFound 时出错

无论我将超时时间增加多长时间,问题都会间歇性地弹出。快照 UI 层次结构似乎有问题。我们的测试在 Xcode 10 中始终通过。

我已经重新安装了 Xcode。删除所有模拟器。清除派生数据。修改超时。从 Xcode 11.1 升级到 Xcode 11.2.1。

谢谢!

 

【问题讨论】:

  • 即使我也面临同样的问题,您是否有任何解决方法。

标签: ios xcode xctest xcode11 xcuitest


【解决方案1】:

我在 Xcode 11.3 中运行简单的 UITest 时遇到了匹配问题。为了让它工作,我必须先粘贴:XCUIApplication().activate()XCUIApplication().launch()

【讨论】:

  • 这个答案似乎是要走的路,但在理解它的含义时遇到问题?我应该在哪里输入 XCUIApplication().activiate() 和/或 XCUIApplication().launch()?
  • 在你的 ui 测试函数中
  • Xcode 11.5 我必须使用let app = XCUIApplication() 然后app.activate() 才能克服错误。
  • 这应该是选择的解决方案。
【解决方案2】:

我在使用 Xcode 11 时遇到了同样的问题,并意识到在停止测试时(或者如果测试由于某种原因而崩溃),测试运行程序并没有被杀死。第二次运行测试会产生一个新的测试运行器,此时我有两个运行器试图与同一个应用程序交互,导致这个非常奇怪的错误。

为了证明我做了以下事情:

  1. 创建了一个在文本视图中键入长文本的 UI 测试
  2. 运行测试,当文本视图中有几个句子时手动停止它
  3. 在模拟器中手动打开应用(不是通过运行测试)
  4. 观察到随机字符出现在文本视图中,即使没有运行测试。

解决方法是退出并重新打开模拟器,以确保所有进程都被杀死。 希望这能解决您的问题

【讨论】:

  • 感谢您的洞察力!既然你这么说,这确实与我观察到的一致。不幸的是,就像我在原始帖子中所说的那样,我已经尝试删除所有模拟器。这些测试作为我们构建的一部分在本地和我们的 CI 系统上运行。你知道无论如何要自动化这个过程吗?
  • I 我们最终在 CI 系统上做的事情是在运行测试套件之前明确地杀死模拟器。例如,您可以运行 killall "Simulator" 2> /dev/null; xcrun simctl erase all,或者如果您使用 fastlane,则可以在 scan 选项中重置模拟器。
  • 你帮了我大忙。我只看到第三点,它正在工作。谢谢兄弟。
  • 就我而言,我需要删除应用程序并在每两个测试用例之间重新安装它(我在 setUp() 中执行此操作)。有时,某些测试用例会遇到此错误。如何删除两个测试用例之间的模拟器?
【解决方案3】:

我在 Xcode 11.1 中不时遇到这个问题。我观察到在等待 UI 元素时会出现问题,尤其是在测试期间显示 Web 视图。当问题发生时,我使用XCUIElement.waitForExistence(timeout:) 或期望NSPredicate(format: "exists == true")。当我更改为对NSPredicate(format: "hittable == true") 使用期望时,问题似乎消失了,但我不知道为什么。这两个属性的区别在于hittable 只检测屏幕上的元素,而exists 检测屏幕外的元素,例如表格视图的屏幕外单元格。

expectation(for: NSPredicate(format: "hittable == true"), evaluateWith: element, handler: nil)
waitForExpectations(timeout: 60, handler: nil)

【讨论】:

    【解决方案4】:

    我使用不同的机器。我的旧 Mac 更频繁地遇到此错误。我的猜测是较旧的 Mac 没有正确运行某些 XCUITests 所需的内存。

    【讨论】:

      【解决方案5】:

      我在 Xcode 11 上遇到过类似问题。

      事实证明,之前它被允许在许多页面中具有相同的可访问性标识符。

      但是现在使用新的模态展示样式,您应该在页面中使用不同的标识符以避免冲突。

      【讨论】:

        【解决方案6】:

        如果您使用的是 fastlane,则可以通过以下车道轻松解决:

        # Unit tests
        
          lane :tests do
            clear_derived_data
            scan(
              workspace: "AppTest.xcworkspace",
              devices: ["iPhone 8"], # it can be with the iPhone that has your VM
              force_quit_simulator: true,
              reset_simulator: true,
              reinstall_app: true,
              scheme: "AppTest"
            )
          end
        

        理论上,您必须重置模拟器并重新安装应用。

        愉快的编码

        【讨论】:

          猜你喜欢
          • 2017-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-30
          • 2022-12-16
          • 2012-09-11
          • 1970-01-01
          • 2019-10-17
          相关资源
          最近更新 更多