
PlaywrightでWeb操作を自動化する際に、より安定した要素の操作を可能にするのが .locator()
というメソッドです。
この記事では .locator()
の基本的な使い方から、具体的な活用シーン、.query_selector()
などとの違いまで、初心者にもわかりやすく丁寧に解説します。
.locator() とは?
.locator()
は、Playwrightにおいて Webページ内の要素を「柔軟かつ再利用可能な形」で指定する ためのメソッドです。
Playwrightでは、ボタンや入力欄といった要素を選択して操作する必要がありますが、.locator()
を使うことで、動的なページでもより正確に要素を捉えることができます。
.locator()
は遅延評価されるため、ページの読み込みを待たずに書ける- 同じセレクターを何度も使い回せる(再利用性が高い)
具体例①:基本的な使い方
まずは、単純なボタンをクリックする基本パターンを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto("https://example.com") button = page.locator("button#start") button.click() browser.close() |
このコードでは、以下のような操作が行われています:
- ページ内の
button#start
というボタンを.locator()
で取得 - ボタンが表示されるタイミングに関係なく定義できる
.click()
を使ってそのボタンをクリック
.locator()
によって、要素の準備ができるまで待ってから操作してくれるため、より安定したコードになります。
具体例②:複数の同じ要素を順に操作したいとき
ページ内に同じようなボタンが複数ある場合にも .locator()
は便利です。
1 2 3 4 5 6 |
items = page.locator("ul li") count = items.count() for i in range(count): print(items.nth(i).inner_text()) |
この例では:
ul li
でリストアイテムをすべて取得.count()
で件数を取得.nth(i)
で1つずつアクセス
通常の query_selector_all
のように都度セレクターを探すのではなく、locatorの中で動的にアクセスできるのが大きな利点です。
具体例③:.locator()
を使わない場合との違い
Playwrightでは .locator()
を使わず、代わりに .query_selector()
を使って要素を操作することもできます。
まずは .query_selector()
を使った場合の例を見てみましょう。
1 2 3 |
element = page.query_selector("button#start") element.click() |
このコードでは、ページにある #start
というボタンを探してクリックしています。
一見シンプルで良さそうに見えますが、この方法には以下のような注意点があります:
- 要素がまだ描画されていないタイミングだと
None
が返り、click()
がエラーになる - 複数回使うと毎回セレクター検索が走る(再利用性が低い)
- DOM変化に弱く、一度取得した要素が無効になることもある
対して .locator()
を使った場合
1 2 3 |
button = page.locator("button#start") button.click() |
この方法なら:
- 要素の出現をPlaywrightが自動で待機してくれる
- 遅延評価なので、ページ読み込みの途中でも先に書ける
- 同じ要素に何度も操作してもOK(状態に応じて動く)
動的なWebページを扱う機会が多い場合には、.locator()
を使うのが断然おすすめです。
類似メソッドとの違い
先ほどの具体例③と被る点もありますが、.locator()
を使ううえで、似たような .query_selector()
や .query_selector_all()
と何が違うのかを知っておくと便利です。
メソッド | 説明 | 特徴 |
---|---|---|
.locator() |
遅延評価・自動待機付きの要素取得 | 複数回の操作や待機が必要な処理に最適 |
.query_selector() |
すぐに要素を取得(待機なし) | 要素が既にあることが確実なときに使う |
.query_selector_all() |
全ての一致要素を即時取得(待機なし) | 要素の数を固定的に扱いたいときに使う |
つまり:
- 待ち時間や再利用を考慮するなら
.locator()
- 一発で取れる場合や、既に描画済みの要素なら
.query_selector()
という使い分けが基本になります。
注意点
便利な .locator()
ですが、以下の点に注意しましょう。
- 取得するたびに新しいLocatorオブジェクトを生成するので、何度も使う場合は変数に格納しておくと効率的です。
- 要素の存在を前提にすると、非表示のままだったりDOMにないときに
.click()
などでエラーになります。
.is_visible()
や.wait_for()
と組み合わせるとより安全です。
まとめ
今回は .locator()
メソッドを紹介しました。
.locator()
は Playwrightで要素を安定して操作するための強力なメソッド- 遅延評価・自動待機・再利用性の高さが特徴
.query_selector()
よりも柔軟に使えるので、動的なページに最適- リスト要素の繰り返しやクリック処理など、幅広いシーンで活躍
Web自動化を効率よく、安定して行ううえで、.locator()
の理解と活用は欠かせません。
Playwrightを使うなら、まず覚えておきたい基本メソッドのひとつです。