如何编写 XCUI 测试以确定我是不是导航到正确的屏幕?

Posted

技术标签:

【中文标题】如何编写 XCUI 测试以确定我是不是导航到正确的屏幕?【英文标题】:How to write XCUI test for whether I navigate to correct screen or not?如何编写 XCUI 测试以确定我是否导航到正确的屏幕? 【发布时间】:2017-08-13 06:33:41 【问题描述】:

我正在为以下 UI 编写测试 UI 测试用例

我想在登录点击测试我是否在仪表板屏幕上正确导航。

有什么方法可以做到吗?

我目前的测试代码是这样的

func testExample() 

        let usernameTextField = app.textFields["Username"]
        usernameTextField.tap()
        usernameTextField.typeText("abc@gmail.com")

        let passwordTextField = app.textFields["Password"]
        passwordTextField.tap()
        passwordTextField.typeText("abc123")

        app.buttons["Login" ].tap()

                //let loginButton = app.staticTexts["Login"]
                //XCTAssertEqual(loginButton.exists, true)

        app.navigationBars["UIView"].buttons["Back"].tap()


    

【问题讨论】:

【参考方案1】:

UI 测试在依赖于文本值时会变得非常脆弱。我鼓励你做的是为你的 ViewController 的view 设置 Accessibility Identifier。这样,即使您更改标题或更改整个布局,您仍然可以确保您处于正确的页面/屏幕/视图中。

class DashVC: UIViewController 
    override func viewDidLoad() 
        view.accessibilityIdentifier = "view_dashboard"
    




    func test_login_withValidInput_goesDashBoard() 
        let app = XCUIApplication()

        //...    
        app.buttons["Login" ].tap()

        let dashBoardView = app.otherElements["view_dashboard"]
        let dashBoardShown = dashBoardView.waitForExistence(timeout: 5)

        XCTAssert(dashBoardShown)

    

【讨论】:

我认为这不是足够的答案/解释。我想建议你,用适当的步骤修改你的答案,如果你可以分享截图,那就太好了【参考方案2】:

试试这个

    app.buttons["Login - Login"].tap()
    XCTAssertEqual(app.navigationBars.element.identifier, "appname.CalculationView") //If your second view controller is SecondViewController, your identifier is appname.SecondView.Like that my second view controller is CalculationViewController so my identifier is CalculationView

【讨论】:

【参考方案3】:

尝试在后退按钮上添加一个可访问性指示器,以便您可以使用 backButton.existsbackButton.hittable 检查可用性并相应地断言。无论如何,如果你设置了

continueAfterFailure = 假

在 setUp() 中,如果没有找到带有“Back”的按钮,您的测试将失败。

【讨论】:

感谢您的回答..但我想要测试用例...如果我导航到任何屏幕只是想测试我是否在正确的屏幕上而不与该屏幕元素交互...因为后退按钮可以在我不想导航的屏幕上使用 这就是添加无障碍标识符的原因,所以每个元素都是唯一可识别的 我是否需要以编程方式添加可访问性标识符,因为在我的 UI 中,它是在我使用导航控制器时自动创建的......所以我无法找到将可访问性标识符放入 Storyboard 的方法 您可以通过编程方式添加它。我会将它添加到另一个不同的元素中(而不是 backButton)。以编程方式你可以做yourObject.accessibilityIdentifier = "YOUR_UNIQUE_ID" 您也可以对仪表板上的任何元素执行此操作。惯例是找到该屏幕独有的 UI 元素并检查它是否存在,因此当您将组件添加到仪表板时,请选择一个并检查它是否存在,这样您就不必依赖自定义后退按钮。

以上是关于如何编写 XCUI 测试以确定我是不是导航到正确的屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

XCUI 测试:app.debugDescription 显示最后一屏的信息

如何在 XCUI 测试自动化框架中组织和分组测试用例

使用 XCUI 进行 UI 测试

XCUI 测试:如何单击运行时填充的标签

iOS 13 版本的 XCUI 测试框架中未检测到 iOS Search Bar

如何在 Test suit XCUI 中禁用某些测试用例?