タイムアウト
WebdriverIOの各コマンドは非同期操作です。Seleniumサーバー(またはSauce Labsのようなクラウドサービス)にリクエストが送信され、アクションが完了または失敗すると、そのレスポンスに結果が含まれます。
そのため、時間全体テストプロセスにおいて重要な要素です。特定のアクションが別のアクションの状態に依存する場合、それらが正しい順序で実行されるようにする必要があります。タイムアウトは、これらの問題に対処する上で重要な役割を果たします。
Seleniumタイムアウト
セッションスクリプトタイムアウト
セッションには、非同期スクリプトの実行を待つ時間を指定するセッションスクリプトタイムアウトが関連付けられています。特に明記されていない限り、30秒です。 このタイムアウトは次のように設定できます。
await browser.setTimeout({ 'script': 60000 })
await browser.executeAsync((done) => {
console.log('this should not fail')
setTimeout(done, 59000)
})
セッションページロードタイムアウト
セッションには、ページの読み込みが完了するまで待つ時間を指定するセッションページロードタイムアウトが関連付けられています。特に明記されていない限り、300,000ミリ秒です。
このタイムアウトは次のように設定できます。
await browser.setTimeout({ 'pageLoad': 10000 })
pageLoad
キーワードは、公式のWebDriver 仕様の一部ですが、ブラウザでサポートされていない場合があります(以前の名前はpage load
です)。
セッション暗黙的待機タイムアウト
セッションには、セッション暗黙的待機タイムアウトが関連付けられています。これは、findElement
コマンドまたはfindElements
コマンド(WebdriverIOをWDIOテストランナーと使用するかどうかに応じて、それぞれ$
または$$
)を使用して要素を検索するときの、暗黙的な要素検索戦略の待機時間を指定します。特に明記されていない限り、0ミリ秒です。
このタイムアウトは、次のように設定できます。
await browser.setTimeout({ 'implicit': 5000 })
WebdriverIO関連のタイムアウト
WaitFor*
タイムアウト
WebdriverIOは、要素が特定の状態(例:有効、表示、存在)になるまで待つための複数のコマンドを提供します。 これらのコマンドは、セレクター引数とタイムアウト番号を取ります。タイムアウト番号は、インスタンスが要素がその状態になるまで待つ時間を決定します。 waitforTimeout
オプションを使用すると、すべてのwaitFor*
コマンドのグローバルタイムアウトを設定できるため、同じタイムアウトを何度も設定する必要がありません。 (小文字のf
に注意してください!)
// wdio.conf.js
export const config = {
// ...
waitforTimeout: 5000,
// ...
}
テストでは、次のことができます。
const myElem = await $('#myElem')
await myElem.waitForDisplayed()
// you can also overwrite the default timeout if needed
await myElem.waitForDisplayed({ timeout: 10000 })
フレームワーク関連のタイムアウト
WebdriverIOで使用しているテストフレームワークは、特にすべてが非同期であるため、タイムアウトを処理する必要があります。 これにより、問題が発生した場合にテストプロセスが停止しないようにします。
デフォルトでは、タイムアウトは10秒です。つまり、単一のテストはそれ以上長くかかるべきではありません。
Mochaの単一のテストは次のようになります。
it('should login into the application', async () => {
await browser.url('/login')
const form = await $('form')
const username = await $('#username')
const password = await $('#password')
await username.setValue('userXY')
await password.setValue('******')
await form.submit()
expect(await browser.getTitle()).to.be.equal('Admin Area')
})
Cucumberでは、タイムアウトは単一のステップ定義に適用されます。 ただし、テストにデフォルト値よりも時間がかかるためタイムアウトを増やす場合は、フレームワークオプションで設定する必要があります。
- Mocha
- Jasmine
- Cucumber
// wdio.conf.js
export const config = {
// ...
framework: 'mocha',
mochaOpts: {
timeout: 20000
},
// ...
}
// wdio.conf.js
export const config = {
// ...
framework: 'jasmine',
jasmineOpts: {
defaultTimeoutInterval: 20000
},
// ...
}
// wdio.conf.js
export const config = {
// ...
framework: 'cucumber',
cucumberOpts: {
timeout: 20000
},
// ...
}