概要

v2.2以降、Nightwatchでは、ウェブサイトの実行中に発生するJavaScript例外をリッスンし、コールバックを介してテスト自体で利用できるようにすることができます。

これは、Selenium 4で利用可能になったChrome DevTools Protocolのサポートにより可能になりました。

`captureBrowserExceptions()` コマンドは、Google ChromeやMicrosoft EdgeなどのChromiumベースのブラウザでのみ機能します。

JS例外のキャプチャ

ウェブサイトに移動する前に、必須パラメータ付きでbrowser.captureBrowserExceptions()コマンドを使用してください。

captureBrowserExceptions()はコールバック関数を受け入れます。この関数は、新しいErrorがスローされるたびに、引数としてeventオブジェクトを受け取ります。受信したeventオブジェクトの仕様は次のとおりです。

名前 タイプ 説明
タイムスタンプ 数値 JS例外がキャプチャされた時刻。
exceptionDetails
オブジェクト 発生した例外の詳細がすべて含まれるJSオブジェクト。
オブジェクトの仕様はこちらで確認できます。

tests/catch-js-exceptions.js
describe('catch browser exceptions', function() {
  it('captures the js exceptions thrown in the browser', async function() {
    await browser.captureBrowserExceptions((event) => {
      console.log('>>> Exception:', event);
    });
    
await browser.navigateTo('https://duckduckgo.com/');
const searchBoxElement = await browser.findElement('input[name=q]'); await browser.executeScript(function(_searchBoxElement) { _searchBoxElement.setAttribute('onclick', 'throw new Error("Hello world!")'); }, [searchBoxElement]);
await browser.elementIdClick(searchBoxElement.getId()); }); });

上記の例の出力

  Running captureBrowserExceptions():
───────────────────────────────────────────────────────────────────────────────────────────────────
{
  exceptionDetails: {
    exceptionId: 1,
    text: 'Uncaught',
    lineNumber: 0,
    columnNumber: 6,
    scriptId: '55',
    url: 'https://duckduckgo.com/',
    stackTrace: { callFrames: [Array] },
    exception: {
      type: 'object',
      subtype: 'error',
      className: 'Error',
      description: 'Error: Hello world!\n' +
        '    at HTMLAnchorElement.onclick (https://duckduckgo.com/:1:7)',
      objectId: '6711588812373266697.1.1',
      preview: [Object]
    },
    executionContextId: 1
  },
  timestamp: 2022-06-10T13:14:52.722Z
}
No assertions ran.