Xcode 11 XCUITest失败:无法获取匹配的快照:获取主窗口kAXErrorServerNotFound错误。

33
在使用Xcode 11构建应用程序并运行XCUITests套件时,我遇到了许多随机失败,并出现以下错误:
无法获取匹配的快照:获取主窗口kAXErrorServerNotFound错误。
无论我如何增加超时时间,问题仍然会间歇性地出现。似乎在对UI层次结构进行截图时存在问题。我们在Xcode 10中测试始终通过。
我已重新安装Xcode,删除了所有模拟器,清除了派生数据,修改了超时时间,并从Xcode 11.1升级到了Xcode 11.2.1。
谢谢!

我也遇到了同样的问题,你有找到任何解决方法吗? - Samarth Kejriwal
7个回答

34

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


这个答案似乎是正确的方法,但我不太理解它的含义?我应该在哪里输入XCUIApplication().activate()和/或XCUIApplication().launch()? - Charlie S
在你的UI测试函数内部 - Денис Грищенко
Xcode 11.5 我必须使用 let app = XCUIApplication() 然后 app.activate() 才能解决这个错误。 - MwcsMac
这应该是被选中的解决方案。 - Mostafa Al Belliehy
我仍然有错误;我尝试了在 let app = XCUIApplication() 之后和 app.launch() 之后都使用 app.activate(),但我仍然有错误。 - atrebbi

7

我曾经遇到过与 Xcode 11 相同的问题,并意识到当停止测试时测试运行程序未被杀死(或者因任何原因导致测试崩溃)。第二次运行测试将生成新的测试运行程序,此时就会有两个程序试图与同一应用程序进行交互,导致了这个非常奇怪的错误。

为了证明这一点,我执行了以下步骤:

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

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


谢谢您的见解!现在您这么说,这确实与我观察到的相符。不幸的是,就像我在原帖中所说的那样,我已经尝试删除了所有模拟器。这些测试是作为我们本地和CI系统构建的一部分运行的。您知道有什么自动化此过程的方法吗? - Luke Street
我们在CI系统上最终采取的做法是在运行测试套件之前明确地杀死模拟器。例如,您可以运行 killall "Simulator" 2> /dev/null; xcrun simctl erase all,或者如果您使用fastlane,则可以在scan中选择重置模拟器的选项。 - erudel
你帮了我大忙了。我只看到第三点,它就起作用了。谢谢兄弟。 - Mayank Bhaisora
在我的情况下,我需要在每两个测试用例之间删除应用并重新安装(我在setUp()函数中执行此操作)。有时,某些测试用例会遇到此错误。如何在两个测试用例之间删除模拟器? - csujiabin

3
我偶尔在Xcode 11.1中遇到了问题。 我发现这个问题经常发生在等待UI元素的时候,特别是在测试期间显示Web视图时。 当问题发生时,我正在使用XCUIElement.waitForExistence(timeout:)或带有NSPredicate(format: "exists == true")的expectation。 当我改用带有NSPredicate(format: "hittable == true")的expectation时,问题似乎已经消失了,但我不知道为什么。 这两个属性之间的区别在于hittable仅检测屏幕上的元素,而exists检测如表视图的屏幕外单元格等屏幕外元素。
expectation(for: NSPredicate(format: "hittable == true"), evaluateWith: element, handler: nil)
waitForExpectations(timeout: 60, handler: nil)

0
如果你正在使用fastlane,可以轻松通过以下lane解决:
# 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

理论上,您必须重置模拟器并重新安装应用程序。
祝编码愉快。

0

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

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

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


0

我使用不同的机器。我的旧款Mac更经常遇到这个错误。我猜测旧款Mac没有运行某些XCUITest所需的内存。


0
对我来说,调用activate()两次是解决方案。这不是我第一次遇到这样的问题。我有其他测试需要将应用程序调回前台,只调用一次activate是不够的。
XCUIApplication().activate()
XCUIApplication().activate()

听起来很奇怪,我知道,但试一试。


请使用launch()代替。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接