概述

从 v2.2 开始,Nightwatch 允许您监听网站运行时发生的 JavaScript 异常,并通过回调在测试中提供这些异常。

这得益于 Selenium 4 中现有的 Chrome DevTools 协议支持

`captureBrowserExceptions()` 命令仅适用于基于 Chromium 的浏览器,如 Google Chrome 和 Microsoft Edge。

捕获 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.