是否可以直接在XCUITest中打开屏幕?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以直接在XCUITest中打开屏幕?相关的知识,希望对你有一定的参考价值。

我有3个屏幕,比方说,

  1. 登录
  2. 忘记密码
  3. 帮助屏幕

默认情况下,应用程序启动时会打开登录屏幕。单击“忘记密码”按钮时将显示“忘记密码”屏幕,单击“帮助”链接时将打开“帮助”屏幕。

我可以以某种方式直接打开忘记密码屏幕而无需通过使用XCUITest单击按钮的过程吗?

我建议使用与直接打开View的adb意图相同的行。

答案

据我所知,你不能使用XCUITest Framework直接进入第二个屏幕。无论如何,documentation说:

UI测试以与用户相同的方式练习应用程序的UI,而无需访问应用程序的内部方法,函数和变量。这使您的测试能够以与用户相同的方式查看应用程序,从而暴露用户遇到的UI问题。

这意味着如果您的应用的用户无法直接访问第二个屏幕,为什么您的UI会测试。

我知道在运行测试时等到第二个屏幕是很费时间的,但是你可以绕过为每次测试编写它。要只编写一次,在XCTestCase类中编写一个函数,在其中实现调用第二个屏幕并在setUp()方法中调用该函数。然后,每次运行测试时都会调用跳过第一个屏幕的过程,因为在每次测试运行之前都会调用setUp()方法。

编辑

阅读完评论后,我可以想到一个hacky解决方案。您可以使用Launch Environment和/或Launch Arguments从您的测试中与您的应用进行通信。因此,在您的XCTestCase类中,设置参数和环境:

class ForgotPasswordUITest: XCTestCase {
    let app = XCUIApplication()

    override func setUp() {
        app.launchArguments += ["UI-TESTING"]
        app.launchEnvironment["pageToGo"] = "forgotPassword"
        app.launch()
    }
}

然后,在ViewController中,编写以下计算属性:

var isUiTestingEnabled: Bool {
    get {
        return ProcessInfo.processInfo.arguments.contains("UI-TESTING")
    }
}

var shouldShowForgotPassword: Bool {
    get {
        return ProcessInfo.processInfo.environment["pageToGo"] == "forgotPassword"
    }
}

var shouldShowHelpScreen: Bool {
    get {
        return ProcessInfo.processInfo.environment["pageToGo"] == "helpScreen"
    }
}

viewDidLoad()方法中,你可以有这样的东西:

    if isUiTestingEnabled {
        if shouldShowForgotPassword {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let secondViewController = storyboard.instantiateViewController(withIdentifier: "ForgotPasswordViewController")
            self.present(secondViewController, animated: true, completion: nil)
        } else if shouldShowHelpScreen {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let secondViewController = storyboard.instantiateViewController(withIdentifier: "HelpScreenViewController")
            self.present(secondViewController, animated: true, completion: nil)
        }
    }

注意:这是一个非常脏的黑客,不推荐编写UI测试的方法。

以上是关于是否可以直接在XCUITest中打开屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

XCUITest - 打开 iOS 设置并更改日期/时间

XCUITest 和动态生成的视图

我们可以在 xcuitest 中使用 Notification Center 来监听内部事件吗?

XCUITest - 与锁定屏幕的通知交互

如何在 Jenkins 中将屏幕截图附加到 XCUITest 报告。只有通过 XCODE 运行才能看到截图

如何在屏幕方向更改时附加片段?