中年エンジニアの開発と生活の日々

中年エンジニアがソフトウェア開発や日々の生活で得た知見の備忘録

Appium でタッチ操作を実行するには

事の発端

スマートフォン向けアプリのテストを Turnip と RSpec で作成していて、画面をスワイプしてスクロールする必要に迫られて、ユーザーのタッチ操作をどのようにスクリプト記述するのかを調べながら実装してみました。

一般に Appium でテストスクリプトを書く場合は SeleniumAPI を使用して書くのですが、Selenium は元々 Web のテストフレームワークだけあって、タッチジェスチャーなどのスマートフォンの操作を記述することは範囲外です。そのため、Appium の API で記述することになります。

以下は、本家のリファレンスです。

上記サイトを見てもらえると、一般的なタッチジェスチャーが網羅されていることがわかります。

呼び出し方

基本的にはメソッドチェーンを使用して使用するのが良いと思います。

  • TouchAction のインスタンスを生成
  • タッチアクションのメソッドを順次に呼び出し
  • perform メソッドを呼び出して実行

個人的には最後の perform メソッドを呼び出さないとタッチ操作が発動しないというのがわからなくて、しばらく悩みました。 (ドキュメント、ちゃんと読めという話ですが…)

一番簡単なタップは以下のコードで実現できます

pointX = 100
pointY = 200

Appium::TouchAction.new.tap(x:pointX, y:pointY).perform

TouchAction.new でインスタンスを作成し、tap で座標を指定、perform でコマンドを発動させます。tap の戻り値が自分自身なため、メソッドチェーンで次々にコマンドを呼び出すことができます。

メソッドチェーンを使って、複雑な操作を実現することもできます。

pointX = 100
pointY = 200
duration = 2000

Appium::TouchAction.new.press(x: pointX, y: pointY).wait(duration).release.perform

この例では (100, 200) の座標を押下(press)して2秒長押し(wait)した後に指を離す(release)ジェスチャーになります。

画面をスクロールさせるには

swipe を使用して画面をスクロールさせます。swipeは iOSAndroid で引数が違うので使いずらいのですが、iOS では始点の座標と動かすオフセット、何秒かけて動かすかのdurationを設定します。 画面をどの程度スクロールさせるかは始点の座標とオフセットの距離で決まります。画面の論理解像度を取得して、テスト対象のアプリケーションの実装と照らし合わせて、異なる機種でも大丈夫なように座標を計算するのがよいでしょう。

以下は Scroll View の画面サイズと位置を元に下から上に、だいたい0.8画面分スクロールさせるサンプルです

scrollView = find_element(:accessibility_id, 'idOfScrollView)

startX = scrollView.location.x + scrollView.size.width/2
startY = scrollView.location.y + scrollView.size.height * 0.8
offsetY = scrollView.size.height * 0.8
    
Appium::TouchAction.new.swipe(start_x: startX, start_y: startY, offset_x: 0, offset_y: - offsetY, duration: 400).perform

ちなみに、画面のスクロールに関しては Appium には Scroll 用の API があるのですが、テストフレームワークとの相性が合ったりして安定しないようで、皆さん苦労されているようです。