Seleniumが使えるようになるまでの手順をまとめてみた(Windows, Python, Chrome)

# はじめに
本記事はWebブラウザの自動操作をやってみたいなという人を対象としています。
初学者が概要を理解し、「ひとまず動いた！」というところまで進めることを目的としています。

# やること
Windows10またはWindows11でSeleniumをPythonで実行し、
Chromeを自動で立ち上げ検索結果のスクリーンショットを取得する。
そのために必要なものをインストールする手順および実行スクリプトを紹介する。

# 準備するもの
* Windows10 または Windows11 を搭載したPC

# インストールするもの
* ~~Google Chrome 最新（125.0.6422.113で動作確認済み）~~
* Python 3.10.4
    * Selenium 4.17.2
    * ~~chromedriver-binary~~

# 要約
1. ~~Google Chromeをインストール（既にあれば不要）~~
1. Pythonをインストール（既にあれば不要） 
1. Seleniumをインストール ```pip install selenium```
1. ~~chromedriver-binaryをインストール ```pip install chromedriver_binary==xx.x.xxxx.xx```~~
1. 下記に折りたたまれたスクリプトを実行してスクリーンショットを取得できれば成功
<details><summary>Google検索結果スクショ取得スクリプト</summary>

```python:Google検索結果のスクショを取得する
# 時間を計るライブラリをインポート
import time
# WebDriverライブラリをインポート
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
# ChromeのWebDriverライブラリをインポート(Selenium 4.17より不要となったのでコメントアウト)
#import chromedriver_binary

# Chromeを指定する
driver = webdriver.Chrome()
# Chromeを開いてGoogleにアクセスする
driver.get('https://www.google.com/')

# 5秒待機する
time.sleep(5)

# ページ内でname属性がqの要素を指定する（検索ボックス）
search_box = driver.find_element(By.NAME,'q')
# 指定した要素（検索ボックス）にChromeDriverと入力する
search_box.send_keys('ChromeDriver')
# フォームを送信する（検索する）
search_box.submit()

# 5秒待機する
time.sleep(5)

# Webページのスクリーンショットを保存する（保存先はカレントディレクトリ）
driver.save_screenshot('selenium_schreenshot_test.png')
# 画面を閉じる
driver.quit()
```

</details>

# ~~1. Google Chromeをインストールする~~
~~Webブラウザです。
既にインストールしてある場合は不要です。
下記、Google Chromeヘルプを参考にインストールしてください。~~
https://support.google.com/chrome/answer/95346?hl=ja&co=GENIE.Platform%3DDesktop

:::note info
Selenium 4.11よりブラウザを自動インストールするようになったため不要
（動作未確認）
:::

# 2. Pythonをインストールする
PythonパッケージのインストールおよびPythonスクリプト実行に必要なのでインストールします。
既にインストールしてある場合は不要です。

下記、非公式Pythonサイトの記事を参考にインストールしてください。
https://www.python.jp/install/windows/install.html

<details><summary>Pythonがインストールされたかの確認方法</summary>

Windows PowerShellで「python --version」と入力すればインストールされているPythonのバージョンが確認できます。
```powershell:Pythonバージョン確認
python --version
```
「Python 3.X.X」のように表示されていればインストールは成功しています。
```powershell:実行結果（例）
Python 3.10.4
```
うまくいかない場合はPowerShellの再起動、Windowsの再起動、Pythonの再インストールを試してください。

</details>

<details><summary>Windows PowerShellの起動方法</summary>

1. Windowsロゴキー+Xキーで画面下部のスタートボタンからメニューが表示されます（スタートボタン右クリックでもOK）
1. 1. Windows PwerShell(管理者)を選択する
※私が管理者で操作しただけなので管理者でなくてもできるかもしれないです
![スクリーンショット 2022-03-30 164139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556044/7ca99b93-dc93-cd89-1abe-31c6c10c30d4.png)
:::note warn
「このアプリがデバイスに変更を加えることを許可しますか？」という確認がでてくる通り、
システムの設定変更といった操作が容易にできてしまいます。
コマンドを実行する際は必ず実行するコマンドを理解したうえで実行するようにしてください。
:::

</details>

## 2-1. Seleniumをインストールする
SeleniumとはWebブラウザの自動操作を目的としてつくられたライブラリです。
PowerShellで「pip install selenium」を実行すればPythonにSeleniumのパッケージをインストールできます
```powershell:Seleniumインストール
pip install selenium
```
## ~~2-2. chromedriver-binaryをインストールする~~

~~chromedriver-binaryはChrome用のWebDriverです。
PowerShellで「pip install chromedriver_binary==xx.x.xxxx.xx(Chromeと一番近いバージョン)」でChrome用のWebDriverのパッケージをインストールします。~~
```powershell:chromedriver_binaryインストール
pip install chromedriver_binary==xx.x.xxxx.xx(Chromeと近いバージョン)
```
:::note info
Selenium 4.6よりchromedriver-binaryのインストールは不要となりました
:::

<details><summary>WebDriverとは</summary>

Webブラウザによって、同じブラウザでもバージョンによってシステムに違いがあります。
Seleniumでの自動操作を実現させるには、それらを理解しておく必要があります。
その理解者がWebDriverです。

</details>

<details><summary>Google Chromeのバージョン確認方法</summary>

Google Chromeを起動して画面右上にある、点が縦に3つ並んでいる「設定」から「ヘルプ」→「Google Chromeについて」を選択します。
![スクリーンショット 2022-03-30 164130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556044/ce8944a7-820b-2d0d-1f71-2efb2b10b81e.png)

下記のように表示されます。(ここではバージョン100.0.4896.60となっています)
![スクリーンショット 2022-03-30 120450.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556044/0a4bd243-4490-2c4b-a2fc-449cb6b3adc0.png)

</details>

<details><summary>chromedriver_binaryのインストールできるバージョンの確認方法</summary>

PowerShellで「pip install chromedriver_binary==」でchromedriver_binaryを無効なバージョン指定してインストールを試みます。
```powershell:無効なバージョンで指定する
pip install chromedriver_binary==
```
そうするとバージョンが指定されていないとエラーが出て、インストールできるバージョンの一覧が「from versions:」の後ろにカンマ区切りで表示されます。
メジャーバージョンが同じものの中で一番近いバージョンをインストールします。（100.0.4896.60なら100から始まるバージョン）
マイナーバージョンは異なっていても基本的には動くかと思います。
```powershell:実行結果（例）
ERROR: Could not find a version that satisfies the requirement chromedriver_binary== (from versions: 2.29.1, 2.31.1, 2.33.1, 2.34.0, 2.35.0, 2.35.1, 2.36.0, 2.37.0, 2.38.0, 2.39.0, 2.40.1, 2.41.0, 2.42.0, 2.43.0, 2.44.0, 2.45.0, 2.46.0, 70.0.3538.16.0, 70.0.3538.67.0, 70.0.3538.97.0, 71.0.3578.30.0, 71.0.3578.33.0, 71.0.3578.80.0, 71.0.3578.137.0, 72.0.3626.7.0, 72.0.3626.69.0, 73.0.3683.20.0, 73.0.3683.68.0, 74.0.3729.6.0, 75.0.3770.8.0, 75.0.3770.90.0, 75.0.3770.140.0, 76.0.3809.12.0, 76.0.3809.25.0, 76.0.3809.68.0, 76.0.3809.126.0, 77.0.3865.10.0, 77.0.3865.40.0, 78.0.3904.11.0, 78.0.3904.70.0, 78.0.3904.105.0, 79.0.3945.16.0, 79.0.3945.36.0, 80.0.3987.16.0, 80.0.3987.106.0, 81.0.4044.20.0, 81.0.4044.69.0, 81.0.4044.138.0, 83.0.4103.14.0, 83.0.4103.39.0, 84.0.4147.30.0, 85.0.4183.38.0, 85.0.4183.83.0, 85.0.4183.87.0, 86.0.4240.22.0, 87.0.4280.20.0, 87.0.4280.87.0, 87.0.4280.88.0, 88.0.4324.27.0, 88.0.4324.27.1, 88.0.4324.96.0, 89.0.4389.23.0, 90.0.4430.24.0, 91.0.4472.19.0, 91.0.4472.101.0, 92.0.4515.43.0, 92.0.4515.107.0, 93.0.4577.15.0, 93.0.4577.63.0, 94.0.4606.41.0, 94.0.4606.61.0, 94.0.4606.113.0, 95.0.4638.10.0, 95.0.4638.17.0, 95.0.4638.54.0, 95.0.4638.69.0, 96.0.4664.18.0, 96.0.4664.35.0, 96.0.4664.45.0, 97.0.4692.20.0, 97.0.4692.36.0, 97.0.4692.71.0, 98.0.4758.48.0, 98.0.4758.80.0, 98.0.4758.102.0, 99.0.4844.17.0, 99.0.4844.35.0, 99.0.4844.51.0, 100.0.4896.20.0)
ERROR: No matching distribution found for chromedriver_binary==
```
</details>

# 3. スクリプトを作成する
下記ブラウザ自動操作のスクリプトをパイソン形式で保存しPowerShellで実行する
```python:Google検索結果のスクショを取得する
# 時間を計るライブラリをインポート
import time
# WebDriverライブラリをインポート
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
# ChromeのWebDriverライブラリをインポート
import chromedriver_binary

# Chromeを指定する
driver = webdriver.Chrome()
# Chromeを開いてGoogleにアクセスする
driver.get('https://www.google.com/')

# 5秒待機する
time.sleep(5)

# ページ内でname属性がqの要素を指定する（検索ボックス）
search_box = driver.find_element(By.NAME,'q')
# 指定した要素（検索ボックス）にChromeDriverと入力する
search_box.send_keys('ChromeDriver')
# フォームを送信する（検索する）
search_box.submit()

# 5秒待機する
time.sleep(5)

# Webページのスクリーンショットを保存する（保存先はカレントディレクトリ）
driver.save_screenshot('selenium_schreenshot_test.png')

# 画面を閉じる
driver.quit()
```
下記画像のようにChromeが勝手に立ち上がります。
（「Chromeは自動テストソフトウェアによって制御されています。」と表示されているのが目印）
![スクリーンショット 2022-03-30 204349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556044/f8a2b2d4-531e-b48c-8502-d37e7ba8689b.png)

検索結果のスクリーンショットが入ったselenium_schreenshot_test.pngがカレントディレクトリに生成されていれば成功です。
![selenium_schreenshot_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556044/4b3c1879-821b-8038-48db-feb3b9bf3e37.png)

<details><summary>パイソンファイルの作り方</summary>

1. メモ帳を開く（テキストエディタなら何でもいい）
1. スクリプトをコピー&ペーストする
1. ファイル名をtest.pyにして名前を付けて保存する

</details>

<details><summary>パイソンファイルの実行方法</summary>

1. Cドライブ直下に新規フォルダを作成する
1. 新規作成したフォルダ名をSeleniumTestにする
1. PowerShellでカレントディレクトリを新規作成したフォルダにするコマンドを実行する
```cd C:\SeleniumTest ```
1. PowerShellでパイソンファイルを指定してパイソンを実行する
```python test.py```

</details>

# 参考文献
https://gammasoft.jp/support/selenium-with-batteries-included/

# あとがき
自分でやったことをまとめてみたくて本記事を執筆しました。

ただ、既にSeleniumの導入手順紹介は良い記事がたくさんあります。
それらとどう差別化しようかと考えたところ、
初学者向けの記事は少ないことに気がつきました。
めちゃくちゃ丁寧な初学者向け記事もあるのですが、
そういったものはPythonのインストール方法といった細分化されきった記事でした。
したがって、環境構築からプログラム実行まで一連の手順を、
初学者向けにするのは需要があるかもしれないと考えこのような記事にしました。

初めての投稿なので至らない点があるかもしれません。
PythonもSeleniumも、今回初めて触れたので理解・説明が誤っている箇所があるかもしれません。
そういった場合はそっと指摘していただけると嬉しいです。
わかりやすかった、参考になったといったフィードバックも励みになります。

この記事を機に、Seleniumに興味を持っていただけたら幸いです。
お読みいただきありがとうございました。

* 2024/05/28追記
2年前に書いた記事ですが、今でもリアクションがチラホラきていたので「今でも動作するのかな」と不安になって確認および更新しました。
幸いなことに、以前の手順でも問題なく動作してくれました。
ただ、Seleniumバージョンアップで便利になったことにより省ける手順が多かったので更新しました。
混乱させないために、古い手順は取り消し線を入れるだけで残しています。