PythonでSeleniumを使ってみる

##前書き

初投稿記事です。
Seleniumというものがあることを知り、使ってみろと言われたため
備忘録的に残しおておこうと思います。


##ゴール

・PythonとSeleniumのライブラリを使って自動でWebサイトを操作
・必要な情報をログとして保存

##準備物について

###使用するもの

・Python　v3.7.7
・Selenium　v4.0.0
・ChromeDriver 96.0.4664.45 (多分）

PythonもSeleniumもChromeDriverも触ったことがなかったので、それぞれの概要を以下にまとめます。

###〇Pythonとは

Pythonとはプログラム言語の事。
拡張性が高く、機械言語などで評価されている。

###〇Seleniumとは

Selenium(セレニウム)とは、ブラウザの操作を自動化するための物。
→このURLのこのボタン押して～みたいなことを自動で行ってくれる。

###〇ChromeDriverとは

プログラムとChrome（ブラウザ）をつなげる役割を果たすドライバー。
様々なドライバーがあるが、今回はchromeを使用する。

##準備（インストールなど）

###Seleniumのインストール

まずはSeleniumのライブリを落としてきましょう。

pip経由でインストールするのがよさそう

```bash
pip install selenium
```

###ChromeDriverのインストール

Googleで調べると出てきます。
使っているChromeのバージョンと合わせましょう。

ダウンロードしてきたchromedriver.exeの場所は控えておきましょう。後ほど使います。

###seleniumインストール時に怒られた

たまにcryptographyが～と怒られる時がありますが
そういう時は

```bash
python -m pip install --upgrade pip
```

でpipを更新してあげると解決するかもしれません。

##実践

###ブラウザの立ち上げ

早速Seleniumを使ってみます。
以下のようなコードを打ってみてください

```python
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome("chromedriver.exeのPATH")
driver.get('https://qiita.com')
sleep(3)

driver.close()
driver.quit()
```

多分一瞬Qiitaのページが表示されて消えると思います。

それぞれなにをしているか解説していきましょう。

```python
driver = webdriver.Chrome("chromedriver.exeのPATH")
```

ここでは、webdriverのインスタンスを生成しています。
インスタンス生成の引数として、ドライバーのパスを入れています。

※ドライバーのパスが通っていれば引数に指定する必要は無いみたいです。

```python
driver.get('https://qiita.com')
```

getの引数にURLを入れると、そのURLを開きます。

```python
sleep(3)
```

待機。

```python
driver.close()
driver.quit()
```

それぞれ、開いたブラウザを閉じ、

インスタンスを終了する。という処理になります。

これがないとブラウザが開きっぱなしなので、
開きっぱなしは困るよ…という人は記載するといいと思います。

これでブラウザを立ち上げることはできましたね。

###ページ遷移と値取得

「ブラウザを開いたのはいいけど、何もできないよ…」

「コレじゃあテストもクソも無いやん！」

というワガママボーイズ・ガールズの声が聞こえてくるので、
ページ遷移する機能を追加してみます。

```python
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome(r"C:\driver\chromedriver\chromedriver.exe")

driver.get('https://qiita.com')

print('URLを開きました')

element = WebDriverWait(driver, 30).until(
	EC.visibility_of_element_located((By.CSS_SELECTOR, 'div.st-NewHeader_mainNavigation'))
)

mainNavigation = element.find_elements(By.CSS_SELECTOR, 'div.st-NewHeader_navigationTabContainer > a')
mainNavigation[1].click()

sleep(2)

driver.close()
driver.quit()
```

上記コードを実行すると、Qiitaの記事を開いた後、
「ホーム」から「タイムライン」に遷移するのでは無いでしょうか。

このコードのポイントは

```python
element = WebDriverWait(driver, 30).until(
	EC.visibility_of_element_located((By.CSS_SELECTOR, 'div.st-NewHeader_mainNavigation'))
)
```

```python
mainNavigation = element.find_elements(By.CSS_SELECTOR, 'div.st-NewHeader_navigationTabContainer > a')
mainNavigation[1].click()
```

です。

それぞれ、

```python
element = WebDriverWait(driver, 30).until(
	EC.visibility_of_element_located((By.CSS_SELECTOR, 'div.st-NewHeader_mainNavigation'))
)
```

この記述でやっていることは、「div.st-NewHeader_mainNavigationという要素が出現するまで待つ」ということをやっています。

WebDriverWaitにドライバーとタイムアウトの秒数を記述しています。

untilの中身は待機するまでの条件を記載しています。

ECには沢山のプロパティがありますが、今回は.visibility_of_element_locatedを使用しています。コレは特定の要素が出現するまで待つという命令です。

この引数にはセレクターを指定します。

By.CSS_SELECTOR, 'div.st-NewHeader_mainNavigation'

という部分でセレクターを検索しています。

この書き方はいろんなところで使います。

で、要素が出現したら「element」にWebElementを入れています。

このWebElementというのは、

簡単に言うとSeleniumを用いてセレクター検索をした結果取得できる物

くらいに思っておいてください。

```python
mainNavigation = element.find_elements(By.CSS_SELECTOR, 'div.st-NewHeader_navigationTabContainer > a')
mainNavigation[1].click()
```

ここでは先程のWebElementにfind_elementsというメソッドを用いて検索をかけています。

WebElementの中に該当のセレクターはあるかな。と検索しているわけです。

このセレクターはQiita上部のタブ群を指しています。

タブの中身は複数個あるため、検索結果が複数出てきます。

その中の一つを選択したいときは[1]をみたいな感じで指定することができます。

二行目では、取得したウェブエレメントの2つ目（1つ目）をClickしています。

ここは説明不要ですね。要素をクリックしております。

###まとめ

このようにSeleniumを使用します。

色々なメソッド、プロパティを使えば、いろいろなことができるので、
是非調べてみてください。