「Playwright」というツールが、「Selenium」や「puppeteer」と比べてもだいぶ使い勝手が良さそうなので、使ってみました。
インストール方法や簡単な利用方法については、↓これらの記事がとても参考になりますので、是非見てください。
私も、上記の記事を参考にWindows10のマシンに環境構築しまして、実行してみました。
私の環境はこんな感じです。
・OS:Windows 10
・Python 3.10
・Playwright 1.17.0-rc1
↓のコマンドでAmazonさんのページで試してみました。
>playwright codegen https://www.amazon.co.jp/ -o test.py
普通に1つのブラウザ上でテキスト入力させたり、ボタンやリンクのクリックなどの動作については、この「codegen」で生成されたプログラムでそのまま実行可能なのですが、今回、試しにポップアップのあるリンクを叩いてみました。
↓のコードが自動生成された「test.py」です。
from playwright.sync_api import Playwright, sync_playwright
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
# Open new page
page = context.new_page()
# Go to https://www.amazon.co.jp/
page.goto("https://www.amazon.co.jp/")
# Click [aria-label="検索"]
page.click("[aria-label=\"検索\"]")
# Fill [aria-label="検索"]
page.fill("[aria-label=\"検索\"]", "マウス")
# Press Enter
# with page.expect_navigation(url="https://www.amazon.co.jp/s?k=%E3%83%9E%E3%82%A6%E3%82%B9&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&ref=nb_sb_noss_1"):
with page.expect_navigation():
page.press("[aria-label=\"検索\"]", "Enter")
# assert page.url == "https://www.amazon.co.jp/s/ref=nb_sb_noss_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=%E3%83%9E%E3%82%A6%E3%82%B9"
# Click text=ロジクール SEB-M705 ワイヤレスマウス 無線 Unifying 7ボタン 高速スクロール 電池寿命最大36ケ月 ワイヤレス マウス ブラック windo
# with page.expect_navigation(url="https://www.amazon.co.jp/%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB-SEB-M705-%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E3%83%9E%E3%82%A6%E3%82%B9-Unifying-%E9%9B%BB%E6%B1%A0%E5%AF%BF%E5%91%BD%E6%9C%80%E5%A4%A736%E3%82%B1%E6%9C%88/dp/B08GP2H88M/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%9E%E3%82%A6%E3%82%B9&qid=1638027376&sr=8-1-spons&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEyR0JJU0RPNE44NlcxJmVuY3J5cHRlZElkPUEwNTI4OTA0M0NVV1A2VFJaTlY1RiZlbmNyeXB0ZWRBZElkPUEyRkZSSjlHNEhJSFhWJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ&th=1"):
with page.expect_navigation():
with page.expect_popup() as popup_info:
page.click("text=ロジクール SEB-M705 ワイヤレスマウス 無線 Unifying 7ボタン 高速スクロール 電池寿命最大36ケ月 ワイヤレス マウス ブラック windo")
page1 = popup_info.value
# Click text=Logicool(ロジクール)のストアを表示
page1.click("text=Logicool(ロジクール)のストアを表示")
# assert page1.url == "https://www.amazon.co.jp/stores/Logicool%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB/page/5A354963-400A-487E-B4D7-41D3DEC9F9F9?ref_=ast_bln"
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
「page.expect_popup()」の箇所と次の行(Click)が、ポップアップリンクをクリックしているところになります。
このまま動かすと、「28行目: with page.expect_navigation():」で、↓TimeoutErrorになってしまうのです。
そこでそうすれば解決したのかというと、その「28行目: with page.expect_navigation():」するのです。
(もちろん、移行の行のインデントを合わせる必要もありますよ。)
↓こんな感じ
from playwright.sync_api import Playwright, sync_playwright
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
# Open new page
page = context.new_page()
# Go to https://www.amazon.co.jp/
page.goto("https://www.amazon.co.jp/")
# Click [aria-label="検索"]
page.click("[aria-label=\"検索\"]")
# Fill [aria-label="検索"]
page.fill("[aria-label=\"検索\"]", "マウス")
# Press Enter
# with page.expect_navigation(url="https://www.amazon.co.jp/s?k=%E3%83%9E%E3%82%A6%E3%82%B9&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&ref=nb_sb_noss_1"):
with page.expect_navigation():
page.press("[aria-label=\"検索\"]", "Enter")
# assert page.url == "https://www.amazon.co.jp/s/ref=nb_sb_noss_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=%E3%83%9E%E3%82%A6%E3%82%B9"
# Click text=ロジクール SEB-M705 ワイヤレスマウス 無線 Unifying 7ボタン 高速スクロール 電池寿命最大36ケ月 ワイヤレス マウス ブラック windo
# with page.expect_navigation(url="https://www.amazon.co.jp/%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB-SEB-M705-%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E3%83%9E%E3%82%A6%E3%82%B9-Unifying-%E9%9B%BB%E6%B1%A0%E5%AF%BF%E5%91%BD%E6%9C%80%E5%A4%A736%E3%82%B1%E6%9C%88/dp/B08GP2H88M/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%9E%E3%82%A6%E3%82%B9&qid=1638027376&sr=8-1-spons&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEyR0JJU0RPNE44NlcxJmVuY3J5cHRlZElkPUEwNTI4OTA0M0NVV1A2VFJaTlY1RiZlbmNyeXB0ZWRBZElkPUEyRkZSSjlHNEhJSFhWJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ&th=1"):
# with page.expect_navigation(): ←※ここを削除
with page.expect_popup() as popup_info:
page.click("text=ロジクール SEB-M705 ワイヤレスマウス 無線 Unifying 7ボタン 高速スクロール 電池寿命最大36ケ月 ワイヤレス マウス ブラック windo")
page1 = popup_info.value
# Click text=Logicool(ロジクール)のストアを表示
page1.click("text=Logicool(ロジクール)のストアを表示")
# assert page1.url == "https://www.amazon.co.jp/stores/Logicool%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB/page/5A354963-400A-487E-B4D7-41D3DEC9F9F9?ref_=ast_bln"
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
これでいちおう、通るようにはなりましたー。
このように、PlayWrightのCodegenは完璧ではないようですね。
しかしまぁ、全く0から書いていくよりはだいぶマシなので、Codegenは使ってますがね。
ちなみに、ポップアップリンクの他にはFrameを多用しているサイトで「要素が取れない(対象のFrameに移れていない)」という現象が起きて、手書きで修正してなんとかしましたよ💦
苦労しながらもだいぶ書けるようにはなってきたので、次回は、PlayWrightでの要素の取り方やら、値の変え方やら、私が使って上手く行ったものについて、記録を残すという意味で書いておこうと思っております。