Appium + Protractor で iOS に対してタッチやスワイプ等の動作を行うには

Appium + Protractor で iOS に対して E2E テストをしていて、要素のクリックなどではなく、指を置いて縦横に滑らすスワイプ操作を再現する必要が出てきた。そのやり方を調べたので紹介。

まず、予め protractor.conf.js に以下のようにしてグローバル変数を作っておく。

// グローバルに wd (WebDriver) を置いておく
global._wd = require('wd');

// …中略…

  onPrepare: () => {
    // その他の処理は省略
    
    // グローバルに __blowser を置いておく
    browser.driver.manage().driver_.getSession()
      .then((obj) => {
        global.__session_id = obj.id_;
        global.__browser = global._wd.promiseChainRemote({
          host: 'localhost',
          port: 4723
        });
        global.__browser.attach(global.__session_id);
      });

そしてテストコード側は以下のような感じで書く。

// スワイプ操作前のなにか Promise な処理
something()
  .then(() => {
    // ココでは下から上にスワイプする操作を行う
    return new global._wd.TouchAction(global.__browser)
      .press({ x: 100, y: 100 })
      .moveTo({ x: 1, y: -100 })
      .release()
      .perform();
    })
    .then(() => {
      // スワイプ操作後の処理…
    });

とりあえずこんな感じで画面をスワイプさせることができた。Action 回りはよく分かんないです;;