Seleniumを使ったテストを書く際につまずいたprofile設定をメモします。
Python初心者なので、コードがおかしいかもしれませんがご了承を。
環境の構築
構築の手順は多くのサイトで書かれているため、割愛します。
以下のサイトを参考にしました。
http://treeapps.hatenablog.com/entry/2014/10/16/015439
https://pypi.python.org/pypi/selenium
Xvfb+FireFox+Selenium(2.44.0)の構成です。
profile設定
User-Agentを判別してPC/スマホに最適化されたページを出し分けている場合、スマホのUA(mobile Safari等)を指定したテストが必要になってきます。
また、開発環境で試験を回す場合、オレオレ証明書だったりする事があると思います。
これらに対応するため、profileの初期設定が必要です。
sp_webdriver.py
import os
from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
profile = FirefoxProfile()
# 証明書の警告を無視する
profile.set_preference("webdriver_assume_untrusted_issuer", False)
profile.set_preference("webdriver_accept_untrusted_certs", True)
profile.accept_untrusted_certs = True
# User-Agentの書き換え(例:iOS 8.0)
profile.set_preference("general.useragent.override", "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4")
profile.update_preferences()
driver = webdriver.Firefox(profile)
テストケースを書いてみる
テストケースを書いてみます。
実際に書くときは、基底クラスを作ってからテスト部分だけ実装するといいと思います。
TestCase.py
# -*- coding: utf-8 -*-
import sys, os
import datetime
from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
import unittest
class TestCase(unittest.TestCase):
def setUp(self):
profile = FirefoxProfile()
profile.set_preference("webdriver_assume_untrusted_issuer", False)
profile.set_preference("webdriver_accept_untrusted_certs", True)
profile.accept_untrusted_certs = True
profile.set_preference("general.useragent.override", "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4")
profile.update_preferences()
self.driver = webdriver.Firefox(profile)
self.base_url = "http://m.finance.yahoo.co.jp/"
self.driver.implicitly_wait(30)
self.accept_next_alert = True
def ssAssertEquals(self, left, right):
try:
# assertionError時にスクリーンショットを取得する
self.assertEqual(left, right)
except AssertionError, e:
now = datetime.datetime.now()
self.driver.save_screenshot("/var/log" + self.__class__.__name__ + "_" + now.strftime("%Y%m%d%H%M%S") + ".png")
raise e
def test_sitetop(self):
self.driver.get(self.base_url)
self.ssAssertEquals(u"Y!ファイナンス", self.driver.title)
def tearDown(self):
self.driver.quit()
if __name__ == "__main__":
unittest.main()