基本操作から応用まで、段階的に学べます。
レベルが上がるほど、より複雑な自動化が実現できます。
まずは基本中の基本。Webページ上のボタンを自動でタップするフローを作りましょう。
「Create」から新しいフローを作成する
「タップ」ノードを追加する
ノードの「要素を指定」をタップし、Webページを開いて操作したいボタンをタップする(自動でセレクタが設定されます)
フローに名前をつけて保存し、「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
}
]
}
フォームやテキストフィールドに文字を自動で入力する方法を学びます。検索フォームやお問い合わせフォームへの入力などに使えます。
「文字列入力」ノードを追加する
「要素を指定」で入力したいテキストフィールドをタップして指定する
入力するテキストを設定する
「タップ」ノードと組み合わせて「テキスト入力 → 送信ボタンをタップ」という流れを作る
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
}
]
}
操作と操作の間に「待機」を挟むことで、ページ読み込みが終わる前に次の操作が走るミスを防げます。
操作の間に「待機」ノードを追加する
待機条件を選ぶ
タイムアウト時間を設定して保存する
サイトによっては、条件を満たしたときだけボタンがDOM上に現れる設計になっていることがあります(例:空室になったときだけ「予約する」ボタンが追加される)。
disabled タイプ
ボタンは常にDOM上に存在。満室のとき disabled 属性が付く。
→ 待機条件:要素が有効になるまで
非表示タイプ
ボタンは空室のときだけDOM上に追加される。満室のとき要素自体が存在しない。
→ 待機条件:要素の出現
生成をタップ →「待機(要素が表示されるまで)」→ ダウンロードをタップ、の完成形です。
{
"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
}
]
}
インスペクターモードを使うと、タップした要素のCSSセレクタやXPath・属性値を確認できます。フローが思い通りに動かないときのデバッグや、Lv.5 以降の上級操作の準備に使いましょう。
ブラウザ画面のインスペクターアイコンをタップしてインスペクターモードに入る
確認したい要素をタップする
表示されたCSSセレクタ・XPath・属性値を確認し、必要ならコピーする
Webページ内の特定の要素を指し示す文字列です。例えば #send-btn(IDが send-btn の要素)や .btn-primary(クラスが btn-primary の要素)のように書きます。Smautoでは通常タップで自動指定されますが、セレクタを直接使うことでより柔軟な指定ができます(Lv.5 で解説)。
ホバー操作で現れるメニューや、タップした瞬間に消えてしまうポップアップなど、画面タップでは指定しにくい要素を扱う方法です。
インスペクターモードで対象要素のCSSセレクタをコピーしておく(Lv.4 参照)
「タップ」ノードの要素指定画面で「セレクタを直接入力」を選ぶ
コピーしたセレクタを貼り付けて保存する
練習(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
}
]
}
「スマートタップ」はテキスト内容・属性値・クラスなどの条件で要素を検索してタップするノードです。ページの構造が変わっても条件に合う要素を自動で見つけてくれます。
「スマートタップ」ノードを追加する
検索条件を設定する(例:テキストが「予約する」・クラスに「btn-primary」が含まれる、など)
対象の要素タイプ(ボタン・リンクなど)を絞り込んで保存する
練習
空室照会ページでは「予約する」ボタンが満室のときは無効(グレーアウト)になっています。スマートタップで「有効な予約するボタン」だけを条件指定して自動タップするフローを作ってみましょう。
練習ページを開く全部屋の予約ボタンを候補にして、「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号室というテキストを含むカードの中の予約するボタン」という相対的なセレクタを自動生成します。
これにより、ページ内に同じ「予約する」ボタンが複数あっても、必ず正しい行のボタンをタップできます。
「タップ」ノードの要素指定で「相対セレクタ」を選ぶ
基準となる要素 A をタップする(例:部屋名・商品名など、行を識別できるテキスト要素)
操作したい要素 B をタップする(例:その行のボタン)
Smautoが A・B 双方から共通の親まで遡り、相対セレクタを自動生成する
練習
タスクリストページで、同じ「完了にする」ボタンが複数並んでいます。
① 絶対セレクタで「タスク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
}
]
}
「要素状態チェック」や「ブラウザ状態チェック」ノードを使うと、現在の画面の状態に応じて処理を Yes / No の2方向に分けられます。「空室なら予約、満室ならリロード」のような柔軟なフローが作れます。
「要素状態チェック」または「ブラウザ状態チェック」ノードを追加する
チェック対象と条件を設定する(例:「予約するボタン」が「有効な状態である」)
ノードのYes出力とNo出力にそれぞれ次のノードをつなぐ
ボタンの状態によってチェック条件を使い分ける必要があります。
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
}
]
}
]
}
「スマートテーブルタップ」は表形式のページから行・列の条件を指定して、合致するセルを自動でタップするノードです。カレンダーや時刻表など複雑なテーブルに対応できます。
「スマートテーブルタップ」ノードを追加する
「テーブルを指定」で対象のテーブル要素をタップして指定する
行・列の検索条件を設定する(例:行「10:00」・列「7/3」のセルをタップ、など)
タップ対象のセルの条件(テキストが「○」など)を設定して保存する
練習
空き状況カレンダーは行が時間・列が日付の表形式ページです。○(空き)と×(満席)が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
}
]
}
]
}