🙌
XCUITestで2つのTextFieldに入力する際の問題の解決方法
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
でも起きています。
解決策
こちらの記事が参考になりました。
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
参考
Discussion