【发布时间】:2015-10-01 17:41:48
【问题描述】:
有没有办法直接检查 XCUIApplication 当前正在运行/在屏幕上可见的屏幕?
我希望能够 XCTAssert 应用程序当前正在显示屏幕“X”。我在想我可能只是为每个屏幕创建一个隐藏的 UIElement 或按钮,然后断言该元素存在于屏幕上。不过,有没有人有更优雅或更直接的方法?
【问题讨论】:
标签: ios9 xcode-ui-testing
有没有办法直接检查 XCUIApplication 当前正在运行/在屏幕上可见的屏幕?
我希望能够 XCTAssert 应用程序当前正在显示屏幕“X”。我在想我可能只是为每个屏幕创建一个隐藏的 UIElement 或按钮,然后断言该元素存在于屏幕上。不过,有没有人有更优雅或更直接的方法?
【问题讨论】:
标签: ios9 xcode-ui-testing
在应用程序代码中... UILabel *currentScreen;
self.currentScreen.accessibilityLabel = @"Current Screen";
<insert_code_to_change_state/screen_in_app>
self.currentScreen.accessibilityValue = @"<insert_current_state/screen_of_app";
在 UI 测试代码中...
XCUIElement *currentScreen = app.staticTexts[@"Current Screen"];
<insert_code_to_navigate_to_state/screen_in_app>
XCTAssert([currentScreen.value isEqualToString: @"<insert_current_state/screen_of_app"]);
【讨论】:
我假设每个屏幕都有一些标题。在这种情况下,您可以使用以下方法。
//Get the top most navigation bar element
XCUIElement *currentNavigationBar = [app.navigationBars elementBoundByIndex:0];
XCTAssertEqualObjects(currentNavigationBar.identifier, @"Screen1 Name");
//Perform UI operations
XCTAssertEqualObjects(currentNavigationBar.identifier, @"Screen2 Name");
//Performa more UI operation
XCTAssertEqualObjects(currentNavigationBar.identifier, @"Screen3 Name");
因此,当您访问 currentNavigationBar 时,它会查询最新的。
【讨论】:
您可以像这样为每个视图控制器指定标题(如果它是导航控制器),
self.navigationItem.title = @"Your title";
然后您在 AppDelegate 中创建一个用户定义的方法来查找 visibleViewController,如此处所述,Get the top ViewController in iOS Swift 并阅读视图控制器的标题,例如,
NSString currentController = self.navigationController.visibleViewController.title;
您应该能够从 UITest 目标调用 appDelegate 的对象上的此方法,并根据 title 值编写您的测试,
if currentController == "myViewControllerTitle" {
}
【讨论】: