【Python】SeleniumでWebページのスクリーンショットを保存する

目次

概要

Seleniumを使用して、現在ブラウザに表示されているWebページのスクリーンショットを画像ファイル(PNG形式)として保存する方法を解説します。

テスト自動化におけるエビデンス(証拠画像)の記録や、Web巡回による画面収集などに必須の機能です。

仕様(入出力)

  • 入力: 保存したいファイルのパス(ファイル名)
  • 出力: 指定したパスへの画像ファイル生成(PNG推奨)
  • 前提: Selenium WebDriverでブラウザが起動していること。

基本の使い方

現在開いているページのスクリーンショットを、指定したファイル名で保存する基本的なコードです。

Python

# driver = webdriver.Chrome() ...

# 現在の画面を "screenshot.png" として保存
driver.save_screenshot("screenshot.png")

コード全文

Webサイト(morinokabu.com)にアクセスし、ページが表示された状態でスクリーンショットを撮り、ブラウザを終了する完全な実装例です。

from selenium import webdriver
import time
import os

def capture_web_page():
    """
    指定したURLのスクリーンショットを取得して保存するデモ関数。
    """
    driver = webdriver.Chrome()

    # 画像の保存先設定
    filename = "myimage.png"
    target_url = "https://morinokabu.com"

    try:
        # 1. サイトへアクセス
        print(f"アクセス中: {target_url}")
        driver.get(target_url)

        # ページ読み込みと描画安定のために少し待機
        time.sleep(2)

        # 2. スクリーンショットを保存
        # 成功すると True が返ります
        success = driver.save_screenshot(filename)
        
        if success:
            print(f"スクリーンショットを保存しました: {os.path.abspath(filename)}")
        else:
            print("保存に失敗しました。")

    except Exception as e:
        print(f"エラーが発生しました: {e}")

    finally:
        driver.quit()

if __name__ == "__main__":
    capture_web_page()

カスタムポイント

保存メソッドの種類

Seleniumにはスクリーンショットに関するいくつかのメソッドがあります。

メソッド概要用途
driver.save_screenshot(filename)ファイルに保存最も一般的。PNG形式で保存されます。
driver.get_screenshot_as_file(filename)ファイルに保存save_screenshot とほぼ同じですが、IOエラー時に False を返します。
driver.get_screenshot_as_png()バイナリ取得ファイル保存せず、画像データをバイナリとしてプログラム内で扱いたい場合に使用します。
element.screenshot(filename)要素のみ保存画面全体ではなく、特定のボタンや領域(WebElement)だけを切り抜いて保存します。

注意点

  1. 画面全体のキャプチャ範囲
    • save_screenshot の挙動はブラウザによって異なります。
    • Firefox: ページ全体(スクロールが必要な下部含む)を撮ることが多いです。
    • Chrome: 現在見えている範囲(ビューポート)のみを撮る仕様が基本です。全体を撮りたい場合はヘッドレスモードの設定や、DevToolsプロトコルを使った工夫が必要になります。
  2. ファイルの上書き
    • 同名のファイルが存在する場合、確認なしで上書きされます。
    • 連続して取得する場合は、ファイル名にタイムスタンプ(img_20250101_1200.png)を含める実装が推奨されます。

応用

画面全体ではなく、特定の要素(例えばロゴやグラフ、特定の記事ブロック)だけを狙ってスクリーンショットを撮る方法です。

from selenium import webdriver
from selenium.webdriver.common.by import By

def capture_element_only():
    driver = webdriver.Chrome()
    driver.get("https://www.google.com")

    try:
        # Googleのロゴ画像要素を特定
        # (CSSセレクタ等は変更される可能性があります)
        logo_element = driver.find_element(By.CSS_SELECTOR, "img[alt='Google']")
        
        # その要素だけをキャプチャして保存
        logo_element.screenshot("google_logo.png")
        print("ロゴ画像のみを保存しました。")

    finally:
        driver.quit()

if __name__ == "__main__":
    capture_element_only()

まとめ

driver.save_screenshot() は手軽に画面を記録できる強力なメソッドです。

「テストが失敗した瞬間の画面」や「定期的なサイト監視」など、自動化スクリプトの信頼性を高めるために積極的に活用してください。特定の部品だけ欲しい場合は element.screenshot() が便利です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次