【发布时间】:2020-07-13 21:31:47
【问题描述】:
在我的应用程序中,我允许用户将项目从 Finder(或任何其他基于文件的 URL 源)拖放到我的应用程序中。我想做的是添加一个机制,让我可以在 Xcode UI 测试中进行测试。
我可以看到如何使用XCUIElement.press(forDuration:thenDragTo:) 在应用程序内测试源和目标的拖放,但是当拖动源在应用程序之外时,我一直无法找到测试方法。
在一个有点相关的测试中,我通过将要粘贴的字符串设置为NSPasteboard.general 来测试应用程序的复制和粘贴部分,然后使用XCUIElement.typeKey("v", modifierFlags: .command) 将其粘贴到所需的元素中。这有点不太理想,因为它取决于 Command-v 实际上是作为粘贴命令实现的,但这不太可能改变,所以它可以满足我的需要。 (事实上,我已经编写了一个 XCUIElement.paste(_ s: String) 扩展,这让我可以很容易地在测试中添加它。)
我相信拖放也使用NSPasteboard 进行通信,因此通过对底层机制的一些调查,我应该能够将我的对象设置到正确的粘贴板中,就像我对剪切和粘贴。我有理由确定我可以弄清楚那部分。但是我还没有弄清楚如何执行实际的下降。
我的目标是创建一个XCUIElement.drop(_ url),它将正确的“public.file-url”对象设置到正确的粘贴板中,然后模拟/执行拖放到元素中。
有什么想法吗?
我应该注意到我已经尝试了以下两个项目:
首先,我确实使用了 Xcode 记录功能来尝试记录拖放操作,看看它会给我什么事件。不幸的是,它完全没有记录。
其次,我确实有一个基于菜单的替代方案,用户可以通过文件选择器选择文件。因此,如果我可以模拟文件选择,那将是适合我目的的测试替代方案。不幸的是,我也没有在这条道路上取得任何进展。当我使用 Xcode 记录事件时,它记录了菜单选择,而对话框中实际上并没有做任何事情。
【问题讨论】:
-
为什么
XCUIElement.press(forDuration:thenDragTo:)不起作用? -
我不相信
press会起作用的原因有两个。首先,我要按什么元素?那应该是源元素,但在我的情况下,源元素在应用程序之外。其次,我将如何指定要拖动的内容?据推测,这将基于作为源的元素,但正如我所提到的,我没有这样的元素。我想一种选择可能是在应用程序处于“调试”模式时创建一个不可见的标签或其他东西,并将其用作源。但这似乎是一个可怕的“黑客”。
标签: swift xcode drag-and-drop xcuitest