【问题标题】:UI Testing Xcode 7- can't access element within subviewUI测试Xcode 7-无法访问子视图中的元素
【发布时间】:2015-12-24 09:54:30
【问题描述】:

我正在尝试访问子视图中的元素,但我发现这样做是不可能的。

层次结构是:

视图控制器:

  • 查看
    • 临时视图
    • 用户回车查看
      • 输入邮政编码

我想访问 zipCodeEntered 文本字段。我有一个名为“zipCodeEntered”的可访问性标签。

当我尝试记录自动化时,它只注册超级视图“userEnterView”,而不是我可以点击的实际文本字段。

我打印“app.otherElements[SUPER_VIEW_NAME].debugDescription”以查看该层次结构中有哪些元素,但它没有打印。

关于为什么我无法访问这些元素/如何访问它们的任何想法?

【问题讨论】:

  • 您可以尝试设置accessibilityIdentifer 吗?
  • Joe:我广泛阅读了您的 UI 测试博客,它对我帮助很大,所以我只想感谢您。我将accessibilityIdentifier 添加到 zipCodeEntered 文本字段中,但仍然找不到。使用app.otherElements["zipCodeEntered"]app.textFields["zipCodeEntered"]。添加了故事板布局的图片
  • 谢谢,很高兴它一直在帮助!您是否尝试过通过占位符文本“邮政编码”访问该元素?
  • 有没有办法直接从应用程序中通过占位符文本访问元素?我看到 app.placeholderValue 存在,但它只返回应用程序占位符值的字符串。
  • 您可以使用已在使用的相同查询。 app.textFields["Zip Code"].

标签: ios xcode swift2 xcode7 xcode-ui-testing


【解决方案1】:

子视图不可访问,因为父视图不是容器视图。来自无障碍编程指南中的Making Your iOS App Accessible 部分:

从可访问性的角度来看,自定义视图要么是单独的视图,要么是容器视图。单个视图不包含需要访问的任何其他视图。

另一方面,容器视图包含用户可以与之交互的其他元素。

为了使子视图可访问,父视图应通过从 -isAccessibilityElement 返回 NO 并实现 UIAccessibilityContainer 协议的方法来告诉 UIAccessibility 它是可访问容器。

【讨论】:

  • 谢谢!这正是问题所在。有两种方法可以实现这一目标。 1)取消选中我拥有的所有视图元素的可访问性。 2)以编程方式,在视图控制器中使用特定的视图出口写viewOutletVariable.isAccessibilityElement = false
  • 这个答案对我来说基本上是一个吸入器。
  • UIAccessibilityContainer 仅适用于包含非 UIKit 支持元素的视图。例如,使用 drawAtPoint 而不是 UILabel 或 UIImageView 手动绘制文本和图像。
  • @Jonathan。 UIAccessibilityContainer 是“可以重写方法以出售由单个 UIView 管理的单个元素。”。例如,iOS 拨号界面可能是一个实现UIAccessibilityContainer 以允许可访问性与它包含的 UIButton 单独交互的视图,而不是包含它们的父视图。
  • 这样就解决了问题。只需在包含其他元素的任何自定义视图上设置isAccessibilityElement = false。我在今生或下辈子欠你一杯啤酒。
【解决方案2】:

为我解决的问题是选中 √ 在 Interface Builder 中启用的“可访问性”框。

如果不能在 IB 中工作,请尝试将视图的 isAccessibilityElement 属性设置为 true。

希望有帮助!

【讨论】:

  • 为什么会遭到反对?这实际上只是接受答案的图形表示。
【解决方案3】:

我在我的 UITableView 中也遇到了这个问题。我的单元格有一个 containerView(UIView),它有子视图(TextView, UIButton...) 和一个 collectionView 及其单元格。

我尝试了接受的答案,但没有奏效。(UI 记录器或手动代码无法识别我的子元素)。但有时我发现当我触发刷新表格时,UITest 突然识别出我的子元素。

所以现在我知道如果 UITest 找不到我的子视图,我调用 tableView.reloadData 来刷新视图,然后所有问题都消失了。

不管怎样,这只是一个变通办法,希望苹果能尽快修复它。

【讨论】:

  • 如何在 XCUI 中调用 tableView.reloadData?
  • 这个答案与问题无关,因为代码和屏幕截图显示根本不涉及UITableView
  • 尽管这与原始问题并没有真正的关系,但我发现这很有帮助,因为我遇到了同样的问题 - 尽管表格上有单元格,XCUI 没有在表格中找到任何单元格那一刻的快照。重新加载表格视图有帮助。我为此使用了github.com/Subito-it/SBTUITestTunnel。我希望 XCode 能尽快解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多