Appiumに関して、以下の2点に関してメモがてら。
- 文字入力
- WebView(Hybrid view)
以下、Appium1.3.4の時の話です。
文字入力
iOSでは、Appium(というか、Selenium)が提供するキー入力にsendKeysが存在します。また、UIAutomationでは、setValueが提供されています。
iOSでは、マルチバイト文字入力含め、setValueによる文字入力のほうが安定しています。ですが、全てのテキストフィールドにそれを使うことができるわけではありません。SecureTextFieldに関しては、sendKeysを使わなければ正常に文字入力ができませんでした。
そのため、安定したテストを書くためには、TextFieldにはsetValueを、SecureTextFieldのみはsendKeysを使いましょう。
Rubyのライブラリの話をすると、appium_libのこの行を参考にすると、以下の通り type で定義されているメソッドに内包されています。
# Cross platform way of entering text into a textfield
def type text
# type
$driver.execute_script %(au.getElement('#{self.ref}').setValue('#{text}');)
end # def type
また、同様にソースを見ると、このメソッドはAndroidではsend_keysとして扱われています。
そのため、以下のようなルールを設けて実施すると良いでしょう。
- SecureTextFieldを対象にしている場合はsend_key
- ↑以外の場合はsetValue
こんな感じで内包することになるでしょうか。
def fill(text, in_element)
if is_element.class == 'UIASecureText' # ちゃんと書き換えることが必要
in_element.send_keys text
else
in_element.type text
end
end
WebView
Hybridアプリの場合、contextを変更することでネイティブ、WebViewのそれぞれを操作対象として変更することができます。
なのですが、iOSアプリの一部WebViewで操作する必要のある画面をiOS Simulatorで実行していた時の話です。contextでWebViewに設定しても期待通りに動作しませんでした。むしろ、正常に要素すら取得できていなかったです。逆に、Nativeで実施すると正しく動作した。
AndroidやiOS real deviceの話までは詳しく追ってはないのですが、context switchはいらないのか…??