モチベ
Webページのスクリーンショットを取る方法を調べている時、この2つのパッケージに出会って、どちらにするか迷ったのでこの記事を書くことにしました。
やること
以下の項目の比較
- seleniumとplaywrightの簡単な紹介
- 実装方法紹介
- 実行時間比較
本題
seleniumとplaywrightについて
Seleniumもplaywrightも、スクリプトからブラウザでのタスクの自動化ができるツールになってます。ブラウザでのタスクとは、ボタンをクリックさせたり、スクショを撮ってもらったりなどなどです。どちらもオープンソースで開発されていて、それぞれのプログラミング言語のパッケージツール(Pythonだとpip)で簡単にインストールできます。今回は、自動でwebサイトのスクリーンショットを撮ることを目的とした時の実行時間にフォーカスして、両者を比較しました。
実装方法(Python)
今回は、1つのページ全部が写ったスクリーンショットを撮ることを行います。
- selenium
def save_screenshot_by_selenium(driver, url, folder_path="images"):
'''
:param driver: webdriver initialized by selenium
:param url: url to take screenshot
:param folder_path: folder path to save screenshot
:return: None
'''
driver.get(url)
# Wait for the page to load (you can adjust the sleep time as needed)
time.sleep(1)
# Use JavaScript to get the full width and height of the webpage
width = driver.execute_script(
"return Math.max( document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth );")
height = driver.execute_script(
"return Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight );")
# Set the window size to match the entire webpage
driver.set_window_size(width, height)
# Find the full page element (usually 'body') and capture the screenshot
full_page = driver.find_element(By.TAG_NAME, "body")
full_page.screenshot(f"{folder_path}/full_shot.png")
driver.quit()
Seleniumは、1つのページ全部が写ったスクリーンショットを撮ることが簡単ではありません。完全に自分の怠慢ですが、コードはここから、拝借させていただきました。
- playwright
def save_screenshot_by_playwright(page, url, folder_path="images"):
'''
:param page: page object from playwright
:param url: url of the page to take screenshot in
:param folder_path: folder path to save screenshot
:return:
'''
page.goto(url)
page.wait_for_timeout(1000) # wait for page to load for 1 second
page.screenshot(path=f"{folder_path}/playwright_screenshot.png", full_page=True)
Playwrightは簡単にできます。対応した関数を呼び出すだけです。ここは、Playwrightの利点だと言えると思います。
実行時間比較
さて、実行時間を見てみましょう。まず、以下の条件を行いました。
1 前提として、ブラウザはChromeを使用しました。
2 対象urlはhttps://google.com
を使用しました。
3 複数回実行の場合は、1秒間隔を空けて実行しました。対象urlのサーバーに負荷をかけない&DoS攻撃だと見なされないためです。
結果を見てみます。
使用したツール/実行時間 | 1回実行時間(秒) | 10回実行時間(秒) | 50回実行時間(秒) |
---|---|---|---|
Selenium | 3.463 | 26.737 | 129.168 |
Playwright | 3.368 | 26.540 | 128.595 |
Playwrightの方がやや速いかったです。なので、Playwrightを使うことにします。ここで本記事を終わりにしてもいいのですが、せっかくなので考察してみます。
考察
実行時間に関しては、わずかですが、Playwrightが高速だということがわかりました。実行時間が増えれば増えるほど、Playwrightの方が早いです。なぜでしょうか?個人的には、考えられる可能性が以下のどれか or 全てだと思います。
- 可能性1 Selenium側の実行コードが原因
Seleniumで、スクショを撮る前に、driver.execute_script
などを実行しています。ここの部分の実行時間分の差かもしれないです。
- 可能性2 WebDriver VS Chromium
厳密にいうと、PlaywrightはChromeではなく、Chromiumを使ってます。Chromeと比べると機能性は劣るが、オープンソースに公開されている。簡単に言うと、Chromeのオープンソース版だと言えると思います。一方で、Seleniumは、WebDriver通じて、ユーザーのローカルPCにインストールされているChromeを操作しています。
Seleniumだと、WebDriverは他のブラウザーにも対応している関係上、Chromeかどうかチェックする実行が入り、実行時間長くなっている可能性があります。PlaywrightはChromiumを直接呼び出しています。この点がPlaywrightの高速な実行時間に繋がっている可能性があります。
参考
- Playwright
- Selenium
- SeleniumとPlaywrightの全体的な比較記
- seleniumのWebDriver
- Chromium
コメント