はじめに
画面テストツールとして名高い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の場合は公式サイトからインストーラーをダウンロードしてインストールしましょう。
macの場合は、homebrewをいれていればコマンドからインストールできます。こちらを参考にしました。
2系を既にダウンロードしている場合はパスを書き換えたりvirtualenvを導入したりで解決すれば良いと思います。(別に2系でも動くと思いますし、以降のpython
コマンドをpython3
に置き換えても問題ありません)
driverのダウンロード
Windowsの場合は、こちらもサイトからダウンロードしましょう。(Latest Release: 付近のリンクをクリック→環境にあったファイルをダウンロード)
macはまたしてもhomebrewでインストール可能です。
brew install chromedriver
chrome以外のdriverを利用したい場合は適宜そのdriverをダウンロードすればOKです。
pipからseleniumのインストール
Windows、macどちらもpipコマンドから
pip install selenium
実装
では準備も整ったのでseleniumを動かすコードを描いてみましょう。
タイトル詐欺をしないよう3行だけ。
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です。
実行
では先ほどのコードを実行!
python test.py
アプリケーションのアクセス許可が求められるかもしれません。
しかしこれでChromeでGoogleが表示されたはずです!
3行でseleniumを実感できました。めでてぇ。
これがseleniumにおけるHello worldみたいなものかと思います。
あとはフロントエンドのコーディングをしたことがある方ならば操作にそこまで手こずることはないのかなと思います。
ためしにコードからGoogleで検索してみましょう。
Google検索するSeleniumを実装
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ページに依存しているため、いつなん時利用できなくなるか不明です。うまくいかない場合は、適宜開発者ツール等を利用して最新のテキストボックス要素を取得する実装に変更してください。
python google.py
これでGoogleで"selenium"の検索結果画面が表示されたかと思います。
概ね利用するDriverのAPIはこのページが見やすくて参考にしています。
Selenium API(逆引き)
留意点
画面が変わっても試験が壊れないようにするには規則的なセレクタを指定する必要があります。
bemやらsmacssやらのコーディング規約を最低限プロジェクトでは統一しておきましょう。
cssセレクタで要素を取得する以上、リニューアルなどで画面のセレクタが変わってしまえばもうそのテストは使えません。
selenium初心者の所感
ここまで書いてみて思ったのですが、フロントエンドとサーバサイドの実装の担当者が別れてしまっている場合、この試験はどちらが書くのが正しいのでしょう?
画面操作のオペレーションになるので結合試験に分類されるとは思うのですが、seleniumからログやDBの期待値を確認できるわけでもないし、完全にフロントエンドだけの試験って割りきったものなのでしょうか?
私、気になります!
案件で使ったことないし、業務もWebアプリから離れてしまったので、その解答を得られるのはしばらく先になりそう。。
おわりに
実は私が今回seleniumを触れたのは別にテストを自動化したかったからではありませんでした。
windowsのタスクスケジューラから定期的にとあるwebサービスにログインして画面情報を取得するツールがほしいと頼まれ、最初はcurlでログインしようと思ったのですがリクエストヘッダのなにかが悪いのか、色々試行錯誤してみたもののログインできず、、、
とほほと途方に暮れていたところ、調べたらseleniumでブラウザ動かせば行けそうやん!ってなったのでした。
普通そんな使い方することはあまり無いでしょうが、テスト以外の便利ツールとしてもなにかしら利用価値がありそうですよね。簡単ですし。
ちなみに私はこの経験を活かし、会社の勤怠管理ツールがWebなので自動で勤怠打刻をしてくれるツールを作ってcron設定しました。これで出勤打刻忘れはありません。ぐへへ