たった3行のpythonで始めるSelenium入門

# はじめに
画面テストツールとして名高いSeleniumを利用するのは思ったより簡単だった話。（Seleniumで検索すると`Selenium ○○`みたいなのがいっぱい出てきてなんのこっちゃ。って感じだったんですが、今回は`Selenium Webdriver`というものを利用する手順だと思います。理解が薄すぎる。。）
Seleniumを利用してブラウザを自動操作するところまで。
今回は手軽なのでpythonを利用します。
ブラウザを操作するツールとしてpythonを使うだけなので、プロジェクト自体が何の言語で作られてても問題ありません。
他にはJava、ruby、node.jsなんかでも動きます。

# seleniumとは
言わずとしれたweb画面のテストツール。
サーバサイドのテストはphpunitとかRSpecとかpytestとかでできるけど、HTML + javascriptのテストはどうしよう。を解決するために非常に役に立つ。いわゆるGUIテストの部分。
プログラムから直接ブラウザを立ち上げて、画面を操作してくれます。なのでユニットテスト同様にコードでテスト項目を管理でき、入力項目のリグレッション地獄に陥りにくくなります。

webだけでなくネイティブアプリ用のappiumという姉妹ツールもあるとか。そっちは触ったこと無いのでよくわからんです。


# 環境
| OS | 言語 | ブラウザ |  
|:--:|:--:|:--:|  
| Windows10、mac | python3.6 | chrome |  


# 事前準備

## pythonインストール  
   
Windowsの場合は[公式サイト](https://www.python.org/)からインストーラーをダウンロードしてインストールしましょう。
macの場合は、homebrewをいれていればコマンドからインストールできます。[こちら](https://qiita.com/7110/items/1aa5968022373e99ae28)を参考にしました。

2系を既にダウンロードしている場合はパスを書き換えたりvirtualenvを導入したりで解決すれば良いと思います。（別に2系でも動くと思いますし、以降の`python`コマンドを`python３`に置き換えても問題ありません）

## driverのダウンロード  
 Windowsの場合は、こちらも[サイト](https://sites.google.com/a/chromium.org/chromedriver/downloads)からダウンロードしましょう。(Latest Release: 付近のリンクをクリック→環境にあったファイルをダウンロード)

 macはまたしてもhomebrewでインストール可能です。

```
brew install chromedriver
```

chrome以外のdriverを利用したい場合は適宜そのdriverをダウンロードすればOKです。

## pipからseleniumのインストール  
 Windows、macどちらもpipコマンドから

```
pip install selenium
```  


# 実装
では準備も整ったのでseleniumを動かすコードを描いてみましょう。
タイトル詐欺をしないよう３行だけ。

```python:test.py
from selenium import webdriver #Selenium Webdriverをインポートして

driver = webdriver.Chrome("chromedriverのパス") #Chromeを動かすドライバを読み込み

driver.get("https://google.co.jp") #googleを開く！

```

`chromedriverのパス`となっているところは、Windowsであればダウンロードしたexeファイルのパス。
macであればbrewでインストールしたchromedriverのパス。（わからなければ`type chromedriver`コマンドで探してみたりすれば良いでしょう。多分基本は`/usr/local/bin/chromedriver`）

を文字列で渡してあげればOKです。


# 実行
では先ほどのコードを実行！

```bash
python test.py
```

アプリケーションのアクセス許可が求められるかもしれません。
しかしこれでChromeでGoogleが表示されたはずです！
３行でseleniumを実感できました。めでてぇ。

これがseleniumにおけるHello worldみたいなものかと思います。

あとはフロントエンドのコーディングをしたことがある方ならば操作にそこまで手こずることはないのかなと思います。

ためしにコードからGoogleで検索してみましょう。

# Google検索するSeleniumを実装

```python:google.py
from selenium import webdriver #Selenium Webdriverをインポートして

driver = webdriver.Chrome("chromedriverのパス") #Chromeを動かすドライバを読み込み

driver.get("https://google.co.jp") #googleを開く！

text = driver.find_element_by_name("q") # ID属性から検索用テキストボックスの要素を取得し
text.send_keys("selenium") # 文字列"selenium"をテキストボックスに入力

btn = driver.find_element_by_name("btnK") # 検索用ボタンにはID属性がないのでname属性から取得し
btn.click() # 対象をクリック！

```

実行しましょう。

*この実装はGoogleのWebページに依存しているため、いつなん時利用できなくなるか不明です。うまくいかない場合は、適宜開発者ツール等を利用して最新のテキストボックス要素を取得する実装に変更してください。


```bash
python google.py
```

これでGoogleで"selenium"の検索結果画面が表示されたかと思います。

概ね利用するDriverのAPIはこのページが見やすくて参考にしています。
[Selenium API(逆引き)](http://www.seleniumqref.com/api/webdriver_gyaku.html)

# 留意点
画面が変わっても試験が壊れないようにするには規則的なセレクタを指定する必要があります。
bemやらsmacssやらのコーディング規約を最低限プロジェクトでは統一しておきましょう。
cssセレクタで要素を取得する以上、リニューアルなどで画面のセレクタが変わってしまえばもうそのテストは使えません。

# selenium初心者の所感
ここまで書いてみて思ったのですが、フロントエンドとサーバサイドの実装の担当者が別れてしまっている場合、この試験はどちらが書くのが正しいのでしょう？
画面操作のオペレーションになるので結合試験に分類されるとは思うのですが、seleniumからログやDBの期待値を確認できるわけでもないし、完全にフロントエンドだけの試験って割りきったものなのでしょうか？
私、気になります！
案件で使ったことないし、業務もWebアプリから離れてしまったので、その解答を得られるのはしばらく先になりそう。。


# おわりに
実は私が今回seleniumを触れたのは別にテストを自動化したかったからではありませんでした。
windowsのタスクスケジューラから定期的にとあるwebサービスにログインして画面情報を取得するツールがほしいと頼まれ、最初はcurlでログインしようと思ったのですがリクエストヘッダのなにかが悪いのか、色々試行錯誤してみたもののログインできず、、、
とほほと途方に暮れていたところ、調べたらseleniumでブラウザ動かせば行けそうやん！ってなったのでした。
普通そんな使い方することはあまり無いでしょうが、テスト以外の便利ツールとしてもなにかしら利用価値がありそうですよね。簡単ですし。
ちなみに私はこの経験を活かし、会社の勤怠管理ツールがWebなので自動で勤怠打刻をしてくれるツールを作ってcron設定しました。これで出勤打刻忘れはありません。ぐへへ