Xcode UI 测试:如何在继续测试之前检查下一个 XCUIElement 是啥

Posted

技术标签:

【中文标题】Xcode UI 测试:如何在继续测试之前检查下一个 XCUIElement 是啥【英文标题】:Xcode UI Test: How to check what is the next XCUIElement before proceed testXcode UI 测试:如何在继续测试之前检查下一个 XCUIElement 是什么 【发布时间】:2017-01-23 15:56:22 【问题描述】:

我在第 1 页并想导航到第 2 页。但是当我制作 第 1 页上的 http Get 请求,如果服务器忙,它将返回错误,我将在警报视图中显示错误,但是如果请求成功,则我将导航到第 2 页。除此之外,如果我的 http Get请求返回错误,我将重复调用 http Get 请求,直到能够继续到第 2 页。现在的问题是我如何知道将出现的下一个 UI 是什么,目前我使用下面的代码来检查下一个元素会出现,但是当找不到元素时,此方法将终止测试。任何可以检查是否找到元素A然后继续步骤A的解决方案,否则如果元素B然后步骤B。对不起我的英语和长句。

XCUIElement *label = self.app.staticTexts[@"Page 2"];   
NSPredicate *exists = [NSPredicate predicateWithFormat:@"exists == 1"];  

[self expectationForPredicate:exists evaluatedWithObject:label handler:nil];   
[self waitForExpectationsWithTimeout:10.0f handler:nil]; 

【问题讨论】:

【参考方案1】:

您的问题是您的测试不是确定性的:您无法确定来自服务器的响应是否会成功。要消除服务器引入的这种不确定性,您可以存根或模拟对服务器的请求。

您可以创建一个模拟服务器,该服务器设置为在特定条件下发送特定响应,或者您可以使用存根框架在应用程序中存根响应。

我使用OHHTTPStubs 来执行此操作。 Just Eat 写了一篇good blog post 来介绍如何在 UI 测试中实现它,但如果你使用 Swift,则需要从 Objective-C 翻译它。

【讨论】:

感谢您的宝贵时间,但这对我来说不是一个好的选择,因为我必须根据要求在真实的实时(生产)服务器上测试我的应用程序。那么没有别的办法了吗? 如果您无法控制服务器的响应,您将无法判断您将要测试什么。根据测试期间发现的 UI 元素,您可以有一个很大的 if/else 语句,但是不知道每个测试正在测试什么是非常糟糕的做法,并且您不会知道您是否测试了这两种情况。跨度>

以上是关于Xcode UI 测试:如何在继续测试之前检查下一个 XCUIElement 是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何检查是不是在 Xcode UI 测试中创建了新场景?

如何使用 Xcode 7 UI 测试检查表格视图中的单元格是不是可见?

Xcode ui 测试:staticTexts 开头

等待所有 HTTP 请求在 XCode UI 测试中完成?

Xcode UI 测试:如何测试应用程序的首次启动

我如何在 Xcode 9 中录制(用于 UI 测试)