Xcode UI测试外部启动

3
希望标题不会太模糊。在我测试的应用中,某些应用程序流程会启动外部应用程序(例如Safari或Facebook)。如何验证应用程序是否通过UI测试启动了它们?我可以使用单元测试测试openURL之类的内容,但是否有等效的UI测试? 我不是在试图离开应用程序后实际继续操作,只是为了测试并确保已启动适当的新应用程序或URL。模拟器/记录器可以选择来自启动的应用程序的UI元素,但测试在那段代码的位置中断。我还尝试在菜单栏上获得某个句柄(始终出现在应用程序中,例如汉堡包按钮),同时在启动其他应用程序后检查它是否存在。 但这也破坏了测试。有解决方法吗?还是只能通过单元测试进行测试?
2个回答

1
正如您提到的,UI框架只能测试给定的应用程序。因此,我会进行断言以确保您之前所在的屏幕(在打开Safari或Facebook等之前)不再存在。例如:
XCTAssertFalse(app.tables.elementBoundByIndex(0).exists, "Found element, so app didn't open safari/facebook")

你只是在断言该元素不存在,将app.tables.elementBoundByIndex(0).exists改为你要检查的任何元素。

你会如何建议做到这一点?我试图在启动外部应用程序之前断言我创建的XCUIElement不再存在,但这会导致测试失败。 - ajc6432
@ajc6432 抱歉 - 我编辑了我的答案并加入了一个例子。希望这能帮到你!我认为新的框架很难适应。 - cakes88
是的,我之前尝试过类似的方法,但效果不太好 :/。还是谢谢你。我同意,有时候它确实有点不稳定。 - ajc6432
@ajc6432,为什么它没起作用?等一下,它还在检测元素吗? - cakes88

0

Xcode 13和iOS 15适用于Safari:我们可以按照以下步骤检查Safari是否打开。

let safari = XCUIApplication(bundleIdentifier: "com.apple.mobilesafari")
let isSafariBrowserOpen = safari.wait(for: .runningForeground, timeout: 30)

然后你想做什么就做什么:

if isSafariBrowserOpen {
    // Safari browser has opened, then additionally we could check if the url isn't nil
    safari.textFields["Address"].tap()
    let url = safari.textFields["Address"].value as? String
    XCTAssertNotNil(url)
}
else {
    // Safari browser hasn't opened
    // do something here, if necessary
}

注意:我没有与其他外部应用程序进行检查。

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