毎回同じページを開いたり、入力欄に文字を入れたりする作業は、Pythonから自動化できる場合があります。ブラウザの操作に使える代表的なツールが、Seleniumです。

この記事では、Selenium公式の練習用ページを使い、文字入力・ボタンのクリック・結果の取得を試します。操作の命令だけでなく、ページの準備を待つ方法や、エラーが起きたときの確認点も整理します。

目次

Seleniumでできること

Seleniumは、Webブラウザをプログラムから操作するためのツール群です。PythonからWebDriverを通じて命令を送り、Chromeなどでページを開いたり、入力欄やボタンを操作したりできます。

ただし、どのサイトでも同じコードが使えるわけではありません。入力欄の名前やページの構造はサイトごとに異なるため、操作対象に合わせて指定を変える必要があります。

最初は、操作結果を確認しやすい練習用ページから始めましょう。今回は「入力する→送信する→結果を読む」という一連の流れを作ります。

1.PythonとSeleniumを準備する

Seleniumが対応するPython 3と、Google Chromeを用意します。Pythonのインストール後、ターミナルやコマンドプロンプトで次のコマンドを実行してください。

python --version

Pythonのバージョンが表示されたら、Seleniumをインストールします。別のプロジェクトにもPythonを使っている場合は、この練習用の仮想環境を用意すると、パッケージを分けて管理できます。

python -m pip install --upgrade selenium

環境によっては、pythonの代わりにpython3を使います。その場合は、インストールとプログラムの実行の両方で、同じコマンドを使ってください。

ドライバはSelenium Managerで管理する

現在のSeleniumには、必要なドライバの取得・管理を支援するSelenium Managerが含まれています。通常の環境では、後ほど示すwebdriver.Chrome()から利用でき、別途webdriver-managerを入れることは必須ではありません。

初回など、必要なファイルをダウンロードするときには通信が発生します。会社や学校のネットワークで取得が制限されている場合は、プロキシなどの環境設定を確認する必要があります。

2.入力・クリック・結果取得を試す

次のコードを、selenium_practice.pyという名前で保存してください。文字コードはUTF-8にし、ライブラリ名と衝突しないよう、ファイル名をselenium.pyにはしないでください。

このプログラムは、公式の練習用フォームに文字を入力し、送信後のメッセージを取得します。処理が終わると、起動したブラウザを閉じます。

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


def main():
    driver = webdriver.Chrome()

    try:
        driver.set_page_load_timeout(30)
        driver.get(
            "https://www.selenium.dev/selenium/web/web-form.html"
        )

        wait = WebDriverWait(driver, 10)

        text_box = wait.until(
            EC.visibility_of_element_located(
                (By.NAME, "my-text")
            )
        )
        text_box.clear()
        text_box.send_keys("Seleniumの練習")

        submit_button = wait.until(
            EC.element_to_be_clickable(
                (By.CSS_SELECTOR, "button[type='submit']")
            )
        )
        submit_button.click()

        wait.until(
            EC.text_to_be_present_in_element(
                (By.ID, "message"), "Received!"
            )
        )

        message = driver.find_element(By.ID, "message")
        print("送信結果:", message.text)

    finally:
        driver.quit()


if __name__ == "__main__":
    main()

保存したフォルダで、次のコマンドを実行します。

python selenium_practice.py

正常に処理が進むと、ターミナルには次の結果が表示されます。

送信結果: Received!

ブラウザが短時間で閉じても、この結果が表示されていれば、最後まで処理が進んだと確認できます。画面が閉じるのは、コードの末尾でdriver.quit()を実行しているためです。

3.コードの流れを理解する

自動操作は、ページを開くだけでは完了しません。対象の入力欄を探し、操作できる状態を待ち、実行後の結果を確認するところまでを組み合わせます。

今回のコードで使った主な処理を整理すると、次のようになります。

処理役割
webdriver.Chrome()Chromeの操作を開始する
driver.get()指定したページを開く
WebDriverWait指定した条件を満たすまで待つ
clear()・send_keys()入力欄を空にして文字を入力する
click()ボタンなどをクリックする
要素の.text表示されている文字を取得する
driver.quit()ブラウザの操作を終了する

By.NAMEやBy.IDは、操作する要素を探す方法です。今回のmy-textやmessageは練習用ページの属性値なので、別のサイトでは、そのページに合った値へ変更します。

IDやname属性も、サイトの更新によって変わる場合があります。属性の種類だけで判断せず、目的の要素を一意に指定でき、変更されにくい値かを確認することが大切です。

4.固定時間ではなく、必要な状態を待つ

ブラウザがページを開いた後も、JavaScriptによって入力欄やメッセージが追加されることがあります。そのため、ページへの移動が終わった直後に操作すると、対象がまだ見つからない場合があります。

今回のコードでは、WebDriverWait(driver, 10)で条件を確認しています。これは毎回10秒間停止する指定ではなく、条件を満たせば先へ進み、指定した時間内に満たせなければエラーにする仕組みです。

入力前には入力欄の表示を、送信後には結果の文字を待ちます。何秒待つかだけでなく、「何が確認できたら次へ進めるか」を考えると、処理を組み立てやすくなります。

なお、element_to_be_clickableが確認するのは、主に要素が表示され、有効になっていることです。別の要素が覆いかぶさっている場合などは、クリックが失敗することもあります。

今回の例では、待機方法を明示的待機にそろえています。暗黙的待機のimplicitly_wait()を混在させると待ち時間が予想しにくくなるため、安易に追加しないようにしましょう。

5.エラーが出たときの確認点

エラーが起きたら、最後に表示された例外名と、失敗したコードの行を確認します。待ち時間を増やすだけでは、入力欄の指定間違いや、インストール先の違いは解決できません。

よくあるエラーと確認点は、次のとおりです。

エラー主な確認点
ModuleNotFoundError実行中のPythonにSeleniumをインストールしたか
NoSuchElementException要素の指定、表示タイミング、対象のフレームが正しいか
TimeoutExceptionページの読み込みや、指定した待機条件が時間内に成立したか
SessionNotCreatedExceptionブラウザとドライバの組み合わせ、起動設定に問題がないか
SyntaxError・IndentationErrorコピー時に改行や行頭の空白が崩れていないか

特にPythonでは、行頭の空白が処理のまとまりを表します。コードを1行につなげたり、tryやfinallyの位置を変えたりすると、実行できなくなるため注意してください。

6.実際の作業へ応用するには

練習用フォームで流れを確認できたら、自分が操作してよいページで、小さな処理から試します。最初はブラウザを表示した状態で、どの入力欄に何が入り、どのボタンを押しているかを確認すると、原因を追いやすくなります。

送信や登録を伴う操作では、クリック後の結果確認も組み込みましょう。応答が遅いという理由だけで再実行すると、同じ内容を重複して送信する可能性があります。

また、対象サービスに目的に合った公式APIがある場合は、そちらも選択肢になります。ブラウザ操作が必要なのか、データの取得や登録だけでよいのかを整理すると、使う方法を選びやすくなります。

Seleniumの練習では、入力・クリック・結果確認を一つずつ確かめながら進めてください。まずは今回のコードの入力文字を変更し、処理の流れを追うところから始めてみましょう。

Learning Tools

記事を検索したい方はここから!

辞書から探す

本文中で気になった概念やキーワードを、辞書ページで一覧から確認できます。

辞書を見る