UI Testing Xcode 7- can't access element within subview
我正在尝试访问子视图中的元素,但发现无法这样做。
层次结构为:
视图控制器:
我想访问zipCodeEntered文本字段。我上面有一个名为" zipCodeEntered "的可访问性标签。
当我尝试记录自动化时,它仅注册超级视图" userEnterView ",而不注册我可以访问的实际文本字段。
我打印" app.otherElements [SUPER_VIEW_NAME] .debugDescription ",以查看该层次结构中的元素,但不打印任何元素。
关于为什么我无法访问这些元素/如何访问它们的任何想法?
- 您可以尝试设置accessibilityIdentifer吗?
-
乔:我已经广泛阅读了您的UI测试博客,它对我有很多帮助,所以我只想感谢您。我将accessibilityIdentifier添加到zipCodeEntered textField中,但仍然找不到它。使用app.otherElements["zipCodeEntered"]或app.textFields["zipCodeEntered"]。添加了情节提要布局的图片
-
谢谢,很高兴能为您提供帮助!您是否尝试过通过占位符文本"邮政编码"访问元素?
-
是否可以通过占位符文本直接从应用程序访问元素?我看到存在app.placeholderValue,但它只是返回该应用的占位符值的字符串。
-
您可以使用已经使用的相同查询。 app.textFields["Zip Code"]。
-
不幸的是,app.textfields["Zip Code"].exists返回false。
-
在这里它可能会有点奇怪。我发现如果您正在使用或已使用辅助功能ID或名称,则UI测试无法通过占位符文本(或标签文本)来标识元素。即使您只使用了一次并将其清空。您必须转到情节提要XML并从字面上手动删除该UI元素的可访问性XML。我已经打开了一个苹果虫,我相信他们已经接受了这是一个未解决的问题。一旦情节提要板可访问性XML不再存在,app.textfields["Zip Code"].exists就根本没有理由不起作用了。让我知道是否有帮助!
-
我从XML中删除了所有可访问性代码,但仍然没有任何乐趣。然后,我继续删除文本字段,然后再次添加文本字段,仅使用占位符"邮政编码",但仍然没有任何内容……您是否注意到这是子视图中元素存在的问题?感谢你的帮助!
由于父视图不是容器视图,因此无法访问子视图。来自《辅助功能编程指南》中的``使您的iOS应用可访问''部分:
From the perspective of accessibility, a custom view is either an individual view or a container view. An individual view does not contain any other views that need to be accessible.
A container view, on the other hand, contains other elements with which users can interact.
要使子视图可访问,父视图应通过从-isAccessibilityElement返回NO并实现UIAccessibilityContainer协议的方法来告诉UIAccessibility它??是一个可访问性容器。
- 谢谢!那正是问题所在。有两种方法可以实现此目的。 1)取消选中我拥有的所有视图元素的可访问性。 2)以编程方式,在视图控制器中使用特定的视图出口写入viewOutletVariable.isAccessibilityElement = false。
-
这个答案对我来说基本上是一种吸入器。
-
UIAccessibilityContainer仅适用于包含非UIKit支持的元素的视图。例如,使用drawAtPoint而不是UILabel或UIImageView手动绘制文本和图像。
-
@乔纳森UIAccessibilityContainer是"可以重写方法以出售由单个UIView管理的单个元素。"例如,iOS拨号界面可以是实现UIAccessibilityContainer以允许可访问性与其所包含的UIButton单独交互的视图,而不是包含它们的父视图。
-
这样就解决了问题。只需在包含其他元素的任何自定义视图上设置isAccessibilityElement = false。我今生或后世欠你一杯啤酒。
为我修复的问题是选中√在Interface Builder中启用了" Accessibility "框。
如果在IB中不起作用,请尝试将视图的isAccessibilityElement属性设置为true。
希望有帮助!
-
为什么这会引起反对?从字面上看,这只是所接受答案的图形表示。
我在UITableView中也遇到了此问题。我的单元格有一个containerView(UIView),它具有子视图(TextView,UIButton ...)和一个包含其单元格的collectionView。
我尝试了接受的答案,但是没有用。(UI记录器或手动代码无法识别我的子元素)。但是有时我发现,当我触发刷新表的操作时,UITest突然认出了我的子元素。
所以现在我知道UITest是否找不到子视图,我调用tableView.reloadData刷新视图,然后所有问题都消失了。
无论如何,这只是一种解决方法,我希望Apple能够尽快对其进行修复。
-
如何在XCUI中调用tableView.reloadData?
-
该答案与问题无关,因为代码和屏幕截图显示根本不涉及UITableView。
-
即使这与原始问题并没有真正的关系,但我发现这很有用,因为我遇到了同样的问题-尽管当时快照中有单元格,但XCUI并未在表中找到任何单元格。重新加载表格视图很有帮助。我已经为此使用了github.com/Subito-it/SBTUITestTunnel。我希望XCode能够尽快解决此问题。