WebdriverIOを使ったE2Eテスト自動化の検討メモ
TypeScriptとasync/awaitのサポート
TypeScriptは公式にサポートされている。
async/await にも対応しているが、コードを単純化するために同期的に実装することが推奨されている。
- WebdriverIOのメソッドは
function() {}内で呼び出されると同期的に実行され、async function() {}内で呼び出されると非同期になる(Promiseを返却する)。 - 同期的な実装をサポートするために、
Promiseを返却する非同期メソッドを同期的に実行できる browser.call メソッドが提供されている。
ひな型プロジェクト(Boilarplate Project)
Boilerplate Projectをベースにプロジェクトを作成すると、TypeScriptやReportingライブラリを1からセットアップする手間が省ける。
WebdriverIO v5対応していてTypeScript + Mochaの組み合わせのものは以下の通り。
- https://github.com/jpolley/WebdriverIO_v5_TypeScript
- https://github.com/WillLuce/WebdriverIO_Typescript
- https://github.com/dalenguyen/WebdriverIO-TypeScript-Boilerplate
ローカルマシンで各ブラウザを使ってテストを実行する
@wdio/selenium-standalone-serviceを使うとnpmでWebDriverをインストールでき、テスト開始前にSeleniumサーバーを起動してくれる。
-
インストールするWebDriverはwdio.conf.jsに設定する。
-
Windows 10環境でChrome、Firefox、InternetExplorerを使う場合の設定例:
{ services: ['selenium-standalone'], seleniumArgs: { drivers: { chrome: {}, firefox: {}, // Use ia32 version of IEDriver as x64 version is not stable. ie: { arch: "ia32" } } }, seleniumInstallArgs: { drivers: { chrome: {}, firefox: {}, ie: { arch: "ia32" }, } } }※ 64bit版 IEDriverを使うとフォームへの文字列入力が遅くなるため、32bit版を指定している。
テスト開始前に処理を入れる
WebdriverIOのHooksを定義するか、(テストランナーにMochaを使っている場合)Root-level hookを使えばよい。
ただし、MochaのRoot-level hookはspecファイルごとに実行される。(参考)
スクリーンショットの比較による回帰検査を実装する
Stack Overflowで議論されているライブラリはメンテされていなくWebdriverIO v5未対応のため、現状は自力でスクリーンショットを取得して比較する必要がある。
- wdio-visual-regression-service:v4時点で開発が停止している。
- webdrivercss:v3以降対応していない。
WebDriverのTake Screenshotでは表示領域のみのスクリーンショットしか取得できないため、表示領域よりもページのサイズが大きい場合は、スクロールをしながらスクリーンショットを取る必要がある。
-
表示領域・ページサイズの取得:WebDriverのAPIでは取れないのでJavaScriptで取得する
const size = browser.execute(function() { return { viewWidth: document.documentElement.clientWidth, viewHeight: document.documentElement.clientHeight, pageWidth: document.body.scrollWidth, pageHeight: document.body.scrollHeight, }; }); -
スクロール:サイズ取得同様にJavaScriptで実装する
browser.execute(function (x, y) { window.scrollTo(x, y); }, x, y);※ Internet ExplorerでJavaScriptを実行する際は
browser.execute(() => {});のようにアロー関数を使うとエラーになることに注意すること。
取得したスクリーンショットを比較は、resemblejsを使うと不一致率を計算できる。