私が抱えている問題は、テキストフィールドを含む再利用可能なビュー/コントロールがあることです。これらは、次のようなカスタムUIビュークラスでXIBファイル、以下のとおりです。XCTestを使用してカスタムUIViewの子孫コントロールにアクセスする
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
}
}
このカスタムビューは、彼らがストーリーボードにInterface Builderを使用して使用されることになるストーリーボードにロードされています。
問題は、XCTestはこれらのビューの子孫をモデル化していないようです。したがって、カスタムビューの一部であるテキストフィールドにテキストを入力するテストを作成しようとすると、テストはエラー:
Neither element nor any descendant has keyboard focus.
は現在の周りの仕事が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
メソッドを使用する可能性のあるソリューションはありますか?
これは再現可能なサンプルプロジェクトがありますか? –
また、カスタム表示自体ではなく、テキストフィールドでアクセシビリティが有効になっていることを確認する必要があります –