🙌

XCUITestで2つのTextFieldに入力する際の問題の解決方法

2021/07/27に公開

TextFieldが2つある場合に、UITestで起こる問題

シミュレータUITestを行う場合、以下のようなtypeTextができませんでした。

View

struct LoginFormView: View {
    
    @State var name: String = ""
    @State var pass: String = ""
    @State var disabled: Bool = true
            
    var body: some View {
        VStack(spacing: 32) {
            
            TextField("user name", text: $name, onCommit: {
                updateButton()
            }).textFieldStyle(RoundedBorderTextFieldStyle())
            SecureField("password", text: $pass, onCommit: {
                updateButton()
            }).textFieldStyle(RoundedBorderTextFieldStyle())

            Button.init("Login") {
                debugPrint("do login")
            }.disabled(disabled)
        }.padding(16)
    }
    
    private func updateButton() {
        disabled = name.isEmpty || pass.isEmpty
    }
    
}

XCTestCase


  let app = XCUIApplication()
  app.launch()

  //メールアドレス欄に入力
  app.textFields.firstMatch.tap()
  app.textFields.firstMatch.typeText("sample@example.com")

  //パスワードを入力
  app.secureTextFields.firstMatch.tap()
  app.secureTextFields.firstMatch.typeText("test1234")
  

最後のtypeTextでエラーとなります。

Failed to synthesize event: Neither element nor any descendant has keyboard focus.

何が問題か

これはシミュレータ固有の問題で、シミュレータはソフトキーボードとハードキーボードのどちらも使用できることに起因します。
TextFieldのフォーカスを変える時、ソフトキーボードからハードキーボードが選択されたような挙動になり、ソフトキーボードが隠れてしまいます。
この問題は、記事を書いた時点でのXcode 12.5.1でも起きています。

https://stackoverflow.com/questions/58648283/xcuielementtypetext-fails-for-two-text-fields

解決策

こちらの記事が参考になりました。

https://stackoverflow.com/questions/55381560/force-software-keyboard-in-ios-simulator-for-xcuitest

UITestを実行する場合、ハードキーボードは無効にします。

メニュー>Product>Scheme>Edit Schemeを選択し、
Test>Pre-actions>"+">New Run Script Actionを選択します。

Provide Build Setting fromには対象のUITestを選択します。
スクリプトには下記を記載します。

killall Simulator
defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool false

参考

https://stackoverflow.com/questions/58648283/xcuielementtypetext-fails-for-two-text-fields
https://stackoverflow.com/questions/38010494/is-it-possible-to-toggle-software-keyboard-via-the-code-in-ui-test
https://stackoverflow.com/questions/55381560/force-software-keyboard-in-ios-simulator-for-xcuitest
https://github.com/fastlane/fastlane/issues/16083

Discussion