分度器要素ロケーターが失敗するたびに、エラーが出力され、私の仕様とスイートで無限のカスケード障害の恐ろしい道を進み続けます。以下のすべてのテストは、要素を見つける要素ロケーターに依存し、現在の仕様の合格に依存します。
コンソールを使用している間、テスト対象のWebページを開いたままにしておきたいです。目標は、ページの現在の状態をデバッグし、要素ロケーターがターゲットを見つけられなかった理由を調査することです。
スイート全体に障害が発生し、最初の仕様の障害で終了することについてはあまり心配していません(--fail-fastで他の回答を確認し、最初の仕様の障害で停止しました)。ブレークポイントを設定し、ページの実行中に環境を検査したいと思います。
たぶん、ジャスミンのオプションのようなものがありdoThisOnFailure: () => { debugger }
、それは私にとってはうまくいくと思います。
スペックレポーターを使用して実行しafterEach
、スペック関数全体についてJasmine環境で失敗したスペックカウントをチェックするソリューションは本当に好きではありません。要素ロケーターが失敗したときはすぐに知りたいのですが、失敗したらすぐに壊れます。
たぶん、本当にグロスなものがうまくいくでしょう$('element').click().catch(() => { debugger })
。
編集:私が仕様の最後で壊すのではなく、仕様を壊すことについて尋ねていることに注意してください。
it('should execute deadly code', function () {
p.navigation.openStorageConfigTab()
$$('.bad-selector').get(0).click() /* IMPORTANT: I want to break here */
p.volume.navigateTo()
})
it('should not execute this spec', function () {
$$('.bad-selector').get(0).click()
})
そして出力
✗ should execute deadly code
- Failed: Index out of bound. Trying to access element at index: 0, but there are only 0 elements that match locator By(css selector, .bad-selector)
✗ should not execute this spec
- Failed: Index out of bound. Trying to access element at index: 0, but there are only 0 elements that match locator By(css selector, .bad-selector)
私が使用しているアプローチをお勧めします。ここからそれを取り入れていただければ幸いです。
全体的なアプローチはclose/
、ブラウザのURLにコマンドを入力するまで待つことです。
await browser.waitForAngularEnabled(false);
await browser.wait(
async () => {
let url = await browser.getCurrentUrl();
return url.includes('close/');
},
5 * 60 * 1000,
'Keep-alive timeout reached, closing the session...'
);
問題は、いつそれを呼び出したいかです。onComplete
設定ファイルでコールバック関数の利点を利用しています。呼び出されても、ブラウザは引き続き使用できます。したがって、すべてのテストが完了するclose/
と、URLフィールドに送信しない限り、5分間終了しません。明らかに、次のようなものを追加することで、条件付きにすることができますif (DEBUG === true)
この設定の欠点は、すべてのテストが完了すると呼び出されることです。仕様がエラーのあったページから移動した可能性があります。したがって、ジャスミンレポーターの利点を活用することもできます(ジャスミンを使用している場合)。大まかに言うと、これをonPrepare
関数に追加するだけです。
jasmine.getEnv().addReporter({
jasmineStarted: function(suiteInfo) {},
suiteStarted: function(result) {},
specStarted: function(result) {},
specDone: async function(spec) {
if (spec.status === 'failed') {
await browser.waitForAngularEnabled(false);
await browser.wait(
async () => {
let url = await browser.getCurrentUrl();
return url.includes('close/');
},
5 * 60 * 1000,
'Keep-alive timeout reached, closing the session...'
);
await browser.close();
process.exit(35);
}
},
suiteDone: function(result) {},
jasmineDone: function(result) {},
});
したがって、いずれかのit
ブロックにfailed
ステータスがある場合、そのブロックは停止します。しかし、私はそれをテストしていません、私はそれをあなたに任せます。次に、存在しないURLにリダイレクトされたため、キューに入れられた残りの仕様がどうなるかについては考えていませんでしclose/
たが、それでも機能すると思います。最悪のシナリオでは、概念を理解している限り、遊んで続行したり、ブラウザインスタンスを閉じたりすることができます
PS私はあなたが入力したときに、ブラウザを閉じるようにコードを修正close/
追加することにより、
await browser.close();
process.exit(35);
このコードを次のシナリオでテストしました。
it
が成功it
ブロックの最初の要素ファインダーが失敗するit
ブロックの2番目の要素ファインダーが失敗するすべて合格しました。コードは期待どおりに機能します
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加