私がこの1年やったことといえば、春にオンプレミスからAWSに一部機能を移行したり(パフォーマンステストで複数のAWS EC2からgatling砲発射...)、夏には10年近く使っている機能2つをリプレースしたり(JavaScriptに悩まされた...)、秋にはイケてないテストの負債を修正したり(GoogleのAPIとAWSと戯れて...)、冬に入ってブログを書いて(何もしていない?)います。
JavaScriptが絡むとテストは必ずといっていい程、クロスブラウザでの検証が必要になります。もう、ブラウザが違うというだけで、同じテストを手で実施するのは勘弁してほしい... そんなときに、
自動テスト関連では、10月13日にリリースしたSelenium WebDriver 3.0 はインパクトがありましたね。それより少し前に、FireFoxがversion 47になり、FireFox Driverが使えなくなったことの方がインパクトがあるかもしれません。
この記事によると、FireFox 57(来年の今頃)は、全てWebExtentionに完全移行する予定です。(Selenium IDEが使えなくなる。)
シャノンでは現時点ではSelenium WebDriver 3.0、FireFox DriverのGecko Driverへの移行は着手していませんが、いずれは対応することになるかと思います。
そのときのためのメモです。自分で検証したメモですので、間違っていたらごめんなさい。
1. FireFox
検証したOS
- MacOS Sierra version 10.12.1
- Ubuntu 16.04
- Windows 7
firefox ver. 48以上の場合 (version 50.0.2で検証)
- 1. build.gradleを下記のように定義
dependencies { testCompile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.0.1' testCompile group: 'org.seleniumhq.selenium', name: 'selenium-support', version: '3.0.1' }
- 2. ここから geckodriver (Windowsの場合は、geckodriver.exe)をダウンロードする。 (検証したgeckodriverのバージョンは0.11.1)
- 3. /usr/local/bin/ などOSのPATHが通っているところに実行権限を付与して配置
- 4. こんな感じでFireFoxDriverのインスタンスを生成
FirefoxProfile firefoxProfile = new FirefoxProfile(); DesiredCapabilities capabilities = DesiredCapabilities.firefox(); capabilities.setCapability(FirefoxDriver.PROFILE, firefoxProfile); WebDriver driver = new FirefoxDriver(capabilities);
- 5. 注意点
- 古いFireFoxDriverと比較して一部の機能がまだ対応していない。具体的には、Actions クラスは、未対応(エラーとなる。)
firefox ver. 48未満の場合 (version 45.5.1 esrで検証)
- 1. "marionette" capability を false に設定し、selenium起動時に古い FirefoxDriver を呼び出す。
FirefoxProfile firefoxProfile = new FirefoxProfile(); DesiredCapabilities capabilities = DesiredCapabilities.firefox(); // ここでgeckgodriverを呼び出さないように設定 capabilities.setCapability("marionette", false); capabilities.setCapability(FirefoxDriver.PROFILE, firefoxProfile); WebDriver driver = new FirefoxDriver(capabilities);
2. Chrome
検証したOS
- MacOS Sierra version 10.12.1
- Ubuntu 16.04
- Windows 7
検証Chrome Version 55.0
- 1. ここから chromedriver (Windowsの場合は、chromedriver.exe)をダウンロードする。 (検証したchromedriverのバージョンは2.25)
- 2. /usr/local/bin/ などOSのPATHが通っているところに実行権限を付与して配置
- 3. 下記のように記述
WebDriver driver = new ChromeDriver();
3. Safari
検証したOS
- MacOS Sierra version 10.12.1
検証Safari Version 10.0.1
- 1. which safaridriver とコマンドを打って、/usr/bin/safaridriver を出力することを確認
- 2. 下記のように記述
WebDriver driver = new SafariDriver();
- ※ ただし、自動テストを実行後、ブラウザの画面は閉じるのですが、Safariのプロセスが残ったままとなってしまい、次のテストを起動できません。私の設定の問題かもしれませんが、解決方法は、driver.quit()した後に、Safariのプロセスを強制終了するコマンドを実行するしかないと思います。並列でテストができない...
4. IE
検証したOS
- Windows 7
検証IE 11
- 1. ここから IE driverをダウンロードする。
- 2. OSのPATHが通っているところに実行権限を付与して配置
- 3. 下記のように記述
IEDriver driver = new IEDriver();
- ※ 相変わらず遅い... 早くEdgeに切り替わってくれないかな...
5. Edge
検証したOS
- Windows 10
検証Edge
- 1. ここから MicrosoftWebDriver(Edge Driver)をダウンロードする。
- 2. OSのPATHが通っているところに実行権限を付与して配置
- 3. 下記のように記述
EdgeDriver driver = new EdgeDriver();
上記検証したコードはこちら (ぐだぐだ書かないで初めからこれを見せろって言われそうですが... )
他の方もblogなどで書かれている通り、mavenやgradleを使って Selenium Webdriver 2系を動かしている場合は、Webdriver 3.0 へのバージョンアップはそれ程難しくないと感じました。また、Webdriver 3.0を使って Geb を動かすこともできました。
どちらかというと、Webdriver 3.0へのバージョンアップより、FireFoxDriver → marionette → GeckoDriver に伴う影響が大きいのではと思います。GeckoDriver になることで少ないとはいえ一部のテストがNGとなるケースがあったり、FireFoxのバージョンによって、WebDriverのインスタンス作成のコードが変わるからです。
FireFoxのバージョンを上げずに、Selenium IDEを使って自動テストを作成し続けるのか。
Webdriver 3.0をベースとしたフレームワークを使うようになるのか...
また、それに伴いSeleniumで動かすメインのブラウザがFireFoxからChromeになるのか(Webdriver 3.0 を使うなら明らかにFireFoxよりChromeの方が安定している。)
GebやSelenideのようなクライアントラッパーが普及していくのか、じっくり見守っていこうと思います。
それでは...