如何在iOS上的UI测试中测试navigationBar按钮是否启用/禁用?

如何在iOS上的UI测试中测试navigationBar按钮是否启用/禁用?,ios,objective-c,xctest,Ios,Objective C,Xctest,在我的iOS应用程序中,我添加了UI测试,我需要检查导航栏按钮是否在不同的时间点启用/禁用 目前我正在使用: XCUIElement* saveButton = self.app.navigationBars[@"TSSIDAddCardView"].buttons[@"Save"]; XCTAssertEqual(saveButton.hittable, YES); 然而,这总是返回YES。.exists测试也返回YES 有人知道如何进行正确的测试吗?您可以通过value属性获取实际的U

在我的iOS应用程序中,我添加了UI测试,我需要检查导航栏按钮是否在不同的时间点启用/禁用

目前我正在使用:

XCUIElement* saveButton = self.app.navigationBars[@"TSSIDAddCardView"].buttons[@"Save"];


XCTAssertEqual(saveButton.hittable, YES);
然而,这总是返回YES。.exists测试也返回YES


有人知道如何进行正确的测试吗?

您可以通过
value
属性获取实际的UI组件

有了它,您可以检查它是否已启用

比如:

UIBarButtonItem *saveButton = self.app.navigationBars[@"TSSIDAddCardView"].buttons[@"Save"].value;
XCTAssertTrue(saveButton.enabled);

因此,在@InsertWittyName的帮助下,我找到了解决方案:

UIBarButtonItem *saveButton = self.app.navigationBars[@"TSSIDAddCardView"].buttons[@"Save"];
XCTAssertFalse(saveButton.enabled);
符合,它提供了

因此,您可以在
xguielement*保存按钮上执行此操作:

目标-C

迅捷的


.value属性顺便返回一个字符串,而不是UIBarButtonItem对象,但是BOOL saveButton=self.app.navigationBars[@“TSSIDAddCardView”].buttons[@“Save”].enabled-这看起来像是工作这对我来说根本不起作用(使用Xcode 8.3.3)。当我尝试执行此操作时,会出现诸如“错误:在“id”类型的对象上找不到属性“enabled”或“错误:执行被中断,原因:试图取消引用无效的ObjC对象或向其发送无法识别的选择器”之类的错误。因为
…buttons[@“Save”].value
是一个
\uu NSCFConstantString
。我认为这不起作用,因为您正在访问
UIBarButtonItem
。在您的示例中,
saveButton
实际上仍然是一个
xguielement
,它符合
xguielementattributes
协议,该协议具有一个
已启用的
/
已启用的
属性。您可以测试这个put打印
[[saveButton class]description]
。您的示例之所以有效,是因为Objective-C的动态调度松散;然而,它在Swift中不起作用。基本上,将
UIBarButtonItem*saveButton=
更改为
id saveButton=
xuielement*saveButton=
,您会发现功能是相同的。我只是好奇,如果您查看发表评论之前的日期……发表帖子的时间。xcode 7.2甚至还没有发布……所以你在这里写的任何东西都是不可能的。我可能错了,但我认为我是对的。不,我倾向于不。因为这是StackOverflow的设计——它是Q&As fir的知识库,不仅得益于原始海报,也得益于未来所有可能有问题的人(与论坛不同——同样,从第一天起,这就是SO的主要设计目标)。此外,我倾向于不写SO Qs,或几乎不写与我的问题相匹配的Qs,也不写A来帮助我,对它们进行评论,和/或用我自己的最佳解决方案写A。作为对你的答案过时的回应-抱歉,这是SO的一个问题,现在有一段时间了,在某些地方,只有一半的问题是用特定于版本的标记解决的。我为其他人(比如我自己)在今天阅读答案写评论,而不是作为多年前人们的时间胶囊(是的,我是在讽刺,但在苹果的生态系统中,今天用Xcode 7开发软件是不可行的)。同样重要的是:我并不是真的在给你写评论,而是作为对其他可能遇到你的解决方案并在意识到它不再有效之前花时间尝试它的人的预先警告。也就是说,我不确定你的代码是否安全/正常。我不相信你曾经得到过一个
UIBarButtonItem*
,而在Obective-C上,向错误的对象类型进行类型转换一直是一个很大的禁忌。我相信我看到的错误只是因为新版本的编译器有更严格的类型检查,现在当它用于警告或保持沉默时会抛出错误。我相信你的代码总是错误的;只是旧的编译器会让你自食其果。这就是我建议使用
id
作为类型的具体原因。
XCTAssertEqual(saveButton.enabled, YES);
XCTAssertEqual(saveButton.isEnabled, true)