2017-07-25 4 views
0

私が抱えている問題は、テキストフィールドを含む再利用可能なビュー/コントロールがあることです。これらは、次のようなカスタム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メソッドを使用する可能性のあるソリューションはありますか?

+0

これは再現可能なサンプルプロジェクトがありますか? –

+1

また、カスタム表示自体ではなく、テキストフィールドでアクセシビリティが有効になっていることを確認する必要があります –

答えて

0

問題は解決されました。 Titouan de Bailleulのアドバイスによれば、カスタムビューのアクセシビリティが子孫テキストフィールドを効果的に隠すことができたという問題がありました。

のGithubに追加しましたサンプルプロジェクト:

https://github.com/stuartwakefield/XibXCTestIssueSample

おかげTitouan。

関連する問題