akiyoko blog

akiyoko の IT技術系ブログです

Python で Selenium WebDriver を使ったブラウザテストをする方法

ブラウザテストツールの代表格と言えば「Selenium」ですが、実は、6年前にも一度調査したことがあったのです。しかしながらその当時は結局、業務で採用されることはありませんでした。

現在の「Selenium2」は、「WebDriver」というツールが統合されるなど、当時の「Selenium1」から大きく進化をしているわけですが、それでもツールの利用方法などは6年前からあまり変わっていないようです。


Selenium導入にあたって最初につまずくのは、やり方が何通りかあって「結局どれがいいの?」と迷ってしまうことかな?と思います。使い方としては大きく3通りあると思うのですが、それを簡単にまとめたのが↓の表です。(「○○向け」というのは個人的な印象です。)

概要 テストの書き方 実行ブラウザ Selenium IDE Selenium-RC Selenium WebDriver
初心者向け GUIのみでテスト可能 GUIxmlでも可) FireFox
中級者向け jar形式の Selenium Server を起動させる必要あり(Javaが必要) Python, Java など しょぼいブラウザ(コンソール付きのデバッガ)
上級者向け 各言語に対応する Selenium Client から WebDriver を起動 Python, Java など WebDriver(FireFoxなどの各種ブラウザに対応したエミュレータ


実際には、「Selenium IDE」だけであったり「Selenium-RC」をメインで業務で使うというのはあまり無いでしょうから、「Selenium Client から WebDriver を起動」するパターンがほとんどじゃないかなと思います。
ということで今回は、「PythonSelenium WebDriver を使ったブラウザテストをする方法」についてまとめておきます。


やりたいこと

 

1. 事前準備

1) Python for Windows をインストール

https://www.python.org/downloads/ で、「Download the latest version for Windows」の「Download Python 2.7.6」をクリックします。

f:id:akiyoko:20140426103358p:plain


ダウンロードした「python-2.7.6.msi」をダブルクリックしてインストーラを実行。

f:id:akiyoko:20140426103415p:plain


デフォルトだと「C:\Python27」にインストールされるはず。


Windowsスタートメニューから、 [コンピューター] -> [プロパティ] -> [システムの詳細設定] -> [環境変数] で、システム環境変数の「Path」の末尾に「;C:\Python27」を追加します。

f:id:akiyoko:20140426103421p:plain

> python --version
Python 2.7.6

 

2. Selenium IDE の設定

1)
http://docs.seleniumhq.org/download/
から、
Selenium IDE の「latest released version 2.5.0」をダウンロードします。

f:id:akiyoko:20140428104348p:plain

2)
ダウンロードした「selenium-ide-2.5.0.xpi」を、Firefoxのアドオンマネージャ画面にドラッグ&ドロップします。

f:id:akiyoko:20140428104415p:plain

f:id:akiyoko:20140428104441p:plain

3)
FireFox のメニュー [ツール] -> [Selenium IDE] から、Selenium IDEを立ち上げます。

f:id:akiyoko:20140428104622p:plain


テストを記録したら、[ファイル] -> [テストケースをエクスポート] -> [Python 2 / unittest / WebDriver] で、Python形式でテストケースをエクスポートできます。


参考

3. Selenium Client & WebDriver の設定

1)
http://docs.seleniumhq.org/download/ から、「Selenium Client & WebDriver Language Bindings」の「Python 2.41.0」をダウンロードします。

f:id:akiyoko:20140428105528p:plain

f:id:akiyoko:20140428105901p:plain

2)
ダウンロードした「selenium-2.41.0.tar.gz」を解凍し、その中から、「selenium-2.41.0\py\selenium」の「selenium」フォルダごと、「C:\Python27\Lib」の直下にコピペします。

f:id:akiyoko:20140428110135p:plain


4. テストの実行

Selenium IDE からエクスポートしたファイルを加工して、pythonテストケースとして実行します。

> python test_webdriver.py
.
----------------------------------------------------------------------
Ran 1 test in 14.059s

OK


test_webdriver.py

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
import unittest, time, re

class TestWebdriver(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://docs.seleniumhq.org/"
        self.verificationErrors = []
        self.accept_next_alert = True

    def test_webdriver(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_link_text("Documentation").click()
        driver.find_element_by_link_text("Selenium WebDriver").click()
        driver.find_element_by_xpath("//input[@value='python']").click()
        driver.save_screenshot("screenshot.png")

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

 

(おまけ)よく使いそうな WebDriver のメソッド

driver.get()

新しいブラウザを開いて、指定したURLにアクセスする。

driver.close()

ブラウザを閉じる。

driver.switch_to_alert()

確認ダイアログの操作をする。

# 確認ダイアログのOKボタンをクリックするサンプル
alert = driver.switch_to_alert()
alert.accept()

driver.implicitly_wait()

要素が見つかるまで最大何秒待つかを定義する。

driver.set_page_load_timeout()

ページがロードし終わるまでのタイムアウト秒を定義する。

driver.maximize_window()

ブラウザのサイズを最大化する。

driver.save_screenshot()

スクリーンショットを撮る。


参考

 

2014/10/10追記

実践 Selenium WebDriver

実践 Selenium WebDriver


Selenium WebDriver の O'REILLY本が出ていたんですね。
当時はこんな本無かったなぁ。