PythonでSeleniumを使う方法|自動化・テストの実例を紹介

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年10月)

✔以下の疑問をお持ちの方へ向けた記事です

「Seleniumとは一体何だろう?」

「Seleniumの基本的な使い方や特徴を理解したい」

「Seleniumを使用したウェブ自動化の実例を知りたい」

✔当記事を読むことで得られる知識

  • Seleniumの基本的な概念とその役割
  • Seleniumの主要な機能と使い方
  • Seleniumを用いたウェブブラウザの自動操作の具体的な例

当記事では、ウェブブラウザの自動化ツールであるSeleniumについて、その基本的な概念から役割、主な機能、そして実際のウェブブラウザ操作の自動化にどのように活用されるかなどを初心者にもわかりやすく解説します。

ぜひ最後までご覧ください。

✔手を動かしながら学びたい人はこちらもどうぞ

実際のアプリケーションをSleniumで動かしながらテストしています。

見ながら手を動かして学びましょう。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Seleniumとは

こちらでは、「Selenium」についてお伝えしていきます。

Seleniumについて理解することで、ウェブブラウザの自動操作やテストの自動化に役立つでしょう。

  • 基本概念
  • Seleniumの使用場面
  • スクレイピングの流れ
  • スクレイピングでの使い方

基本概念

Seleniumは、ウェブブラウザの自動操作を可能にするツールです。

主にテストの自動化やウェブスクレイピングに使用されます。

WebDriverというコンポーネントを通じて、さまざまなブラウザとの連携が可能です。

Seleniumの使用場面

Seleniumを使って、ウェブアプリケーションの自動テストなどがおこなえます。

以下はSeleniumが使われる主な場面や用途です。

  1. ブラウザの自動化
    Seleniumで、ウェブページの読み込みや、フォームの入力、ボタンのクリックなどの操作をプログラムで自動的におこなえます。
  2. ウェブアプリケーションのテスト
    Seleniumは、アプリケーションの変更後に、以前の機能が正しく動作しているかを確認するために使えます。
  3. クロスブラウザテスト
    Seleniumは、アプリケーションが異なるブラウザで一貫して動作することを確認できるのです。
  4. 継続的インテグレーション
    Seleniumのテストは、継続的インテグレーションツール(例: Jenkins, Travis CIなど)と組み合わせて、コードの変更ごとに自動的にテストを実行できます。
  5. ページのスクレイピング
    Seleniumは、動的なコンテンツを持つウェブページからデータを取得するためのスクレイピングツールとしても使用されることがあります。ただし、スクレイピングはウェブサイトの利用規約や法律に違反する場合があるため、注意が必要です。
  6. パフォーマンステスト
    Seleniumを使用して、ウェブアプリケーションのパフォーマンスやレスポンスタイムをテストも可能です。
  7. ロードテスト
    Selenium Gridを使用して、多数のブラウザインスタンスを同時に起動し、アプリケーションのロードテストをおこなえます。

これらの用途を考慮すると、Seleniumはウェブアプリケーションの開発やテストに関わる多くのプロジェクトで非常に有用です。

スクレイピングの流れ

スクレイピングは、ウェブページから情報を取得するプロセスを指します。

Seleniumは、以下のようなことを自動化し、データを取得するのにも使えます。

  • ページの読み込み
  • 要素の選択
  • クリック操作

ただし許可されていないサイトでデータを取得する行為は、違法となる場合があります。

正しく使用してください。

環境設定

こちらでは、Seleniumを使用するための環境設定についてお伝えします。

適切な環境を整えることで、Seleniumの機能を最大限に活用することができます。

  • Dockerでの環境構築
  • ローカルでの環境構築

Dockerでの環境構築

Dockerを使用すると、環境の差異を気にせずにSeleniumを動作させられます。

以下は、Dockerを使用したSeleniumの環境構築の手順です。

  1. ChromeとWebDriverのインストール
  2. Dockerコンテナの起動
  3. PythonのSeleniumバインディングの導入
  4. 実際の動作確認

ChromeとWebDriverのインストール

Dockerイメージには、ChromeとWebDriverがプリインストールされているものを選ぶと便利です。

これにより、ブラウザのバージョンやWebDriverの互換性の問題を気にせずに進められます。

docker pull selenium/standalone-chrome:latest

Dockerコンテナの起動

Dockerのコンテナを起動しましょう。

docker run -d -p 4444:4444 --name selenium-hub selenium/standalone-chrome:latest

PythonのSeleniumバインディングの導入

Python用のSeleniumライブラリをインストールすることで、PythonからSeleniumを操作できます。

pip install selenium

Seleniumは頻繁にアップデートされます。

仮想環境などでバージョンを正しく管理することが重要です。

実際の動作確認

環境構築が完了したら、簡単なスクリプトを実行してSeleniumが正しく動作するかを確認します。

例えば、Googleのトップページを開くスクリプトなどで試してみましょう。

from selenium import webdriver

driver = webdriver.Remote(
    command_executor='http://localhost:4444/wd/hub',
    options=webdriver.ChromeOptions(),
)

driver.get("http://www.google.com")
print(driver.title)
driver.quit()

ローカルでの環境構築

Dockerを使用しない場合の、ローカル環境でのSeleniumのセットアップ方法について説明します。

  • Chromeのインストール
  • WebDriverのインストール
  • PythonのSeleniumバインディングの導入
  • 実際の動作確認

Chromeのインストール

使用するブラウザとしてChromeをインストールします。

公式サイトからダウンロードしてインストールしましょう。

Seleniumは実行するブラウザも指定できます。

まずはよく使われているブラウザ「Google Chrome」から試していきましょう。

WebDriverのインストール

Chromeと互換性のあるWebDriverをダウンロードし、適切な場所に配置します。

SeleniumからChromeを操作しましょう。

PythonのSeleniumバインディングの導入

Python用のSeleniumライブラリをインストール。

これにより、PythonからSeleniumを操作できるようになります。

pip install selenium

実際の動作確認

インストールが完了したら、簡単なスクリプトを実行して、Seleniumが正しく動作するかを確認します。

from selenium import webdriver

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

基本的な使い方

こちらでは、Seleniumの基本的な使い方についてお伝えします。

これをマスターすることで、多くのウェブページの自動操作が可能です。

  • やりたいことの明確化
  • PythonでのSeleniumの起動
  • Chromeのオプション設定
  • 新規ブラウザウィンドウの開始
  • 特定のページへのアクセス
  • ページ内のナビゲーション
  • 要素の情報取得
  • assertで要素をテスト
  • ブラウザの終了

やりたいことの明確化

Seleniumを使用する前に、何を達成したいのかを明確にしましょう。

例えば、特定の情報を取得する、あるいは特定の操作を自動化するなど、目的を明確に設定します。

PythonでのSeleniumの起動

Pythonスクリプト内でSeleniumを起動するには、WebDriverのインスタンスを作成します。

from selenium import webdriver

driver = webdriver.Chrome()

これにより、ブラウザの操作が可能となります。

必要なドライバを事前にインストールする必要があります。

やり方はこちらをご覧ください。

Chromeのオプション設定

Chromeを起動する際に、さまざまなオプションを設定できます。

例えば、ヘッドレスモードでの起動や、ウィンドウサイズの指定など、です。

# ウィンドウサイズの取得
width = driver.get_window_size().get("width")
height = driver.get_window_size().get("height")

# ウィンドウサイズを設定: 例えば幅800px、高さ600pxにする場合
driver.set_window_size(800, 600)

新規ブラウザウィンドウの開始

Seleniumを使用して新しいブラウザウィンドウやタブを開けます。

以下は、新しいタブを開くPythonのコード例です。

from selenium import webdriver

driver = webdriver.Chrome()
driver.switch_to.new_window('tab')

このコードを実行すると、新しいタブが開きます。

特定のページへのアクセス

Seleniumを使用して特定のURLにアクセスすることができます。

driver.get("https://www.google.com")

上記のコードは、Googleのホームページを開きます。

ページ内のナビゲーション

ページ内での前後のナビゲーションもSeleniumで簡単に行えます。

driver.back()  # 一つ前のページに戻る
driver.forward()  # 一つ後のページに進む

要素の情報取得

ページ内の特定の要素の情報を取得することができます。

例えば、IDを使用して要素を選択し、そのテキストを取得することができます。

from selenium.webdriver.common.by import By

element = driver.find_element(By.CSS_SELECTOR, "#exampleId")
print(element.text)

assertで要素をテスト

取得した値が意図したものであるかをテストしましょう。

テストにはassert文を使います。

assert element.text.contains('これはサンプル')

assert文でFalseが返ると、そのエラー箇所が表示されます。

ブラウザの終了

Seleniumの操作が終了したら、ブラウザを閉じることができます。

driver.close()  # 現在のウィンドウを閉じる
driver.quit()   # 全てのウィンドウを閉じる

Seleniumを使った実践的な操作

こちらでは、Seleniumを使用して実際にウェブページの操作を行う方法について詳しく説明します。

これにより、実際のタスクを自動化する際の参考となるでしょう。

  • Googleでの検索結果の取得と保存
  • インスタグラムでのログイン

Googleでの検索結果の取得と保存

Googleでの検索結果を取得し、それを保存する方法を見ていきます。

  • サイトの表示
  • 要素の取得
  • テキスト入力と検索
  • XPathによる情報取得
  • ヘッドレスモードでの実行
  • ページ遷移
  • データの保存
  • ブラウザの終了
  • 完全なコードの掲載

サイトの表示

まず、Googleのサイトを開きます。

driver.get("https://www.google.com")

要素の取得

検索ボックスの要素を取得します。

search_box = driver.find_element(By.CSS_SELECTOR, '[name="q"]')

テキスト入力と検索

検索ボックスにテキストを入力し、検索を実行します。

search_box.send_keys("Selenium")
search_box.submit()

XPathによる情報取得

XPathを使用して、検索結果のタイトルとURLを取得します。

results = driver.find_elements(By.XPATH, '//h3[@class="LC20lb DKV0Md"]') 
for result in results: 
    print(result.text)

ヘッドレスモードでの実行

ヘッドレスモードでは、ブラウザのGUIを表示せずにSeleniumを実行できます。

これは、サーバー上での実行やリソースの節約に役立ちます。

options = webdriver.ChromeOptions() 
options.add_argument("--headless") 
driver = webdriver.Chrome(options=options)

ページ遷移

「次へ」というリンクをクリックして、次のページに遷移する方法です。

next_page = driver.find_element(By.LINK_TEXT, "次へ") 
next_page.click()

データの保存

取得したデータをCSVファイルに保存します。

import csv 

with open("results.csv", "w", newline="", encoding="utf-8") as file: 
    writer = csv.writer(file) 
    for result in results: 
        writer.writerow([result.text])

ブラウザの終了

全ての操作が終了したら、ブラウザを閉じます。

driver.quit()

完全なコードの掲載

上記のステップを組み合わせて、完全なコードを作成します。

このコードを実行することで、Googleでの検索結果を取得し、CSVファイルに保存できます。

インスタグラムでのログイン

Seleniumを使用して、インスタグラムにログインする方法を見ていきます。

  • ログインリンクの操作
  • 例外処理の実装
  • ログイン情報の入力
  • ポップアップの操作

ログインリンクの操作

インスタグラムのトップページにアクセスし、ログインリンクをクリックします。

driver.get("https://www.instagram.com") 

例外処理の実装

ウェブページの要素が読み込まれるまでの待機や、要素が見つからない場合の例外処理は重要です。

以下は、要素が利用可能になるまで最大10秒待機する例です。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try: 
    element = WebDriverWait(driver, 10).
    until(EC.presence_of_element_located((By.CSS_SELECTOR, '[name="q"]'))) 
except: 
    print("要素が見つかりませんでした。")

ログイン情報の入力

ユーザーネームとパスワードを入力し、ログインボタンをクリックします。

username_elem = driver.find_elements(By.CSS_SELECTOR, '[name="username"]') 
password_elem = driver.find_elements(By.CSS_SELECTOR, '[name="password"]')
username_elem.send_keys("your_username") 
password_elem.send_keys("your_password") 
login_btn = driver.find_element(By.XPATH, "//button[@type='submit']") 
login_btn.click()

ポップアップの操作

インスタグラムにログイン後、通知のポップアップが表示されることがあります。

これを閉じる方法を示します。

try: 
    popup_elem = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "//button[contains(text(), '後で')]"))
    ) 
    popup_elem.click() 
except: 
    print("ポップアップが表示されませんでした。")

インスタグラムでの画面スクロール

インスタグラムのフィードやプロフィールページで、全ての投稿を表示するためのスクロール方法を説明します。

  • 対象ページの表示
  • 投稿件数の取得
  • 画面スクロールの実行

対象ページの表示

まず、特定のプロフィールページやフィードページにアクセスします。

driver.get("https://www.instagram.com/your_profile_name/")

投稿件数の取得

プロフィールページに表示される投稿件数を取得します。

post_count_elem = driver.find_element(By.XPATH, "//span[@class='g47SY ']") 
post_count = int(post_count_elem.text)

画面スクロールの実行

投稿件数に応じて、ページを下にスクロールします。

import time 
for _ in range(post_count // 10): # 10投稿ごとにスクロール
  driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2) # 2秒待機して次の投稿を読み込む

Seleniumを使ったクローラーの作成

こちらでは、Seleniumを使用してクローラーを作成する方法について詳しく説明します。

クローラーを作成することで、自動的に大量のデータを収集することが可能です。

  • クローラーの基本概念
  • 実際のクローラーの作成

クローラーの基本概念

クローラーは、ウェブページを自動的に巡回し、情報を収集するプログラムです。

Seleniumを使用すると、JavaScriptで動的に生成されるコンテンツや、ログインが必要なページなどもクローリングできます。

クローリングは、許可されていないサイトでおこなうのは辞めましょう。

自身のサイトなど、クローリングが問題にならないURLで試してください。

実際のクローラーの作成

以下は、特定のサイトから情報を収集する簡単なクローラーの例です。

from selenium.webdriver.common.by import By

driver.get("https://example.com/target_page")

items = driver.find_elements(By.XPATH, "//div[@class='item']")
for item in items:
    title = item.find_element(By.XPATH, ".//h2").text
    link = item.find_element(By.XPATH, ".//a").get_attribute("href")
    print(title, link)

【参考】場面別コード参考例

こちらでは場面別のコードサンプルを共有します。

これまでの基礎を活用し、新たなコードでより正確なクローリングをおこないましょう。

  • ドライバダウンロード
  • ブラウザの指定
  • ウィンドウの操作
  • 要素へのアクセス
  • 要素の値を取り出す
  • 要素への入力

ドライバダウンロード

UbuntuでSeleniumを使用するためのWebDriverのインストール手順例です。

  1. Firefox (geckodriver)
  2. Chrome (chromedriver)

1. FirefoxのWebDriver (geckodriver) のインストール:

最新のgeckodriverのバージョンを公式のリリースページから確認します。

適切なバージョンのgeckodriverをダウンロードします。

以下は64-bit Linuxの例です。

wget https://github.com/mozilla/geckodriver/releases/download/vX.XX.X/geckodriver-vX.XX.X-linux64.tar.gz

X.XX.Xの部分は適切なバージョン番号に置き換えましょう。

ダウンロードしたtar.gzファイルを解凍します。

tar -xvzf geckodriver-vX.XX.X-linux64.tar.gz

geckodriverを/usr/local/binディレクトリに移動して、全てのユーザーがアクセスできるようにします。

sudo mv geckodriver /usr/local/bin/

2. ChromeのWebDriver (chromedriver) のインストール

まず、Google Chromeがインストールされていることを確認します。

もしインストールされていなければ、以下のコマンドでインストール可能です。

sudo apt update
sudo apt install google-chrome-stable

公式のChromedriverのページから、インストールされているGoogle Chromeのバージョンに合わせたChromedriverのバージョンを選びます。

適切なバージョンのchromedriverをダウンロードします。以下は例です。

wget https://chromedriver.storage.googleapis.com/X.XX.X/chromedriver_linux64.zip

X.XX.Xの部分は適切なバージョン番号に置き換えてください。

ダウンロードしたzipファイルを解凍します。

unzip chromedriver_linux64.zip

chromedriverを/usr/local/binディレクトリに移動して、全ユーザーがアクセスできるようにします。

sudo mv chromedriver /usr/local/bin/

これで、Seleniumからこれらのドライバーを使用してブラウザを制御することができるようになりました。

ブラウザの指定

各ブラウザの指定方法は以下のとおりです。

from selenium import webdriver

#Chrome
chrome_driver_path = "path_to_chromedriver.exe"
driver = webdriver.Chrome(executable_path=chrome_driver_path)

#Firefox
firefox_driver_path = "path_to_geckodriver.exe"
driver = webdriver.Firefox(executable_path=firefox_driver_path)

#Edge
edge_driver_path = "path_to_msedgedriver.exe"
driver = webdriver.Edge(executable_path=edge_driver_path)

#Safari(MacOSでのみ動作します。)
# Safariの場合、特定のドライバーのパスを指定する必要はありません。
# ただし、Safariの設定で「開発」メニューを有効にし、"Allow Remote Automation"を許可する必要があります。
driver = webdriver.Safari()

#InternetExplorer (注: 現在はあまり使用されないが、必要に応じて):

ie_driver_path = "path_to_iedriver.exe"
driver = webdriver.Ie(executable_path=ie_driver_path)

ウィンドウの操作

以下にSeleniumを使用してウィンドウやタブに関連する一般的な操作を行うPythonのコードの例を示します。

  1. タイトルを取得
  2. URLを取得
  3. 新しいタブを開く
  4. 新しいウィンドウを開く
  5. 使用しているタブ/ウィンドウを切り替える

1. タイトルを取得

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.example.com")

title = driver.title
print(title)

driver.quit()

2. URLを取得

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.example.com")

current_url = driver.current_url
print(current_url)

driver.quit()

3. 新しいタブを開く

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# 新しいタブを開く
driver.execute_script("window.open('');")

driver.quit()

4. 新しいウィンドウを開く

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# 新しいウィンドウを開く (window.openの第二引数に'_blank'を指定)
driver.execute_script("window.open('', '_blank');")

driver.quit()

5. 使用しているタブ/ウィンドウを切り替える

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# 新しいタブを開いて、そこに移動
driver.execute_script("window.open('https://www.google.com');")
time.sleep(2)  # 少し待機して新しいタブが開くのを確認

# タブ/ウィンドウのハンドルを取得
window_handles = driver.window_handles

# 最初のタブに切り替え
driver.switch_to.window(window_handles[0])
time.sleep(2)  # 少し待機してタブの切り替えが反映されるのを確認

# 2番目のタブに切り替え
driver.switch_to.window(window_handles[1])

driver.quit()

これらの基本的な操作を組み合わせることで、さまざまなウィンドウやタブのシナリオでSeleniumを使用することができます。

要素へのアクセス

CSS_SELECTORを使ったアクセス方法です。

from selenium.webdriver.common.by import By

#IDによる指定
id_element = driver.find_element(By.CSS_SELECTOR, "#exampleId")

#クラス名による指定
class_element = driver.find_element(By.CSS_SELECTOR, ".exampleClass")

#複数指定
class_elements = driver.find_elements(By.CSS_SELECTOR, ".exampleClass")

#attributeを指定
atr_element = driver_find_element(By.CSS_SELECTOR, '[name="value"]')

ほかにもタグ名による指定も可能。

driver.find_elements(By.TAG_NAME, "div")

要素の値を取り出す

要素の値を取り出す方法です。

# テキストを取り出す方法はこちら。
sample_element = driver.find_element(By.CSS_SELECTOR, ".exampleClass")
sample_element.text

# href内のURLを取り出す方法
sample_element.get_attribute("href")

要素への入力

input要素への入力例です。

id_element = driver.find_element(By.CSS_SELECTOR, "#exampleId")
id_element.send_keys('入力したい文字列')

一度入力した要素を空にするには、以下の方法が使えます。

driver.execute_script("arguments[0].value = '';", element)

まとめ

当記事では、Seleniumについて見てきました。

  • Seleniumは、ウェブブラウザの自動操作を可能にする強力なツールです。
  • これにより、ウェブサイトのテスト、データ収集、自動化タスクなど、さまざまなシナリオでSeleniumを活用できます。

次のステップとして、以下の項目を考慮すると良いでしょう。

  1. 高度なセレクタの使用
    CSSセレクタやXPathをさらに深く学ぶことで、複雑なページ構造からもデータを効率的に取得できるようになります。
  2. フレームワークの利用
    Seleniumと組み合わせて使用できるテストフレームワーク(例: PyTest)を学ぶことで、より効率的なテストの自動化が可能です。
  3. クローラーの最適化
    大量のページを効率的にクロールするための技術や、IPブロックを避けるための方法などを学ぶと良いでしょう。
  4. クラウドサービスの利用
    Selenium GridやクラウドベースのSeleniumサービスを利用することで、複数のブラウザやデバイスでのテストを並行して実行できます。

最後に、Seleniumは常に進化しているツールであり、新しいブラウザのバージョンや新しい機能が頻繁に追加されています。

今回の学びを基に、Seleniumを活用してさまざまなウェブ操作の自動化を楽しんでください。

Seleniumブラウザー自動化プロジェクト
Seleniumはブラウザー自動化を可能にし、それを支えるツール群とライブラリー群プロジェクトです。 ユーザーとブラウザーのやり取りのエミュレーション、ブラウザーの割当を増強したり縮減する分散型サーバー、そしてすべてのメジャーなブラウザー用...
タイトルとURLをコピーしました