【问题标题】:How to type into a UITextView inside a XCTestCase如何在 XCTestCase 中输入 UITextView
【发布时间】:2017-11-04 05:39:39
【问题描述】:

如何在XCTestCase 中输入UITextViewUITextView 是第一响应者,因此它已经获得焦点并且键盘已启动。

我试过了:

app.typeText("footer")
app.textViews.element(boundBy: 0).typeText("foobar")
app.links.element(boundBy: 0).typeText("foobar")

出于某种原因app.textViews.count 总是返回0

【问题讨论】:

  • 您的文本视图是否在容器视图中?视图层次结构是什么样的?
  • @Oletha,它在堆栈中。堆栈是最顶层的视图。

标签: ios swift xctest xcode-ui-testing


【解决方案1】:

尝试为您的UITextView 设置一个唯一的accessibility identifier,然后:

let textView = app.textViews["uniqueId"]
XCTAssert(textView.exists, "uniqueId text view NOT FOUND")
textView.tap()
textView.typeText("foobar")

【讨论】:

  • 这也行不通。你有这个在你自己的代码中工作吗?
  • 这会返回 0:app.children(matching: .textView).count
  • @Mystic 适用于 UITextField,所以我不明白为什么它也不适用于 UITextView。为了安全起见,我添加了一个额外的 assert...
  • ...您可以尝试record UI 测试来查看 Xcode 是否可以为您找到您的文本视图;)(这是由 red按钮在底部。)
  • 试一试,告诉我进展如何。我发现记录器提供的代码行为不正确。我知道如何为 UITextField 做这件事,如果 UITextView 表现得像 UITextField 我不会有问题。
【解决方案2】:

问题不在于.typeText(_:) 不起作用,而是您的查询无法解析为元素。

当您尝试查找的视图位于某种可访问的容器视图中时,有时查询似乎无法正常工作。您可以通过在容器视图中显式禁用可访问性来缓解这种情况。

将包含文本视图的堆栈视图设置为不是可访问性元素,然后在文本视图上设置可访问性标识符。

// app code
let stack: UIStackView!
let textView: UITextView!
stack.isAccessibilityElement = false
textView.isAccessibilityElement = true
textView.accessibilityIdentifier = "myTextView"

// test code
let app = XCUIApplication()
let textView = app.textViews["myTextView"]
textView.typeText("something")

【讨论】:

  • 鉴于UIStackView 不显示任何信息或不支持用户交互本身,为什么Apple 会默认将其设为可访问元素?如果确实如此,考虑到UIStackView 的有用/流行程度,这会不会导致各种可访问性问题,远远超出 UI 测试?
  • 最终用户的辅助功能与 XCTest 的辅助功能略有不同。我有一些非常小众的例子,其中表内的视图无法访问测试但不能访问 Voiceover...
  • 好的,不知道这种差异......无论如何,UITableView 容器,与 UIStackView 不同,支持用户交互(滚动等),所以这不会让我感到惊讶一样多;)
  • 最近回到这个,这对我不起作用。我仍然能够将查询解析为元素。
  • 仅仅因为查询返回一个 XCUIElement 对象,并不意味着该元素会在运行时被发现存在。查询可能会或可能不会在运行时解析为单个 XCUIElement 并导致错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
相关资源
最近更新 更多