LoginSignup
2
3

More than 1 year has passed since last update.

PlayWrightを使ってみたが、Codegenで生成されたプログラムのままでは動かないことがあることが分かりました。

Posted at

「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」です。

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になってしまうのです。

image.png

そこでそうすれば解決したのかというと、その「28行目: with page.expect_navigation():」するのです。
(もちろん、移行の行のインデントを合わせる必要もありますよ。)

↓こんな感じ

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)

これでいちおう、通るようにはなりましたー。

このように、PlayWrightのCodegenは完璧ではないようですね。
しかしまぁ、全く0から書いていくよりはだいぶマシなので、Codegenは使ってますがね。

ちなみに、ポップアップリンクの他にはFrameを多用しているサイトで「要素が取れない(対象のFrameに移れていない)」という現象が起きて、手書きで修正してなんとかしましたよ💦

苦労しながらもだいぶ書けるようにはなってきたので、次回は、PlayWrightでの要素の取り方やら、値の変え方やら、私が使って上手く行ったものについて、記録を残すという意味で書いておこうと思っております。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3