チュートリアル

基本操作から応用まで、段階的に学べます。
レベルが上がるほど、より複雑な自動化が実現できます。

「どの順番で何を作ればいいか」から知りたい方は、使い方ページの 自動化の進め方 (はじめての方向けの 2 段階方式/Web に詳しい方向けのセレクタ分析/よくあるフローの型)をご覧ください。
💡 各レベルに「コピーして使えるフロー」が付いています。
アプリの「Create」でフローを開き、右上メニューの「フローを読込」に貼り付けると、練習の完成形フローをそのまま再現できます。 まず自分で組んでみて、答え合わせに使うのがおすすめです。 読み込めない場合はアプリを最新版に更新してください。
Lv.1 タップ Lv.2 文字列入力 Lv.3 待機 Lv.4 インスペクター Lv.5 セレクタ直接入力 Lv.6 スマートタップ Lv.7 条件分岐 Lv.8 スマートテーブルタップ
Lv.1

ボタンをタップする

まずは基本中の基本。Webページ上のボタンを自動でタップするフローを作りましょう。

1

「Create」から新しいフローを作成する

2

「タップ」ノードを追加する

3

ノードの「要素を指定」をタップし、Webページを開いて操作したいボタンをタップする(自動でセレクタが設定されます)

4

フローに名前をつけて保存し、「Run」から実行する

練習

お知らせ一覧の中から「重要なお知らせ」の「確認する」ボタンを自動でタップするフローを作ってみましょう。

練習ページを開く
コピーして使えるフロー

練習ページを開いて「確認する」をタップする完成形です。

{
  "schema_version": "1.0",
  "comment": "チュートリアル Lv.1: 「重要なお知らせ」の確認するボタンを自動タップ",
  "flow": [
    { "id": "node_0", "type": "start" },
    {
      "id": "node_1",
      "type": "reload",
      "target_url": "https://cmirai.jp/app/smauto/practice/lv1_tap.html",
      "wait_condition": "fixed_duration",
      "post_load_wait": 5.0
    },
    {
      "id": "node_2",
      "type": "tap",
      "object_name": "「重要なお知らせ」の確認するボタン",
      "css_selector": "#notice-important button",
      "post_tap_wait": 3.0
    }
  ]
}
Lv.2

文字を入力する

フォームやテキストフィールドに文字を自動で入力する方法を学びます。検索フォームやお問い合わせフォームへの入力などに使えます。

1

「文字列入力」ノードを追加する

2

「要素を指定」で入力したいテキストフィールドをタップして指定する

3

入力するテキストを設定する

4

「タップ」ノードと組み合わせて「テキスト入力 → 送信ボタンをタップ」という流れを作る

例:検索の自動化
「文字列入力(検索ワード)」→「タップ(検索ボタン)」の順にノードをつなぐだけで、毎回同じ検索が全自動になります。

練習

お問い合わせフォームに名前とメッセージを自動入力し、送信ボタンをタップするフローを作ってみましょう。

練習ページを開く
コピーして使えるフロー

2つの欄に自動入力してから送信ボタンをタップする完成形です。

{
  "schema_version": "1.0",
  "comment": "チュートリアル Lv.2: お問い合わせフォームに自動入力して送信",
  "flow": [
    { "id": "node_0", "type": "start" },
    {
      "id": "node_1",
      "type": "reload",
      "target_url": "https://cmirai.jp/app/smauto/practice/lv2_input.html",
      "wait_condition": "fixed_duration",
      "post_load_wait": 5.0
    },
    {
      "id": "node_2",
      "type": "input_text",
      "object_name": "お名前",
      "css_selector": "#name",
      "text": "山田 太郎",
      "clear_first": true,
      "post_input_wait": 3.0
    },
    {
      "id": "node_3",
      "type": "input_text",
      "object_name": "お問い合わせ内容",
      "css_selector": "#message",
      "text": "自動入力の練習です。",
      "clear_first": true,
      "post_input_wait": 3.0
    },
    {
      "id": "node_4",
      "type": "tap",
      "object_name": "送信ボタン",
      "css_selector": "#send-btn",
      "post_tap_wait": 3.0
    }
  ]
}
Lv.3

待機で安定させる

操作と操作の間に「待機」を挟むことで、ページ読み込みが終わる前に次の操作が走るミスを防げます。

1

操作の間に「待機」ノードを追加する

2

待機条件を選ぶ

3

タイムアウト時間を設定して保存する

主な待機条件
  • ページ読み込み完了:ページ全体の読み込みが終わるまで待つ
  • 要素の出現:特定の要素が画面に現れるまで待つ
  • 要素の消失:ローディング表示などが消えるまで待つ
  • URL変化:ページ遷移が完了するまで待つ
  • ネットワーク静止:通信が落ち着くまで待つ
よくある失敗:ページ遷移直後にタップノードを実行すると、要素がまだ画面に存在せずエラーになることがあります。「待機(URL変化)」や「待機(要素の出現)」を挟むことで解決できます。
「満室のときボタンが消える/無効になるタイプ」のページへの対応

サイトによっては、条件を満たしたときだけボタンがDOM上に現れる設計になっていることがあります(例:空室になったときだけ「予約する」ボタンが追加される)。

disabled タイプ
ボタンは常にDOM上に存在。満室のとき disabled 属性が付く。
→ 待機条件:要素が有効になるまで

非表示タイプ
ボタンは空室のときだけDOM上に追加される。満室のとき要素自体が存在しない。
→ 待機条件:要素の出現

練習①

「レポートを生成する」ボタンをタップ → ダウンロードボタンが現れるまで待機 → ダウンロードボタンをタップ、という3ステップを自動化するフローを作ってみましょう。

練習ページを開く
コピーして使えるフロー(練習①)

生成をタップ →「待機(要素が表示されるまで)」→ ダウンロードをタップ、の完成形です。

{
  "schema_version": "1.0",
  "comment": "チュートリアル Lv.3: 生成→ダウンロードボタンの表示を待って→タップ",
  "flow": [
    { "id": "node_0", "type": "start" },
    {
      "id": "node_1",
      "type": "reload",
      "target_url": "https://cmirai.jp/app/smauto/practice/lv3_wait.html",
      "wait_condition": "fixed_duration",
      "post_load_wait": 5.0
    },
    {
      "id": "node_2",
      "type": "tap",
      "object_name": "レポートを生成するボタン",
      "css_selector": "#generate-btn",
      "post_tap_wait": 3.0
    },
    {
      "id": "node_3",
      "type": "wait_for_load",
      "wait_condition": "element_visible",
      "css_selector": "#download-btn",
      "timeout": 15.0
    },
    {
      "id": "node_4",
      "type": "tap",
      "object_name": "ダウンロードボタン",
      "css_selector": "#download-btn",
      "post_tap_wait": 3.0
    }
  ]
}

練習②

空室照会ページには「非表示タイプ」と「disabled タイプ」の部屋が混在しています。それぞれに合った待機条件を使い分けてみましょう。

練習ページを開く
Lv.4

インスペクターで要素を確認する

インスペクターモードを使うと、タップした要素のCSSセレクタやXPath・属性値を確認できます。フローが思い通りに動かないときのデバッグや、Lv.5 以降の上級操作の準備に使いましょう。

1

ブラウザ画面のインスペクターアイコンをタップしてインスペクターモードに入る

2

確認したい要素をタップする

3

表示されたCSSセレクタ・XPath・属性値を確認し、必要ならコピーする

CSSセレクタとは?

Webページ内の特定の要素を指し示す文字列です。例えば #send-btn(IDが send-btn の要素)や .btn-primary(クラスが btn-primary の要素)のように書きます。Smautoでは通常タップで自動指定されますが、セレクタを直接使うことでより柔軟な指定ができます(Lv.5 で解説)。

練習

商品カタログページで各要素をインスペクターでタップし、CSSセレクタ・XPath・属性値を確認してみましょう。ページ内にヒントを用意しています。

練習ページを開く
Lv.5

指定しにくい要素をセレクタで直接指定する

ホバー操作で現れるメニューや、タップした瞬間に消えてしまうポップアップなど、画面タップでは指定しにくい要素を扱う方法です。

1

インスペクターモードで対象要素のCSSセレクタをコピーしておく(Lv.4 参照)

2

「タップ」ノードの要素指定画面で「セレクタを直接入力」を選ぶ

3

コピーしたセレクタを貼り付けて保存する

ヒント:インスペクターモードでは要素のCSSセレクタをワンタップでコピーできます。コピーしたらそのままノードに貼り付けるだけなので、セレクタを手書きする必要はありません。

練習(3チャレンジ)

①ドロップダウン内のボタン ②モーダルダイアログ内の確認ボタン ③ページ読み込み後に動的追加されるボタン、の3種類をセレクタ直接入力でタップするフローを作ってみましょう。

練習ページを開く
コピーして使えるフロー

3つのチャレンジを1本のフローで順にクリアする完成形です。チャレンジ③では「待機(要素の出現)」を組み合わせています。

{
  "schema_version": "1.0",
  "comment": "チュートリアル Lv.5: セレクタ直接入力で3つのボタンを順にタップ",
  "flow": [
    { "id": "node_0", "type": "start" },
    {
      "id": "node_1",
      "type": "reload",
      "target_url": "https://cmirai.jp/app/smauto/practice/lv5_selector.html",
      "wait_condition": "fixed_duration",
      "post_load_wait": 5.0
    },
    {
      "id": "node_2",
      "type": "tap",
      "object_name": "チャレンジ1: ドロップダウン内のヘルプ",
      "css_selector": "#menu-help",
      "post_tap_wait": 3.0
    },
    {
      "id": "node_3",
      "type": "tap",
      "object_name": "チャレンジ2: モーダル内の削除ボタン",
      "css_selector": "#modal-delete-btn",
      "post_tap_wait": 3.0
    },
    {
      "id": "node_4",
      "type": "wait_for_load",
      "wait_condition": "element_appears",
      "css_selector": "#approve-btn",
      "timeout": 15.0
    },
    {
      "id": "node_5",
      "type": "tap",
      "object_name": "チャレンジ3: 動的追加された承認ボタン",
      "css_selector": "#approve-btn",
      "post_tap_wait": 3.0
    }
  ]
}
Lv.6

スマートタップ

「スマートタップ」はテキスト内容・属性値・クラスなどの条件で要素を検索してタップするノードです。ページの構造が変わっても条件に合う要素を自動で見つけてくれます。

1

「スマートタップ」ノードを追加する

2

検索条件を設定する(例:テキストが「予約する」・クラスに「btn-primary」が含まれる、など)

3

対象の要素タイプ(ボタン・リンクなど)を絞り込んで保存する

練習

空室照会ページでは「予約する」ボタンが満室のときは無効(グレーアウト)になっています。スマートタップで「有効な予約するボタン」だけを条件指定して自動タップするフローを作ってみましょう。

練習ページを開く
コピーして使えるフロー

全部屋の予約ボタンを候補にして、「disabled 属性が無い(=有効な)」ボタンだけをタップし、成功したら音を鳴らす完成形です。

{
  "schema_version": "1.0",
  "comment": "チュートリアル Lv.6: 有効な「予約する」ボタンだけをスマートタップ",
  "flow": [
    { "id": "node_0", "type": "start" },
    {
      "id": "node_1",
      "type": "reload",
      "target_url": "https://cmirai.jp/app/smauto/practice/room_list.html",
      "wait_condition": "fixed_duration",
      "post_load_wait": 5.0
    },
    {
      "id": "node_2",
      "type": "smart_tap",
      "entries": [
        {
          "id": "sel_0",
          "label": "空室の予約ボタン",
          "css_selector": "button[data-reserve]",
          "tap_selector": "",
          "tap_mode": "relative",
          "mode": "multi",
          "active": true,
          "tap_conditions": [
            {
              "id": "tc_0",
              "name": "有効な予約ボタン",
              "active": true,
              "conditions": [
                {
                  "id": "c_0",
                  "mode": "relative",
                  "chain": "",
                  "attribute": "disabled",
                  "operator": "attr_not_exists",
                  "value": ""
                }
              ]
            }
          ]
        }
      ],
      "output_flows": [ { "id": "flow_0", "name": "予約できたら" } ],
      "post_tap_wait": 3.0,
      "wait_for_load": false,
      "flow_flow_0": [
        {
          "id": "node_3",
          "type": "play_sound",
          "sound_id": "chime",
          "volume": 1.0,
          "loop": false,
          "wait_for_finish": true
        }
      ]
    }
  ]
}

絶対セレクタと相対セレクタ

要素の指定方法には「絶対セレクタ」と「相対セレクタ」の2種類があります。状況に応じて使い分けることで、より安定したフローが作れます。

絶対セレクタ

1つの要素をタップして直接指定するセレクタです。ページ内の特定の固定要素を正確に狙えます。

向いているケース:ページに同じ種類のボタンが1つしかない、または要素に固有のIDが付いている場合。

例: #send-btn [data-reserve="room-101"]

相対セレクタ

A・Bの2要素をタップして作成します。Smautoが両要素から共通の親要素まで遡り、「Aと同じ親の中にあるB」という位置関係でセレクタを生成します。

向いているケース:同じ構造のカードやリストが並んでいて、特定の名前や文字列の行にあるボタンを押したい場合。

相対セレクタの仕組み

ページが以下のような構造のとき、「101号室」テキスト(A)と「予約する」ボタン(B)をタップすると:

<div class="card">               ← 共通の親まで遡る
  <h5>101号室</h5>              ← ① タップ(要素 A)
  <button>予約する</button>      ← ② タップ(要素 B)
</div>

<div class="card">
  <h5>102号室</h5>
  <button>予約する</button>
</div>

Smautoは「101号室」と「予約する」ボタンを含む共通の親(.card)まで遡り、「101号室というテキストを含むカードの中の予約するボタン」という相対的なセレクタを自動生成します。
これにより、ページ内に同じ「予約する」ボタンが複数あっても、必ず正しい行のボタンをタップできます。

相対セレクタの作り方
1

「タップ」ノードの要素指定で「相対セレクタ」を選ぶ

2

基準となる要素 A をタップする(例:部屋名・商品名など、行を識別できるテキスト要素)

3

操作したい要素 B をタップする(例:その行のボタン)

4

Smautoが A・B 双方から共通の親まで遡り、相対セレクタを自動生成する

使い分けの目安:
同じ構造のリストやカードが並んでいる → 相対セレクタ
ページに1つしかない固定のボタン → 絶対セレクタ

練習

タスクリストページで、同じ「完了にする」ボタンが複数並んでいます。
① 絶対セレクタで「タスクB」の完了ボタンを直接指定する
② 相対セレクタで「タスクB」テキスト(A)+完了ボタン(B)をタップして指定する
2種類の方法を試して違いを体感しましょう。

練習ページを開く
コピーして使えるフロー(相対セレクタの完成イメージ)

「タスクBの行の中にある完了ボタン」という相対的な指定で生成されるセレクタの完成イメージです。実際の練習では2要素をタップして自動生成してみましょう。

{
  "schema_version": "1.0",
  "comment": "チュートリアル Lv.6: 「タスクBの行にある完了ボタン」を相対的に指定してタップ",
  "flow": [
    { "id": "node_0", "type": "start" },
    {
      "id": "node_1",
      "type": "reload",
      "target_url": "https://cmirai.jp/app/smauto/practice/lv6_relative.html",
      "wait_condition": "fixed_duration",
      "post_load_wait": 5.0
    },
    {
      "id": "node_2",
      "type": "tap",
      "object_name": "タスクBの行の完了ボタン",
      "css_selector": "#task-row-B button",
      "post_tap_wait": 3.0
    }
  ]
}
Lv.7

条件分岐(Yes / No)

「要素状態チェック」や「ブラウザ状態チェック」ノードを使うと、現在の画面の状態に応じて処理を Yes / No の2方向に分けられます。「空室なら予約、満室ならリロード」のような柔軟なフローが作れます。

1

「要素状態チェック」または「ブラウザ状態チェック」ノードを追加する

2

チェック対象と条件を設定する(例:「予約するボタン」が「有効な状態である」)

3

ノードのYes出力とNo出力にそれぞれ次のノードをつなぐ

主なチェック条件
  • 要素が存在する / しない
  • 要素が有効 / 無効(disabled)
  • 要素のテキストが〇〇である
  • 現在のURLが〇〇を含む
  • ページタイトルが〇〇である
「存在するか」と「有効か」は別物

ボタンの状態によってチェック条件を使い分ける必要があります。

disabled タイプ(無効化タイプ)

ボタンは常にDOM上に存在するが、満室のとき disabled になる。

→ チェック条件:「要素が有効か」
(要素の存在チェックは常に Yes になるため使えない)

非表示タイプ

空室のときだけボタンがDOM上に現れる。満室のとき要素自体がない。

→ チェック条件:「要素が存在するか」
(有効チェックは要素が見つからずエラーになる)

練習①(disabled タイプ)

空室照会ページの 102・202・301号室(無効化タイプ)を対象に、「予約するボタンが有効か?」をチェックし、Yes なら予約タップ・No ならリロードして再チェック、というループフローを作ってみましょう。

練習ページを開く
コピーして使えるフロー(練習①)

102号室のボタンに disabled 属性が「無い」= 有効かをチェックし、Yes なら予約タップ+音、No ならリロードします。読み込んだ後、エディタで No 側のリロードからチェックノードへ線をつなぐと完全なループになります(Run の繰り返し実行でも同じ動きができます)。

{
  "schema_version": "1.0",
  "comment": "チュートリアル Lv.7 練習①: 102号室(無効化タイプ)。ボタンが有効なら予約、だめならリロード",
  "flow": [
    { "id": "node_0", "type": "start" },
    {
      "id": "node_1",
      "type": "reload",
      "target_url": "https://cmirai.jp/app/smauto/practice/room_list.html",
      "wait_condition": "fixed_duration",
      "post_load_wait": 5.0
    },
    {
      "id": "node_2",
      "type": "if",
      "condition": {
        "css_selector": "button[data-reserve=\"room-102\"]",
        "attribute": "disabled",
        "operator": "attr_not_exists",
        "value": ""
      },
      "yes": [
        {
          "id": "node_3",
          "type": "tap",
          "object_name": "102号室の予約するボタン",
          "css_selector": "button[data-reserve=\"room-102\"]",
          "post_tap_wait": 3.0
        },
        {
          "id": "node_4",
          "type": "play_sound",
          "sound_id": "chime",
          "volume": 1.0,
          "loop": false,
          "wait_for_finish": true
        }
      ],
      "no": [
        {
          "id": "node_5",
          "type": "reload",
          "target_url": "https://cmirai.jp/app/smauto/practice/room_list.html",
          "wait_condition": "fixed_duration",
          "post_load_wait": 5.0
        }
      ]
    }
  ]
}

練習②(非表示タイプ)

同じページの 101・201・401号室(非表示タイプ)を対象に、「予約するボタンが存在するか?」をチェック条件に変えて同様のループフローを作ってみましょう。

練習ページを開く
コピーして使えるフロー(練習②)

練習①との違いはチェック条件だけ:非表示タイプなので「要素が存在するか」(operator: exists)を使います。

{
  "schema_version": "1.0",
  "comment": "チュートリアル Lv.7 練習②: 101号室(非表示タイプ)。ボタンが存在すれば予約、なければリロード",
  "flow": [
    { "id": "node_0", "type": "start" },
    {
      "id": "node_1",
      "type": "reload",
      "target_url": "https://cmirai.jp/app/smauto/practice/room_list.html",
      "wait_condition": "fixed_duration",
      "post_load_wait": 5.0
    },
    {
      "id": "node_2",
      "type": "if",
      "condition": {
        "css_selector": "button[data-reserve=\"room-101\"]",
        "attribute": "",
        "operator": "exists",
        "value": ""
      },
      "yes": [
        {
          "id": "node_3",
          "type": "tap",
          "object_name": "101号室の予約するボタン",
          "css_selector": "button[data-reserve=\"room-101\"]",
          "post_tap_wait": 3.0
        },
        {
          "id": "node_4",
          "type": "play_sound",
          "sound_id": "chime",
          "volume": 1.0,
          "loop": false,
          "wait_for_finish": true
        }
      ],
      "no": [
        {
          "id": "node_5",
          "type": "reload",
          "target_url": "https://cmirai.jp/app/smauto/practice/room_list.html",
          "wait_condition": "fixed_duration",
          "post_load_wait": 5.0
        }
      ]
    }
  ]
}
Lv.8

スマートテーブルタップ

「スマートテーブルタップ」は表形式のページから行・列の条件を指定して、合致するセルを自動でタップするノードです。カレンダーや時刻表など複雑なテーブルに対応できます。

1

「スマートテーブルタップ」ノードを追加する

2

「テーブルを指定」で対象のテーブル要素をタップして指定する

3

行・列の検索条件を設定する(例:行「10:00」・列「7/3」のセルをタップ、など)

4

タップ対象のセルの条件(テキストが「○」など)を設定して保存する

練習

空き状況カレンダーは行が時間・列が日付の表形式ページです。○(空き)と×(満席)が5秒ごとに変わります。スマートテーブルタップで「特定の時間帯かつ○のセル」を見つけてタップするフローを作ってみましょう。

練習ページを開く
コピーして使えるフロー

「10:00 の行」の5列(5日分)を対象に、セルのテキストが「○」のものを見つけてタップし、成功したら音を鳴らす完成形です。

{
  "schema_version": "1.0",
  "comment": "チュートリアル Lv.8: カレンダーの10:00の行から○(空き)のセルを探してタップ",
  "flow": [
    { "id": "node_0", "type": "start" },
    {
      "id": "node_1",
      "type": "reload",
      "target_url": "https://cmirai.jp/app/smauto/practice/calendar.html",
      "wait_condition": "fixed_duration",
      "post_load_wait": 5.0
    },
    {
      "id": "node_2",
      "type": "table_tap_get",
      "table_selector": "#calendar-table",
      "header_row_index": 0,
      "header_col_index": 0,
      "row_labels": [],
      "col_labels": [],
      "default_tap_selector": "",
      "default_tap_conditions": [
        {
          "id": "tc_ok",
          "name": "空き(○)のセル",
          "conditions": [
            {
              "id": "c_0",
              "mode": "relative",
              "chain": "",
              "attribute": "text",
              "operator": "==",
              "value": "○"
            }
          ]
        }
      ],
      "cells": [
        { "id": "cell_1_1", "label": "10:00 × 1日目", "row_label": "10:00", "col_label": "1日目", "row_idx": 1, "col_idx": 1, "active": true, "tap_selector": "", "tap_conditions": [] },
        { "id": "cell_1_2", "label": "10:00 × 2日目", "row_label": "10:00", "col_label": "2日目", "row_idx": 1, "col_idx": 2, "active": true, "tap_selector": "", "tap_conditions": [] },
        { "id": "cell_1_3", "label": "10:00 × 3日目", "row_label": "10:00", "col_label": "3日目", "row_idx": 1, "col_idx": 3, "active": true, "tap_selector": "", "tap_conditions": [] },
        { "id": "cell_1_4", "label": "10:00 × 4日目", "row_label": "10:00", "col_label": "4日目", "row_idx": 1, "col_idx": 4, "active": true, "tap_selector": "", "tap_conditions": [] },
        { "id": "cell_1_5", "label": "10:00 × 5日目", "row_label": "10:00", "col_label": "5日目", "row_idx": 1, "col_idx": 5, "active": true, "tap_selector": "", "tap_conditions": [] }
      ],
      "output_flows": [ { "id": "flow_0", "name": "予約できたら" } ],
      "swap_label_order": false,
      "post_tap_wait": 3.0,
      "flow_flow_0": [
        {
          "id": "node_3",
          "type": "play_sound",
          "sound_id": "chime",
          "volume": 1.0,
          "loop": false,
          "wait_for_finish": true
        }
      ]
    }
  ]
}