当前位置: 首页 > 面试题库 >

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

姜飞飙
2023-03-14
问题内容

我有3个屏幕,可以说,

  1. 登录
  2. 忘记密码
  3. 帮助画面

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

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

我建议与通过adb直接打开View的意图相同的内容。


问题答案:

据我所知,您不能使用XCUITest
Framework直接进入第二个屏幕。无论如何,文档指出:

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

这意味着如果您的应用程序用户无法直接到达第二个屏幕,为什么您的UI会进行测试。

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

编辑

阅读您的评论后,我可以想到一种解决方案。您可以使用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测试的方法。



 类似资料:
  • 问题内容: 我是网络编程的新手。我有兴趣通过Java服务器和C客户端之间的套接字建立网络连接并保持连接无限打开的可能吗?我想保持连接打开状态以在客户端之间交换XML数据。 问题答案: 从理论上讲,可以无限期地打开服务器套接字;但是,使用客户端套接字是不可能的。主要原因是因为客户端套接字取决于处理数据的服务器端套接字,并且服务器套接字可能会关闭连接。 尽管可以无限期地保持连接打开,但实际情况通常会确

  • 问题内容: 使连接保持打开状态,直到发生事件。 python django http rest 问题答案: 显然,最常见的方法不是直接在django中进行,而是借助附加的守护程序(可能是因为,例如Apache在许多长寿命连接方面做得不好)。如今,nodejs + socketio对此非常流行(它甚至可以使用WebSockets)-您只需要找到一种在两种方法之间传递数据的好方法。如果它是单向的(例如

  • 我使用Firebase动态链接。当我点击Android设备上的链接时,它会询问我想用哪个应用打开:Chrome(浏览器)还是处理链接的应用。是否可以禁用使用chrome打开这些链接并立即打开应用程序? 我遵循这些指示:https://firebase.google.com/docs/dynamic-links/android/receive

  • 问题内容: 在Interface TakesScreenshot 页面上,我发现了这一点: 捕获屏幕截图并将其存储在指定位置。对于扩展了TakesScreenshot的WebDriver,这将根据浏览器尽最大努力按优先顺序返回以下内容:-整个页面- 当前窗口-当前帧的可见部分-包含浏览器的整个显示器的屏幕截图 对于扩展TakesScreenshot的WebElement,这将尽最大努力,具体取决于

  • 我正在开发这个Android应用程序,它应该为普通和大屏幕设备使用相同的布局。但是对于所有的屏幕尺寸落入xlarge括号中,我希望系统使用这个Android文档描述的屏幕兼容模式。 本文件明确指出: 默认情况下,当以下情况之一为真时,运行Android 3.2及更高版本的设备的屏幕兼容模式作为可选功能提供给用户: > < li> 您的应用程序已将android:minSdkVersion和andr

  • 问题内容: 有没有一种方法可以完全使用客户端Javascript访问MySql数据库,或者是否需要使用PHP或C#这样的服务器端语言? 谢谢 问题答案: 如果Javascript在浏览器中运行,则无法访问MySQL数据库。首先,这是一个技术限制,因为Javascript无法通信任意协议(不,WebSockets不是解决方案)。请注意,作为服务器端和所有端的Node.js是一种“不同类型的javas