如何检查应用程序当前正在运行的屏幕?

Posted

技术标签:

【中文标题】如何检查应用程序当前正在运行的屏幕?【英文标题】:How to check what screen the application is currently running? 【发布时间】:2015-10-01 17:41:48 【问题描述】:

有没有办法直接检查 XCUIApplication 当前正在运行/在屏幕上可见的屏幕?

我希望能够 XCTAssert 应用程序当前正在显示屏幕“X”。我在想我可能只是为每个屏幕创建一个隐藏的 UIElement 或按钮,然后断言该元素存在于屏幕上。不过,有没有人有更优雅或更直接的方法?

【问题讨论】:

【参考方案1】:
    创建一个 UI 标签,以便能够引用当前屏幕。 设置该 UI 标签的 accessibilityLabel,以便您可以通过 XCUIElementQuery 找到它。 设置该 UI 标签的 accessibilityValue,以便您可以确定应用程序所处的状态/屏幕。

在应用程序代码中... 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"]);

【讨论】:

【参考方案2】:

我假设每个屏幕都有一些标题。在这种情况下,您可以使用以下方法。

//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 时,它会查询最新的。

【讨论】:

如果没有导航栏,我认为这不会起作用。 我可以用accessibilityLabel = @"Current Screen" 创建一些隐藏的静态文本,然后在每个屏幕上更改该静态文本的accessibilityValue 吗? @atgrubb 您如何在应用程序中更改屏幕,不使用任何导航控制器(推送或呈现)来做到这一点? 我可能应该澄清更多,但“屏幕更改”并不总是通过点击导航或标签栏上的按钮进行的​​典型屏幕更改。我应该问的是如何检查屏幕的状态。我最终按照我的建议去做 - UILabel 在屏幕处于特定状态时创建(可能以图形方式显示,就像屏幕已更改为最终用户一样),然后检查该 UILabel 是否具有一定的可访问性值。【参考方案3】:

您可以像这样为每个视图控制器指定标题(如果它是导航控制器),

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" 

【讨论】:

以上是关于如何检查应用程序当前正在运行的屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android TV 主屏幕上为当前正在运行的任务设置图标和标题

如何判断当前显示登录屏幕?

反应原生如何检查组件当前是不是显示在屏幕中

一般检查任何移动设备屏幕方向更改?

我应该如何在颤振应用程序中管理登录页面

如何以编程方式检查手机当前是不是正在充电或正在使用电池?