ページオブジェクトパターン
WebdriverIOのバージョン5は、ページオブジェクトパターンのサポートを念頭に設計されました。「要素をファーストクラスのオブジェクトとして扱う」という原則を導入することで、このパターンを使用して大規模なテストスイートを構築することが可能になりました。
ページオブジェクトを作成するために追加のパッケージは必要ありません。クリーンでモダンなクラスが、必要な機能をすべて提供していることがわかります:
- ページオブジェクト間の継承
- 要 素の遅延ロード
- メソッドとアクションのカプセル化
ページオブジェクトを使用する目的は、ページ情報を実際のテストから抽象化することです。理想的には、特定のページに固有のすべてのセレクタや特定の指示をページオブジェクトに格納することで、ページを完全に再設計した後でもテストを実行できるようになります。
ページオブジェクトの作成
まず最初に、Page.js
という名前のメインページオブジェクトが必要です。これには、すべてのページオブジェクトが継承する一般的なセレクタやメソッドが含まれます。
// Page.js
export default class Page {
constructor() {
this.title = 'My Page'
}
async open (path) {
await browser.url(path)
}
}
ページオブジェクトのインスタンスは常にexport
し、テスト内でそのインスタンスを作成することはありません。エンドツーエンドテストを書いているため、各HTTPリクエストがステートレスな構造であるのと同様に、ページは常にステートレスな構造として扱います。
確かに、ブラウザはセッション情報を保持することができ、異なるセッションに基づいて異なるページを表示することができますが、これはページオブジェクト内に反映されるべきではありません。このような状態の変化は、実際のテスト内に記述すべきです。
それでは、最初のページのテストを始めましょう。デモのために、Elemental SeleniumによるThe Internetウェブサイトをテスト対象として使用します。ログインページのページオブジェクト例を構築してみましょう。
セレクタのGet
取得
最初のステップは、login.page
オブジェクトで必要な重要なセレクタをすべてゲッター関数として記述することです:
// login.page.js
import Page from './page'
class LoginPage extends Page {
get username () { return $('#username') }
get password () { return $('#password') }
get submitBtn () { return $('form button[type="submit"]') }
get flash () { return $('#flash') }
get headerLinks () { return $$('#header a') }
async open () {
await super.open('login')
}
async submit () {
await this.submitBtn.click()
}
}
export default new LoginPage()