WebdriverIO

npm install @tracera/webdriverio

Проверено на Node.js 22.19–26.12 и WebdriverIO 9–10.0 (см. Адаптеры автотестов). @tracera/webdriverio на npm.

В wdio.conf.ts (Mocha):

export const config = {
  reporters: ['spec', ['@tracera/webdriverio/reporter', {}]],
  services: [['@tracera/webdriverio/service', {}]],
  mochaOpts: {
    require: ['@tracera/webdriverio/setup'],
  },
};

Для Cucumber зарегистрируйте тот же reporter и service. Предпочтительны теги на Scenario @tracera.id:‹id› (опционально @tracera.name:…), либо вызов tracera.testCase из хука Before или из шага.

Переменные окружения, режим прогона и повторы: Адаптеры автотестов.

Ключ Env при повторе: WEBDRIVERIO_RETRY.

Привязка testCaseId и autotestName

Подключите @tracera/webdriverio/setup через mochaOpts.require и импортируйте tracera и annotations. Имена Mocha annotations — литералы (без {param}).

Mocha — в объявлении (предпочтительно):

import { annotations } from '@tracera/webdriverio';

it(
  'login',
  annotations(42, 'e2e/login', async () => {
    await browser.url('https://example.com');
  }),
);

Mocha — внутри теста (необязательно, если кейс уже привязан через annotations):

import { tracera } from '@tracera/webdriverio';

it('login', async () => {
  tracera.testCase(42, 'e2e/login');
  await browser.url('https://example.com');
});

Cucumber — теги Scenario (предпочтительно):

@tracera.id:42
@tracera.name:e2e%2Flogin
Scenario: login
  Given I open the login page

Чтобы привязать кейс без тегов Scenario, вызовите tracera.testCase из хука Before или из шага.

Пропуск

Штатный skip Mocha (this.skip()). По желанию задайте comment результата через tracera.comment перед вызовом skip.

import { annotations, tracera } from '@tracera/webdriverio';

it(
  'login',
  annotations(42, 'e2e/login', async function () {
    if (!process.env.READY) {
      tracera.comment('env not ready');
      this.skip();
    }
    await browser.url('https://example.com/login');
  }),
);

Шаги

Используйте tracera.step: вызов tracera.step(title, fn), декоратор @tracera.step("…") на методе класса или tracera.step("…")(fn). В заголовке декоратора {name} / {0} подставляются из аргументов метода; вместо строки можно передать функцию, которая вернёт заголовок. В вызове tracera.step(title, fn) плейсхолдеры {name} / {0} не подставляются — передайте уже готовую строку. Асинхронные методы и Promise ожидаются до завершения. С @tracera/webdriverio/setup стандартные Mocha beforeEach / afterEach обёрнуты — шаги внутри них попадают в Предусловие / Постусловие результата. Хуки уровня suite (before / after) не попадают в отчёт.

import { tracera } from '@tracera/webdriverio';

beforeEach(async () => {
  await tracera.step('open shop', async () => {
    await browser.url('/shop');
  });
});

it('checkout', async () => {
  tracera.testCase(10, 'e2e/checkout');
  await tracera.step('add to cart', async () => {
    await $('[data-testid=add]').click();
  });
});

afterEach(async () => {
  await tracera.step('cleanup', async () => {
    await browser.url('/cart/clear');
  });
});

Декоратор на методе:

import { tracera } from '@tracera/webdriverio';

class Cart {
  @tracera.step('add {item}')
  async addToCart(item: string) {
    // …
  }
}

Комментарии, ошибки и вложения

Комментарии, ошибки и вложения: Адаптеры автотестов.

import { tracera } from '@tracera/webdriverio';

it('login', async () => {
  tracera.testCase(42, 'e2e/login');
  tracera.comment('result-level note');
  tracera.error('result-level error text');

  await tracera.step('open login', async () => {
    await browser.url('/login');
    tracera.comment('landed on login');
    tracera.attachment({
      fileName: 'suite-log.txt',
      mimeType: 'text/plain',
      data: new TextEncoder().encode('finished login flow'),
    });
  });
});

Параметризованные тесты

import { annotations } from '@tracera/webdriverio';

const rows = [
  { id: 42, name: 'e2e/login-ok', path: '/login' },
  { id: 43, name: 'e2e/login-sso', path: '/login/sso' },
];

for (const row of rows) {
  it(
    row.name,
    annotations(row.id, row.name, async () => {
      await browser.url(`https://example.com${row.path}`);
    }),
  );
}

Или вызовите tracera.testCase(row.id, row.name) внутри теста вместо annotations.