我遇到的问题是我有包含文本字段的可重用视图/控件。这些是带有自定义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
方法?
1条答案
按热度按时间2sbarzqh1#
这个问题已经解决了。正如Titouan de拜勒所建议的那样,问题是自定义视图的可访问性被有效地启用,从而隐藏了其后代文本字段。
的数据
谢谢蒂托安。