Python×SeleniumでWebブラウザ操作を自動化

# はじめに
今回はPythonでSeleniumを使用してWebブラウザ操作を自動化する方法について、留意点やポイントを纏めました。
日々の業務効率化を試みるきっかけや、参考になれば幸いです。

# 利用シーン
たとえば、
:white_check_mark:ワンクリックで勤怠システムへのログインと出退勤の打刻をする。
:white_check_mark:特定のWebシステムを操作する定常作業を自動化。
:white_check_mark:Webアプリケーションテストでの操作を自動化。
:white_check_mark:動的ページ上でブラウザを操作したデータ収集の自動化。
...主に定常業務の自動化やテスト等のWebスクレイピングに利用される。
他にも、マーケティングに役立つ情報収集を行ったり、検索順位をスクレイピングしてSEO対策を実施する際にも活用できるでしょう。

# 前提事項
:white_check_mark:当記事では動作ブラウザをChromeに設定する。
:point_up:SeleniumではEdgeやFirefoxのWebブラウザ操作も可能。

# この記事で書かないこと
:negative_squared_cross_mark:Pythonとpipのインストール方法。
:negative_squared_cross_mark:フロントエンド開発の基礎知識
:negative_squared_cross_mark:Chromeデベロッパーツールの使い方
:negative_squared_cross_mark:Seleniumによるブラウザ操作の記録,再生方法

# Seleniumの概要と特徴

:::note info
Seleniumとは、Webブラウザ操作を自動化し、それを支えるツール群とライブラリー群のプロジェクト
:::

| 機能名 | 役割 |
|:-----------|:------------|
|WebDriver|ブラウザをネイティブに操作| 
|Grid|複数のリモートマシン上でWebDriverスクリプトを実行<br>これにより並行テスト実行が可能。| 
|Selenium IDE|ユーザーのブラウザ操作を記録および再生|

:bulb:HTMLをHTTPリクエストで取得するのでなく、ブラウザ起動して直接操作するため動作は遅い。

:::note info
HTTPリクエストでのデータ取得が可能な場合はRequestsモジュールを優先的に使い、ログインや特殊なJavaScriptや動的サイトのみSeleniumで直接Webブラウザ操作をするという具合に使い分けよう。
:::

その他の機能やライブラリ仕様は公式サイトを参照。
　:globe_with_meridians:公式：[Selenium Project](https://www.selenium.dev/ja/documentation/)

# SeleniumでChromeのWebDriverを利用する際の留意点
下記制約があり、正しく利用しないと実行Errorになるので特筆する。

:::note warn
ChromeDriverとブラウザ(Chrome)のバージョンは一致させる必要がある。
:::
:negative_squared_cross_mark:ChromeDriverを[ダウンロードサイト](https://chromedriver.chromium.org/downloads)からローカルにダウンロード保存して動かす方法では、Chromeをバージョンアップした際に対応が必要となる。(既に114までしかない。)
:negative_squared_cross_mark:上記の解決手段としてwebdriver-managerで自動的にChromeDriverをインストールする方法があったが、現在はダウンロード環境が変更され利用できない。(2024.01時点)
```この方法は現在使えない.py
driver ⁼ webdriver.Chrome(ChromeDriverManager().install())
```
webdriver_managerを利用中で実行Errorになっている場合はアンインストールしよう。
```webdriver_manager.アンインストール
pip uninstall webdriver-manager
```

じゃあ、どうするのか。

:::note info
最新バージョン(4.10.0以上)のseleniumを使用する。
:::
:bulb:selenium managerが含まれているため、ブラウザとWebドライバーのバージョンを気にしなくてOK。

# Seleniumを使用する準備
※ pythonとpipとブラウザ(Chrome)はインストール済みの前提で記載。

コマンドプロンプトにて下記コマンドを実行
```selenium.インストールと最新化
pip install selenium
pip install --upgrade selenium
```
たったの、これだけ。

# Webブラウザ操作の自動化するサンプルソース
Qiitaのログイン画面にログインID、パスワードを自動入力してログイン後、Contributions数を取得してダイアログボックスに表示するWebブラウザ操作をプログラムしてみる。

:point_up:HTML要素をどう取得するかは、Chromeデベロッパーツール(Ctrl+Shit+i)でソースを表示し、セレクター機能で確認しておこう。

```Sample1.py
# seleniumの必要なライブラリをインポート
from selenium import webdriver
from selenium.webdriver.common.by import By

# tkinter（メッセージボックス表示）の必要なライブラリをインポート
import tkinter
from tkinter import messagebox

# Chrome Webドライバー の インスタンスを生成
driver = webdriver.Chrome()

# WebドライバーでQiitaログインページを起動
driver.get('https://qiita.com/login')

# NAME属性が”identity”であるHTML要素を取得し、ログインID文字列をキーボード送信
driver.find_element(By.NAME,"identity").send_keys("hogehoge@email.com")
# NAME属性が”password”であるHTML要素を取得し、パスワード文字列をキーボード送信
driver.find_element(By.NAME,"password").send_keys("fugafuga")
# CLASS属性が”sessions_button--wide”であるHTML要素を取得してクリック
driver.find_element(By.CLASS_NAME,"sessions_button--wide").click()
# CLASS属性が複数ある要素は、.(ピリオド)で取得できる。
# 例）< … class="btn btn_login btn_default” ... の場合、
#      ”btn.btn_login.btn_default”でfind_elementする

# マイページへ移動
driver.get('https://qiita.com/tomomi-kawashita')
# Contributions数を取得（CLASS属性が”style-1snuvpu”のHTML要素を取得して、テキストを取得）
cobCnt = driver.find_element(By.CLASS_NAME,"style-1snuvpu").text

# Contributions数をメッセージボックス表示
root = tkinter.Tk()
root.withdraw()
messagebox.showinfo("selenium sapmle", "現在、" + cobCnt + "Contributionsです。本日も張り切ってアウトプットしていこう！")

# Webドライバー の セッションを終了
driver.quit()
```
上記サンプルの他の操作方法は公式ドキュメントを読もう。
FirefoxやEdgeのWebドライバを利用すれば、EdgeのWebブラウザ操作も可能だ。

https://www.selenium.dev/ja/documentation/

意図した通りの動作が確認出来たら、それを起動するバッチファイルを作成して、任意の場所にショートカットを保存してもいいだろう。
```sample.bat
py Sample1.py
```
# 実行イメージ
![WebScraping.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3315076/2a4c52ff-eb32-9446-c67e-3ab44fa91cbe.gif)

いかがですか？キーボード入力、ログインボタン押下、HTML要素の値取得が出来ていますね！

# さいごに
Seleniumを使用すると様々なWebブラウザ操作を簡単に自動化できることが分かりました。
PowerAutomate等のGUI操作によるローコード開発は非エンジニアの方にとっても分かりやすいメリットがありますが、マウス操作よりもキーボード入力でプログラミングする方が、知識さえ身に着ければ確実にアジリティもメンテナンス性も高いと感じます。
Pythonには他にもHTMLのデータを取得してパースするライブラリ「Beautiful Soup」もあります。
組み合わせると定例業務の省力化のみならず、ビジネス加速化に必要な意思決定のための情報収集や分析にも役立つのではないでしょうか。