HTML入門|Selenium・Playwrightで使うタグ・属性・ロケーターの基礎を解説

Selenium・Playwright でテスト自動化を始めると、「要素が取れない」「ロケーターの書き方がわからない」と壁にぶつかることがあります。その根本的な原因の多くは、HTML の読み方を知らないことにあります。本記事では、QA エンジニアがテスト自動化に必要な HTML の基礎知識を、実例つきでわかりやすく解説します。

💡 用語解説:「ロケーター」とは?

Selenium・Playwright でページ上の要素を特定するための指定方法全体をロケーターと呼びます。CSS セレクターや XPath もロケーターの一種です。本記事では「セレクター」と書かれる場面もありますが、ツールの仕様上はロケーターに統一します。

📌 この記事の対象読者

✅ Selenium・Playwright を始めたばかりで、HTML をほとんど読んだことがない方
✅ ロケーター(セレクター)を書くときに何を手がかりにすればいいか迷う方
✅ DevTools で HTML を見ても、どこを見ればいいかわからない方
✅ HTML の経験はないが QA・テスト自動化に取り組みたい方

✅ この記事を読むと得られること

  • HTML のタグ・属性の基本構造が理解できる
  • idclassdata-testid の違いと使いどころがわかる
  • テスト自動化でよく使う HTML 要素とロケーターの対応関係が身につく
  • DevTools で HTML を見たときに「何を探せばいいか」がわかるようになる

👨‍💻 この記事の信頼性について

本記事は QA エンジニアとして15年以上、Selenium・Playwright を使ったテスト自動化に携わってきた筆者が執筆しています。「HTML がわからなくて最初のロケーターすら書けなかった」という実体験をもとに、テスト自動化に本当に必要な知識だけに絞って解説しています。

📌 この記事の結論

  • テスト自動化で必要な HTML 知識は「タグ・属性・フォーム要素」の3つに絞られる
  • Selenium では id → data-testid → name の順。Playwright は要素の種類によって get_by_role() / get_by_label() / get_by_test_id() を使い分ける
  • HTML が読めると DevTools の使い方が一気に理解しやすくなる

テスト自動化のコードを書くとき、必ず登場するのが「要素の特定」です。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⭐ デザイン変更で壊れやすい
typeinput の種類を指定[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 がないときはどうする?

担当の開発者に「テスト用に data-testid を追加してもらえますか?」と依頼するのがベストプラクティスです。テスト品質向上につながるため、多くの現場で受け入れてもらえます。

実務では id が存在しない画面も珍しくありません。その場合は data-testid の追加依頼が最初の選択肢になります。プロジェクト初期から開発者と「テスト属性の追加ルール」を決めておくと後が楽になります。

💡 HTML タグには「役割(role)」がある

<button> タグは内部的に role="button" として扱われます。これが Playwright の page.get_by_role("button", name="ログイン") が機能する理由です。HTML のタグ名がそのまま役割として使えると覚えておくと、Playwright のセマンティックロケーターの理解がスムーズになります。

③ 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 は最終手段として考える

btn-primaryactiveselected のような class はデザイン変更や状態変化で変わることがあります。React・Vue などのフレームワーク由来の class(css-1abcde 等)はビルドのたびに変わるものもあります。id・data-testid がない場合のみ 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 が動的に生成されていて毎回変わる

フレームワークによっては id="input-3f9a" のようにランダムな id が生成されます。こうした id は使えません。data-testid を開発者に追加してもらうのが最善策です。

② class が複数ついていてどれを使えばいいかわからない

btn-primaryactiveselected のような class はデザイン変更や状態変化で変わることがあります。class は id・data-testid が見つからない場合の最終手段として考え、積極的には使わないようにしましょう。

③ label タグと input が紐づいていない

get_by_label("メールアドレス") が動かない場合、<label for="email"><input id="email">for/id が一致していない可能性があります。DevTools で HTML を確認してみましょう。

④ 同じ class 名の要素が複数あって特定できない

class="list-item" が10個ある場合、CSS セレクターだけでは特定できません。親要素の id と組み合わせて絞り込む(例: #product-list .list-item:first-child)か、data-testid を使いましょう。

⑤ ボタンが <button> ではなく <div> や <span> で作られている

見た目はボタンでも HTML では <div class="custom-btn"> の場合があります。By.XPATH や CSS セレクターで取得できますが、DevTools で実際のタグを確認する習慣をつけましょう。

よくある質問(FAQ)

Q. HTML はどこで確認できますか?

ブラウザの Chrome DevTools(F12)→ Elements タブで確認できます。確認したい要素を右クリック →「検証」を選ぶと、その要素の HTML が表示されます。詳しい使い方は Chrome DevTools 入門 を参照してください。

Q. HTML を本格的に勉強する必要がありますか?

テスト自動化目的であれば、本格的な勉強は不要です。タグ・属性・フォーム要素の基礎と、DevTools で HTML を読む感覚を身につければ十分です。Web 制作者レベルの知識は必要ありません。

Q. id と class の違いがよくわかりません。

id はページ内で1つだけ使える名前(個人の名前のようなもの)、class は複数の要素につけられるグループ名(チーム名のようなもの)です。テスト自動化では id の方がユニーク(唯一)なのでロケーターとして信頼できます。

Q. data-testid は誰が追加するのですか?

基本的には開発者(フロントエンドエンジニア)が追加します。QA エンジニアから「この要素にテスト用の data-testid を追加してほしい」と依頼する形が一般的です。テスト品質の向上につながるため、多くの現場で快く対応してもらえます。プロジェクト初期から開発者と合意しておくとスムーズです。

Q. data-testid は必ずなければいけないですか?

必須ではありませんが、あると大幅にテストが安定します。id や name が使える場合はそれを使い、それもない場合は開発者に data-testid の追加を相談するのがベストプラクティスです。

Q. Selenium と Playwright でロケーターの書き方は違いますか?

基本的な考え方は同じですが、書き方が異なります。Selenium は By.IDBy.CSS_SELECTOR などの属性ベースが中心、Playwright は要素の種類に応じて get_by_role()get_by_label()get_by_test_id() を使い分けるのが推奨です。どちらも HTML の属性を手がかりにする点は共通です。

Q. CSS セレクターと XPath はどちらを使えばいいですか?

Selenium では CSS セレクターを使う場面が多いですが、Playwright では get_by_role()get_by_label() などのセマンティックロケーターが推奨されています。CSS・XPath はどちらのツールでも「上記で取れない場合の代替手段」として使います。詳しくは CSSセレクター・XPath 入門 を参照してください。

まとめ

  • HTML はタグ+属性の組み合わせでできている。属性の値がロケーターの手がかりになる
  • Selenium では id → data-testid → name の順で探す。Playwright は要素の種類に応じて get_by_role() / get_by_label() / get_by_test_id() を使い分ける
  • class はデザイン変更・状態変化で変わりやすいため最終手段として扱う
  • フォーム要素(inputbuttonselect)はテスト自動化で最も多く触る要素
  • DevTools で HTML を確認する習慣をつけると、ロケーター選びが格段に速くなる

HTML の全てを覚える必要はありません。「id・data-testid・name を探す」「フォーム要素の種類を知っている」この2つだけで、テスト自動化の最初の壁を大きく乗り越えられます。HTML が読めるようになったら次は Chrome DevTools を使って実際のページの HTML を調査してみましょう。セレクターの検証まで一気通貫でできるようになります。

🗺️ HTML からテスト自動化までの学習マップ

① HTML を読む
← 今ここ
② DevTools で確認③ ロケーターを書く④ テストを実行

📚 あわせて読みたい関連記事

タイトルとURLをコピーしました