Selenium・Playwright でテスト自動化を始めると、「要素が取れない」「ロケーターの書き方がわからない」と壁にぶつかることがあります。その根本的な原因の多くは、HTML の読み方を知らないことにあります。本記事では、QA エンジニアがテスト自動化に必要な HTML の基礎知識を、実例つきでわかりやすく解説します。
💡 用語解説:「ロケーター」とは? Selenium・Playwright でページ上の要素を特定するための指定方法全体をロケーターと呼びます。CSS セレクターや XPath もロケーターの一種です。本記事では「セレクター」と書かれる場面もありますが、ツールの仕様上はロケーターに統一します。 |
📌 この記事の対象読者
| ✅ Selenium・Playwright を始めたばかりで、HTML をほとんど読んだことがない方 |
| ✅ ロケーター(セレクター)を書くときに何を手がかりにすればいいか迷う方 |
| ✅ DevTools で HTML を見ても、どこを見ればいいかわからない方 |
| ✅ HTML の経験はないが QA・テスト自動化に取り組みたい方 |
✅ この記事を読むと得られること
|
👨💻 この記事の信頼性について 本記事は QA エンジニアとして15年以上、Selenium・Playwright を使ったテスト自動化に携わってきた筆者が執筆しています。「HTML がわからなくて最初のロケーターすら書けなかった」という実体験をもとに、テスト自動化に本当に必要な知識だけに絞って解説しています。 |
📌 この記事の結論
|
テスト自動化のコードを書くとき、必ず登場するのが「要素の特定」です。Selenium なら driver.find_element(By.ID, "email")、Playwright なら page.get_by_test_id("login-btn") のように書きますが、この "email" や "login-btn" という値はどこから来るのでしょうか?
答えは HTML の中にあります。テスト自動化ツールは HTML 要素に付けられた属性を手がかりに要素を見つけます。そのため「HTML が読める」かどうかが、テスト自動化の習得速度に直結します。Web 開発の知識がなくても大丈夫です。QA として必要な最低限の知識だけを、実際の例で確認していきましょう。
HTML の基本構造:タグと属性とは何か
HTML はウェブページの骨格を作る言語です。テスト自動化ツールが「ボタンを押す」「入力欄に文字を入れる」といった操作をするとき、その要素を HTML の属性を手がかりに見つけます。DevTools でどの属性を確認すればよいかは Chrome DevTools 入門 も参考にしてください。
タグの基本
HTML は タグ(<〜>)と呼ばれる部品の組み合わせで構成されています。ほとんどのタグは「開始タグ」と「終了タグ」がペアになっています。
<button>ログイン</button>
<p>この文章が段落です。</p>
<input type="text">属性とは何か
タグには属性を追加できます。属性は「その要素の追加情報」を表し、属性名="値" の形で開始タグの中に書きます。
<input type="email" id="user-email" name="email" placeholder="メールアドレス">
この属性の値こそが、テスト自動化でロケーターを書くときの手がかりになります。
テスト自動化で重要な属性 5 選
HTML にはたくさんの属性がありますが、テスト自動化で使う属性は限られています。以下の5つを押さえれば、ほとんどのロケーターを書けるようになります。
| 属性名 | 役割 | ロケーターでの使い方 | 安定性 |
|---|---|---|---|
id | ページ内で一意の識別子 | By.ID / #email | ⭐⭐⭐ 最優先 |
data-testid | テスト専用の識別子 | [data-testid='xxx'] | ⭐⭐⭐ 最優先 |
name | フォーム送信時のキー名 | By.NAME / [name='email'] | ⭐⭐ 比較的安定 |
class | スタイルのグループ名 | By.CLASS_NAME / .btn-primary | ⭐ デザイン変更で壊れやすい |
type | input の種類を指定 | [type='submit'] | ⭐⭐ 用途が明確な場合に有効 |
① id 属性:一番信頼できる識別子
id はページ内で1つしか使えないという決まりがあるため、ロケーターとして最も安定しています。
<input id="login-email" type="email">
<button id="login-btn">ログイン</button># Selenium
driver.find_element(By.ID, "login-email")
driver.find_element(By.CSS_SELECTOR, "#login-btn")
# Playwright
page.locator("#login-email")
page.locator("#login-btn")② data-testid 属性:テスト専用の最強識別子
data-testid はテストのために開発者が意図的に追加する属性です。デザイン変更や機能改修の影響を受けにくく、テスト自動化で最も壊れにくいロケーターとして推奨されています。
<button data-testid="submit-button" class="btn btn-primary btn-lg">
送信する
</button># Selenium(CSS セレクターで取得)
driver.find_element(By.CSS_SELECTOR, "[data-testid='submit-button']")
# Playwright(専用メソッドあり)
page.get_by_test_id("submit-button")💡 data-testid がないときはどうする? 担当の開発者に「テスト用に 実務では id が存在しない画面も珍しくありません。その場合は data-testid の追加依頼が最初の選択肢になります。プロジェクト初期から開発者と「テスト属性の追加ルール」を決めておくと後が楽になります。 |
💡 HTML タグには「役割(role)」がある |
③ class 属性:便利だが壊れやすい
class はスタイル(見た目)を当てるためのグループ名です。複数の要素に同じ class をつけられるため、ロケーターとしては不安定になりやすいという欠点があります。
<button class="btn btn-primary btn-lg disabled">送信する</button>
↑ デザイン変更・状態変化で変わりやすい
<button class="MuiButton-root css-1abcde">送信</button> <!-- Material UI -->
<button class="chakra-button">送信</button> <!-- Chakra UI -->
<button class="Button_btn__abc123">送信</button> <!-- CSS Modules -->
↑ ビルドのたびに変わる可能性あり⚠️ class は最終手段として考える |
テスト自動化でよく使うフォーム要素
Web アプリのテストで最も多く登場するのがフォーム要素です。ログイン・登録・検索などのほとんどの操作がフォームを通じて行われます。
フォーム要素とロケーター対応表
| HTML タグ | 画面上の表示 | Selenium コード例 | Playwright 推奨 |
|---|---|---|---|
<input type="text"> | テキスト入力欄 | find_element(By.ID, "...").send_keys("値") | get_by_label("ラベル名") |
<input type="email"> | メールアドレス入力欄 | find_element(By.ID, "...").send_keys("値") | get_by_label("メール") |
<input type="password"> | パスワード入力欄(マスク) | find_element(By.ID, "...").send_keys("値") | get_by_label("パスワード") |
<input type="checkbox"> | チェックボックス | find_element(By.ID, "...").click() | get_by_label("規約に同意") |
<button> | ボタン | find_element(By.ID, "...").click() | get_by_role("button", name="ログイン") |
<select> | ドロップダウン | Select(element).select_by_value("値") | select_option("値") |
<textarea> | 複数行テキスト入力 | find_element(By.ID, "...").send_keys("値") | get_by_label("コメント") |
<a> | リンク | find_element(By.LINK_TEXT, "テキスト") | get_by_role("link", name="テキスト") |
実践:ログインフォームの HTML を読んでロケーターを書く
実際の HTML を読んでロケーターを書く流れを確認しましょう。
<form id="login-form">
<label for="email">メールアドレス</label>
<input type="email"
id="email"
name="email"
data-testid="login-email"
placeholder="例:user@example.com">
<label for="password">パスワード</label>
<input type="password"
id="password"
name="password"
data-testid="login-password">
<button type="submit"
id="login-btn"
data-testid="login-submit">
ログイン
</button>
</form>この HTML から書けるロケーターの例がこちらです。
# Selenium の場合(id を優先)
email_input = driver.find_element(By.ID, "email")
password_input = driver.find_element(By.ID, "password")
login_button = driver.find_element(By.ID, "login-btn")
email_input.send_keys("test@example.com") # サンプルURL
password_input.send_keys("password123")
login_button.click()
# Playwright の場合① get_by_test_id(data-testid がある場合)
page.get_by_test_id("login-email").fill("test@example.com") # サンプルURL
page.get_by_test_id("login-password").fill("password123")
page.get_by_test_id("login-submit").click()
# Playwright の場合② get_by_label / get_by_role(セマンティックロケーター優先)
page.get_by_label("メールアドレス").fill("test@example.com") # サンプルURL
page.get_by_label("パスワード").fill("password123")
page.get_by_role("button", name="ログイン").click()ロケーターを選ぶときの優先順位
Selenium と Playwright では推奨するロケーターが異なります。使っているツールに合わせて参照してください。
Selenium の場合:属性ベースで安定したものを優先
| ① id | → | ② data-testid | → | ③ name | → | ④ CSS | → | ⑤ XPath |
左ほど安定・右ほど壊れやすい
Playwright の場合:要素の種類によって使い分ける
Playwright では要素の種類に応じて適切なロケーターを選ぶのが基本方針です。固定された「絶対順位」はなく、状況に合わせて使い分けます。
| 要素の種類 | 推奨ロケーター | 例 |
|---|---|---|
| ボタン・リンクなどインタラクティブ要素 | get_by_role() | get_by_role("button", name="ログイン") |
| label のある入力フォーム | get_by_label() | get_by_label("メールアドレス") |
| data-testid が付いている要素 | get_by_test_id() | get_by_test_id("login-submit") |
| 上記で取得しにくい場合 | locator() | locator("#email") |
💡 Playwright の考え方:ユーザー視点で要素を取得できるロケーターを優先します。ただし data-testid の方が安定するケースも多く、状況に応じて使い分けるのが実務的です。 |
HTML を読むときのはまりポイント
🚧 はまりポイント一覧 ① id が動的に生成されていて毎回変わる フレームワークによっては ② class が複数ついていてどれを使えばいいかわからない ③ label タグと input が紐づいていない ④ 同じ class 名の要素が複数あって特定できない ⑤ ボタンが <button> ではなく <div> や <span> で作られている 見た目はボタンでも HTML では |
よくある質問(FAQ)
ブラウザの Chrome DevTools(F12)→ Elements タブで確認できます。確認したい要素を右クリック →「検証」を選ぶと、その要素の HTML が表示されます。詳しい使い方は Chrome DevTools 入門 を参照してください。
テスト自動化目的であれば、本格的な勉強は不要です。タグ・属性・フォーム要素の基礎と、DevTools で HTML を読む感覚を身につければ十分です。Web 制作者レベルの知識は必要ありません。
id はページ内で1つだけ使える名前(個人の名前のようなもの)、class は複数の要素につけられるグループ名(チーム名のようなもの)です。テスト自動化では id の方がユニーク(唯一)なのでロケーターとして信頼できます。
基本的には開発者(フロントエンドエンジニア)が追加します。QA エンジニアから「この要素にテスト用の data-testid を追加してほしい」と依頼する形が一般的です。テスト品質の向上につながるため、多くの現場で快く対応してもらえます。プロジェクト初期から開発者と合意しておくとスムーズです。
必須ではありませんが、あると大幅にテストが安定します。id や name が使える場合はそれを使い、それもない場合は開発者に data-testid の追加を相談するのがベストプラクティスです。
基本的な考え方は同じですが、書き方が異なります。Selenium は By.ID・By.CSS_SELECTOR などの属性ベースが中心、Playwright は要素の種類に応じて get_by_role()・get_by_label()・get_by_test_id() を使い分けるのが推奨です。どちらも HTML の属性を手がかりにする点は共通です。
Selenium では CSS セレクターを使う場面が多いですが、Playwright では get_by_role() や get_by_label() などのセマンティックロケーターが推奨されています。CSS・XPath はどちらのツールでも「上記で取れない場合の代替手段」として使います。詳しくは CSSセレクター・XPath 入門 を参照してください。
まとめ
|
HTML の全てを覚える必要はありません。「id・data-testid・name を探す」「フォーム要素の種類を知っている」この2つだけで、テスト自動化の最初の壁を大きく乗り越えられます。HTML が読めるようになったら次は Chrome DevTools を使って実際のページの HTML を調査してみましょう。セレクターの検証まで一気通貫でできるようになります。
🗺️ HTML からテスト自動化までの学習マップ
|
📚 あわせて読みたい関連記事 |
