読者です 読者をやめる 読者になる 読者になる

iWebDriverでテストする

Selenium Python JavaScript iOS

昨日のエントリのChromeDriverを試した後、SafariDriverというなかなか有望そうだがイマイチちゃんと動いている感がないソリューションまで試した結果、iPhone向けWebアプリケーションのテストにはiPhoneそのものか、iPhoneシミュレーターを使うのが一番良いという結論に達した。

インストール

iOS端末でSelenium(iWebDriver)を使うには、公式ドキュメントにある通り、レポジトリからコードをチェックアウトして、"./go iphone"でビルドする。要Xcode

$ svn co http://selenium.googlecode.com/svn/trunk selenium
$ cd selenium
$ ./go iphone

あるいは、selenium/iphone/iWebDriver.xcodeproj というXcodeプロジェクトを開いて普通にビルドしてもよい。

Python Bindingで使う

ビルドしたiWebDriverアプリを起動すると、"Started at http://127.0.0.1:3001/wd/hub/" という表示が出るので、このURLにSeleniumRemoteWebDriverで接続する。

Pythonならば次のような感じ。

# -*- coding: utf-8 -*-
import unittest2 as unittest
from selenium import webdriver

class KnightTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Remote(
            "http://127.0.0.1:3001/wd/hub", webdriver.DesiredCapabilities.IPHONE)

    def test_gree(self):
        driver = self.driver
        driver.get("http://tknight.gree.jp/?&render=1")
        self.assertIn(u"聖戦ケルベロス", driver.title)

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

node.jsで使う

WebDriverJsを使うと、node.js/JavaScriptでWebDriverを操作できる。

seleniumのチェックアウトディレクトリで、

./go webdriverjs

を実行し、ビルド結果として生成される build/javascript/webdriver/webdriver.js をnode.jsのスクリプトでrequireしてやればよい。

var webdriver = require('./build/javascript/webdriver/webdriver');
var assert = require('assert');

var driver = new webdriver.Builder()
    .usingServer('http://10.6.252.254:3001/wd/hub/')
    .build()
;

driver.get('http://tknight.gree.jp/').then(function() {
    driver.getTitle().then(function(title) {
        assert.equal('聖戦ケルベロス', title);
    });
});
driver.quit();

Webアプリケーションのテストが「リクエストを送信して結果を待って何かする」という非同期プログラミングのパターンが多いことから、JavaScriptSelenium WebDriverでテストケースを作成するには最適な言語であるような気がしているが、テストケースは書けるだろうけど、大規模なテストスーツを構成する方法、ベストプラクティスは全然分からない。