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، سجّل نفس المُبلِّغ والخدمة. فضّل الوسوم على الـ Scenario @tracera.id:‹id› (واختياريًا @tracera.name:…)، أو استدعِ tracera.testCase من خطاف Before أو من خطوة.
متغيرات البيئة ووضع التشغيل وإعادة المحاولة: محوّلات الاختبار الآلي.
مفتاح Env عند إعادة المحاولة: WEBDRIVERIO_RETRY.
ربط testCaseId و autotestName
حمّل @tracera/webdriverio/setup عبر mochaOpts.require واستورد tracera وannotations. أسماء annotations في Mocha حرفية (بدون {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 — وسوم السيناريو (المفضّل):
@tracera.id:42
@tracera.name:e2e%2Flogin
Scenario: login
Given I open the login page
للربط دون وسوم السيناريو، استدعِ 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} من وسائط الدالة؛ ويمكن تمرير دالة تُرجع العنوان. في نموذج الاستدعاء لا تُملأ {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.