元素在运行时不保留其 Storyboard 可访问性标识符或类型

Posted

技术标签:

【中文标题】元素在运行时不保留其 Storyboard 可访问性标识符或类型【英文标题】:Element does not retain its Storyboard accessibility identifier or type in runtime 【发布时间】:2018-09-20 00:37:01 【问题描述】:

我有一个自动化的 UI 测试,以确保页面显示正确的元素,方法是使用这样的 XCUIElement 查询来搜索它们

let instructionLabelID = "UIA_HelpViewController_InstructionLabel"
let callViewID = "UIA_HelpViewController_CallTextView"

var instructionLabel: XCUIElement  return app.staticTexts[instructionLabelID] 
var instructions: String  return instructionLabel.label 

var callLabel: XCUIElement  return app.textViews[callViewID] 
var callText: String  return callLabel.value as! String 

这是对应的故事板

由于未找到突出显示的视图,测试失败,即使我们可以在情节提要中看到其标识符是正确的。通过断点,我可以在运行时检查所有元素,结果如下

正如我们所见,第一个元素是正确的,因为它位于 Other(其容器视图)下,具有 StaticText 类型,并具有其标识符。然而,第二个元素似乎被合并到它的容器中,而不是它的子元素。两个容器都未选中 Accessibility Enabled 选项。我该如何解决这个问题?

【问题讨论】:

我也有这个 IB Designables 构建错误,尽管一切仍在运行,所以我不确定它是否相关 - file:///Users/jason/company-ios-module-module/Pods/ CoShared/Resources/iOS/Storyboards/QA.storyboard:错误:IB Designables:无法渲染和更新 HelpViewController(bf9-4a-BGY)的自动布局状态:dlopen(CoShared.framework,1):找不到图像 您似乎已将文本视图设置为容器上的 accessibilityTraits = .notEnabled 而不是设置 isAccessibilityElement = false,您能否确认您是如何禁用辅助功能的? 您可以添加您的评论作为答案,以便我接受吗?我正在通过情节提要设置可访问性。进入相应的 swift 文件并通过代码设置它导致我发现一个将 isAccessibilityElement 硬编码为 true 的扩展,这就是为什么它忽略了我为禁用它所做的任何事情 已回答并调整以包含您发现的内容,因此这可能会帮助其他遇到相同问题的人发现此问题:) 【参考方案1】:

您似乎已将文本视图设置为在容器上具有 accessibilityTraits = .notEnabled 而不是设置 isAccessibilityElement = false。

如果可能,请尝试在代码中而不是在情节提要中设置这些属性,因为它可以为您提供更多控制权 - 情节提要值很容易被覆盖,但如果您在代码中进行设置,您可以控制何时设置标识符并覆盖它们如果有任何干扰。

【讨论】:

对容器的出口变量名称的搜索发现了罪魁祸首。谢谢!

以上是关于元素在运行时不保留其 Storyboard 可访问性标识符或类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 Storyboard 时不通过 Storyboard 推送 ViewController

ASP.NET GridView 模板字段中的 CheckBox 在提交时不保留其值

拖动元素时如何保持样式?

RetentionPolicy CLASS与RUNTIME

Python:迭代器的简单理解

在 Xcode 6 中将 .storyboard 文件转换为原始 swift 代码