xcode 使用XCTest访问自定义UIView中的后代控件

pgx2nnw8  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(90)

我遇到的问题是我有包含文本字段的可重用视图/控件。这些是带有自定义UI视图类的xib文件,如下所示:

import UIKit

@IBDesignable
public class CustomControl: UIControl {

  @IBOutlet public weak var textField: UITextField?
  public var contentView: UIView?

  required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setupViewFromNib()
  }

  override public init(frame: CGRect) {
    super.init(frame: frame)
    setupViewFromNib()
  }

  override public func awakeFromNib() {
    super.awakeFromNib()
    setupViewFromNib()
  }

  override public func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    setupViewFromNib()
    contentView?.prepareForInterfaceBuilder()
  }

  func setupViewFromNib() {
    guard let view = loadViewFromNib() else { return }
    guard let textField = self.textField else { return }
    view.frame = bounds
    view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    addSubview(view)
    contentView = view
  }

  func loadViewFromNib() -> UIView? {
    let selfType = type(of: self)
    let nibName = String(describing: selfType)
    return Bundle(for: selfType)
        .loadNibNamed(nibName, owner: self, options: nil)?
        .first as? UIView
  }
}

字符串
此自定义视图将被加载到情节串联板中,并将使用情节串联板界面生成器在其中使用它们。
问题是XCTest似乎没有对这些视图的后代进行建模,所以当我试图编写一个测试,涉及到在自定义视图的文本字段中输入文本时,测试会出现错误:
元素和任何子元素都没有键盘焦点。
目前的解决方法似乎是点击键盘上的键,而不是使用typeText方法。然而,这要慢得多(按键之间长时间的停顿),并且测试代码也要繁琐得多。
所需代码:

let app = XCUIApplication()
let view = app.otherElements["customView"]
let textField = view.textFields["textField"]
textField.tap()
textField.typeText("12345")


使用测试记录,我们得到如下内容:

let app = XCUIApplication()
let view = app.otherElements["customView"]
view.tap()
app.typeText("12345")


但是运行此测试会导致上述错误。
编辑/工作测试变为:

let app = XCUIApplication()
let view = app.otherElements["customView"]
// view appears as a leaf with no descendants
view.tap() 
app.keys["1"].tap()
app.keys["2"].tap()
app.keys["3"].tap()
app.keys["4"].tap()
app.keys["5"].tap()


如果自定义视图包含多个控件,我也不相信这种解决方法仍然可行,比如说,也许对于节育日期,我希望对我使用的自定义控件中的哪个字段进行更细粒度的控制。
有没有一种解决方案可以让我访问自定义视图中的字段,并可能使用typeText方法?

2sbarzqh

2sbarzqh1#

这个问题已经解决了。正如Titouan de拜勒所建议的那样,问题是自定义视图的可访问性被有效地启用,从而隐藏了其后代文本字段。


的数据
谢谢蒂托安。

相关问题