LoginSignup
82
96

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-04-06

はじめに

画面テストツールとして名高い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行だけ。

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です。

実行

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

python test.py

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

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

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

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

Google検索するSeleniumを実装

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

python google.py

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

概ね利用するDriverのAPIはこのページが見やすくて参考にしています。
Selenium API(逆引き)

留意点

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

selenium初心者の所感

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

おわりに

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

82
96
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
82
96