UI 测试标签栏控制器

Posted

技术标签:

【中文标题】UI 测试标签栏控制器【英文标题】:UI testing a tab bar controller 【发布时间】:2016-10-25 02:09:54 【问题描述】:

我构建了一个带有 3 个标签的简单标签栏。

我想运行一个 UI 测试以确保如果用户单击选项卡栏项目,则显示正确的视图控制器。我该怎么做呢?下面是我要开始的代码,只是不知道如何编写我的断言。

func testTabBarMyProfileButton() 
    let tabBarsQuery = XCUIApplication().tabBars
    tabBarsQuery.buttons["My Profile"].tap()


func testTabBarGraphsButton() 
    let tabBarsQuery = XCUIApplication().tabBars
    tabBarsQuery.buttons["Graphs"].tap()


func testTabBarAboutButton() 
    let tabBarsQuery = XCUIApplication().tabBars
    tabBarsQuery.buttons["About"].tap()

【问题讨论】:

【参考方案1】:

您可以通过它的位置访问标签栏按钮:

app.tabBars.buttons.element(boundBy: 2).tap()

【讨论】:

这对我有帮助。一个附加信息:tabBars.buttons.element 从索引 0 开始。所以第一个标签栏项目是 0,第二个是 1 等等。【参考方案2】:

如果您在每个选项卡栏上显示的每个视图控制器中都有不同的控件,您可以断言它们是否存在(这是预期的)。 例如,如果第一个标签栏的 UILabel 名为“First name”,您可以通过编写来断言它是否存在

Let theLabel = app.staticTexts["myValue"]
XCTAssert(theLabel.exists).to(beTrue)

在其他屏幕上对不同的控件执行相同的操作。

【讨论】:

【参考方案3】:

如果有人发现这需要 UI 测试另一个应用程序的内容,我刚刚找到了一个解决方案..

标签栏项目是一个惰性变量,需要先触摸才能按值引用标签栏按钮。添加这一行:

tabBarItem.accessibilityIdentifier = "my-snazzy-identifier"

到 viewDidLoad 方法,你应该能够在你的 UI 测试中这样做:

app.tabBars.buttons["Button Title"].tap()

【讨论】:

【参考方案4】:

您可以测试导航栏的标题。

XCTAssert(app.navigationBars["Graphs"].exists)

见my GitHub repo for a more detailed UI Testing example。

【讨论】:

我不打算使用导航栏。还有其他方法吗? 您必须在每个屏幕中声明一些独特的东西。这可以是按钮、文本标签或 UI 控件中的任何内容。

以上是关于UI 测试标签栏控制器的主要内容,如果未能解决你的问题,请参考以下文章

iOS UI 元素在标签栏控制器中来回切换后被拉伸

UITableView:向上滑动时收缩标签栏和导航栏

在情节提要中向标签栏控制器场景添加按钮

每个 ViewController 在标签栏内都有自己的导航栏(iOS)

如果推送控制器隐藏标签栏,UISearchBar 会跳转

调用 UIImagePickerController (SourceType Camera) 卸载标签栏控制器中的其他页面(其他标签)