خدمة مقارنة الصور (اختبار التراجع البصري)
@wdio/visual-service هي حزمة طرف ثالث، لمزيد من المعلومات يرجى مراجعة GitHub | npm
للحصول على وثائق حول الاختبار البصري مع WebdriverIO، يرجى الرجوع إلى الوثائق. يحتوي هذا المشروع على جميع الوحدات ذات الصلة لإجراء اختبارات بصرية باستخدام WebdriverIO. في دليل ./packages
ستجد:
@wdio/visual-testing
: خدمة WebdriverIO لدمج الاختبار البصريwebdriver-image-comparison
: وحدة مقارنة الصور التي يمكن استخدامها لأطر اختبار أتمتة NodeJS المختلفة التي تدعم بروتوكول WebDriver
مشغل Storybook (تجريبي)
انقر لمعرفة المزيد من الوثائق حول مشغل Storybook التجريبي
مشغل Storybook لا يزال في المرحلة التجريبية، وسيتم نقل الوثائق لاحقًا إلى صفحات وثائق WebdriverIO.
تدعم هذه الوحدة الآن Storybook مع مشغل Visual جديد. يقوم هذا المشغل تلقائيًا بمسح مثيل Storybook محلي/بعيد وسينشئ لقطات شاشة للعناصر لكل مكون. يمكن القيام بذلك عن طريق إضافة
export const config: WebdriverIO.Config = {
// ...
services: ["visual"],
// ....
};
إلى services
الخاصة بك وتشغيل npx wdio tests/configs/wdio.local.desktop.storybook.conf.ts --storybook
من خلال سطر الأوامر.
سيستخدم Chrome في وضع headless كمتصفح افتراضي.
[!NOTE]
- ستعمل معظم خيارات الاختبار البصري أيضًا مع مشغل Storybook، راجع وثائق WebdriverIO.
- سيقوم مشغل Storybook بتجاوز جميع إمكانياتك ويمكنه التشغيل فقط على المتصفحات التي يدعمها، انظر
--browsers
.- لا يدعم مشغل Storybook التكوين الحالي الذي يستخدم إمكانيات Multiremote وسيظهر خطأ.
- يدعم مشغل Storybook فقط ويب سطح المكتب، وليس ويب الجوال.
خيارات خدمة مشغل Storybook
يمكن توفير خيارات الخدمة بهذه الطريقة
export const config: WebdriverIO.Config = {
// ...
services: [
[
'visual',
{
// Some default options
baselineFolder: join(process.cwd(), './__snapshots__/'),
debug: true,
// The storybook options, see cli options for the description
storybook: {
additionalSearchParams: new URLSearchParams({foo: 'bar', abc: 'def'}),
clip: false,
clipSelector: ''#some-id,
numShards: 4,
// `skipStories` can be a string ('example-button--secondary'),
// an array (['example-button--secondary', 'example-button--small'])
// or a regex which needs to be provided as as string ("/.*button.*/gm")
skipStories: ['example-button--secondary', 'example-button--small'],
url: 'https://www.bbc.co.uk/iplayer/storybook/',
version: 6,
// Optional - Allows overriding the baselines path. By default it will group the baselines by category and component (e.g. forms/input/baseline.png)
getStoriesBaselinePath: (category, component) => `path__${category}__${component}`,
},
},
],
],
// ....
}
خيارات سطر أوامر مشغل Storybook
--additionalSearchParams
- النوع:
string
- إلزامي: لا
- الافتراضي: ''
- مثال:
npx wdio tests/configs/wdio.local.desktop.storybook.conf.ts --storybook --additionalSearchParams="foo=bar&abc=def"
سيضيف معلمات بحث إضافية إلى عنوان URL الخاص بـ Storybook. راجع وثائق URLSearchParams لمزيد من المعلومات. يجب أن تكون السلسلة عبارة عن سلسلة URLSearchParams صالحة.
[!NOTE] هناك حاجة إلى علامات الاقتباس المزدوجة لمنع تفسير
&
كفاصل أمر. على سبيل المثال، مع--additionalSearchParams="foo=bar&abc=def"
سيقوم بإنشاء عنوان URL التالي لـ Storybook لاختبار القصص:http://storybook.url/iframe.html?id=story-id&foo=bar&abc=def
.
--browsers
- النوع:
string
- إلزامي: لا
- الافتراضي:
chrome
، يمكنك الاختيار منchrome|firefox|edge|safari
- مثال:
npx wdio tests/configs/wdio.local.desktop.storybook.conf.ts --storybook --browsers=chrome,firefox,edge,safari
- ملاحظة: متاح فقط من خلال سطر الأوامر
سيستخدم المتصفحات المقدمة لالتقاط لقطات شاشة للمكونات
[!NOTE] تأكد من تثبيت المتصفحات التي تريد التشغيل عليها على جهازك المحلي
--clip
- النوع:
boolean
- إلزامي: لا
- الافتراضي:
true
- مثال:
npx wdio tests/configs/wdio.local.desktop.storybook.conf.ts --storybook --clip=false
عند تعطيله، سيقوم بإنشاء لقطة شاشة لمنفذ العرض. عند تمكينه، سيقوم بإنشاء لقطات شاشة للعناصر بناءً على --clipSelector
مما سيقلل من كمية المساحة البيضاء حول لقطة شاشة المكون ويقلل من حجم لقطة الشاشة.
--clipSelector
- النوع:
string
- إلزامي: لا
- الافتراضي:
#storybook-root > :first-child
لـ Storybook V7 و#root > :first-child:not(script):not(style)
لـ Storybook V6، انظر أيضًا--version
- مثال:
npx wdio tests/configs/wdio.local.desktop.storybook.conf.ts --storybook --clipSelector="#some-id"
هذا هو المحدد الذي سيتم استخدامه:
- لتحديد العنصر الذي سيتم التقاط لقطة الشاشة له
- للعنصر للانتظار ليكون مرئيًا قبل التقاط لقطة شاشة
--devices
- النوع:
string
- إلزامي: لا
- الافتراضي: يمكنك الاختيار من
deviceDescriptors.ts
- مثال:
npx wdio tests/configs/wdio.local.desktop.storybook.conf.ts --storybook --devices="iPhone 14 Pro Max","Pixel 3 XL"
- ملاحظة: متاح فقط من خلال سطر الأوامر
سيستخدم الأجهزة المقدمة التي تتطابق مع deviceDescriptors.ts
لالتقاط لقطات شاشة المكونات
[!NOTE]
- إذا كنت تفتقد تكوين جهاز، فلا تتردد في تقديم طلب ميزة
- سيعمل هذا فقط مع Chrome:
- إذا قدمت
--devices
فستعمل جميع نسخ Chrome في وضع محاكاة الجوال- إذا قدمت أيضًا متصفحات أخرى غير Chrome، مثل
--devices --browsers=firefox,safari,edge
فسيضيف تلقائيًا Chrome في وضع محاكاة الجوال- سينشئ مشغل Storybook افتراضيًا لقطات عنصر، إذا كنت تريد رؤية لقطة شاشة محاكاة الجوال الكاملة، فقدم
--clip=false
من خلال سطر الأوامر- سيبدو اسم الملف على سبيل المثال مثل
__snapshots__/example/button/desktop_chrome/example-button--large-local-chrome-iPhone-14-Pro-Max-430x932-dpr-3.png
- المصدر: اختبار موقع ويب للجوال على سطح المكتب باستخدام محاكاة الجوال يمكن أن يكون مفيدًا، ولكن يجب أن يكون المختبرون على دراية بوجود العديد من الاختلافات الدقيقة مثل:
- وحدة معالجة رسومات مختلفة تمامًا، مما قد يؤدي إلى تغييرات كبيرة في الأداء؛
- واجهة مستخدم الجوال غير محاكاة (على وجه الخصوص، يؤثر إخفاء شريط عنوان URL على ارتفاع الصفحة)؛
- نافذة منبثقة للتمييز (حيث تحدد أحد أهداف اللمس القليلة) غير مدعومة؛
- العديد من واجهات برمجة التطبيقات للأجهزة (على سبيل المثال، حدث تغيير الاتجاه) غير متوفرة.
--headless
- النوع:
boolean
- إلزامي: لا
- الافتراضي:
true
- مثال:
npx wdio tests/configs/wdio.local.desktop.storybook.conf.ts --storybook --headless=false
- ملاحظة: متاح فقط من خلال سطر الأوامر
هذا سيقوم بتشغيل الاختبارات افتراضيًا في وضع غير مرئي (عندما يدعم المتصفح ذلك) أو يمكن تعطيله
--numShards
- النوع:
number
- إلزامي: لا
- الافتراضي:
true
- مثال:
npx wdio tests/configs/wdio.local.desktop.storybook.conf.ts --storybook --numShards=10
سيكون هذا عدد المثيلات المتوازية التي سيتم استخدامها لتشغيل القصص. سيتم تحديد هذا بواسطة maxInstances
في ملف wdio.conf
الخاص بك.
[!IMPORTANT] عند التشغيل في وضع
headless
، لا تزيد العدد إلى أكثر من 20 لمنع عدم الاستقرار بسبب قيود الموارد
--skipStories
- النوع:
string|regex
- إلزامي: لا
- الافتراضي: null
- مثال:
npx wdio tests/configs/wdio.local.desktop.storybook.conf.ts --storybook --skipStories="/.*button.*/gm"
يمكن أن يكون هذا:
- سلسلة (
example-button--secondary,example-button--small
) - أو تعبير منتظم (
"/.*button.*/gm"
)
لتخطي قصص معينة. استخدم id
الخاص بالقصة التي يمكن العثور عليها في عنوان URL للقصة. على سبيل المثال، id
في عنوان URL هذا http://localhost:6006/?path=/story/example-page--logged-out
هو example-page--logged-out
--url
- النوع:
string
- إلزامي: لا
- الافتراضي:
http://127.0.0.1:6006
- مثال:
npx wdio tests/configs/wdio.local.desktop.storybook.conf.ts --storybook --url="https://example.com"
عنوان URL حيث يتم استضافة مثيل Storybook الخاص بك.
--version
- النوع:
number
- إلزامي: لا
- الافتراضي: 7
- مثال:
npx wdio tests/configs/wdio.local.desktop.storybook.conf.ts --storybook --version=6
هذا هو إصدار Storybook، الافتراضي هو 7
. هذا مطلوب لمعرفة ما إذا كان يجب استخدام clipSelector
الخاص بـ V6.
اختبار التفاعل في Storybook
يسمح لك اختبار التفاعل في Storybook بالتفاعل مع المكون الخاص بك من خلال إنشاء نصوص مخصصة باستخدام أوامر WDIO لوضع المكون في حالة معينة. على سبيل المثال، انظر إلى مقتطف الكود أدناه:
import { browser, expect } from "@wdio/globals";
describe("Storybook Interaction", () => {
it("should create screenshots for the logged in state when it logs out", async () => {
const componentId = "example-page--logged-in";
await browser.waitForStorybookComponentToBeLoaded({ id: componentId });
await expect($("header")).toMatchElementSnapshot(
`${componentId}-logged-in-state`
);
await $("button=Log out").click();
await expect($("header")).toMatchElementSnapshot(
`${componentId}-logged-out-state`
);
});
it("should create screenshots for the logged out state when it logs in", async () => {
const componentId = "example-page--logged-out";
await browser.waitForStorybookComponentToBeLoaded({ id: componentId });
await expect($("header")).toMatchElementSnapshot(
`${componentId}-logged-out-state`
);
await $("button=Log in").click();
await expect($("header")).toMatchElementSnapshot(
`${componentId}-logged-in-state`
);
});
});
يتم تنفيذ اختبارين على مكونين مختلفين. يقوم كل اختبار أولاً بتعيين حالة ثم يلتقط لقطة شاشة. ستلاحظ أيضًا أنه تم تقديم أمر مخصص جديد، والذي يمكن العثور عليه هنا.
يمكن حفظ ملف المواصفات أعلاه في مجلد وإضافته إلى سطر الأوامر باستخدام الأمر التالي:
pnpm run test.local.desktop.storybook.localhost -- --spec='tests/specs/storybook-interaction/*.ts'
سيقوم مشغل Storybook أولاً بمسح مثيل Storybook الخاص بك تلقائيًا ثم إضافة اختباراتك إلى القصص التي تحتاج إلى مقارنة. إذا كنت لا تريد مقارنة المكونات التي تستخدمها لاختبار التفاعل مرتين، يمكنك إضافة عامل تصفية لإزالة القصص "الافتراضية" من المسح عن طريق توفير عامل تصفية --skipStories
. سيبدو هذا كما يلي:
pnpm run test.local.desktop.storybook.localhost -- --skipStories="/example-page.*/gm" --spec='tests/specs/storybook-interaction/*.ts'
أمر مخصص جديد
سيتم إضافة أمر مخصص جديد يسمى browser.waitForStorybookComponentToBeLoaded({ id: 'componentId' })
إلى كائن browser/driver
الذي سيقوم تلقائيًا بتحميل المكون والانتظار حتى ينتهي، حتى لا تضطر إلى استخدام طريقة browser.url('url.com')
. يمكن استخدامه بهذه الطريقة
import { browser, expect } from "@wdio/globals";
describe("Storybook Interaction", () => {
it("should create screenshots for the logged in state when it logs out", async () => {
const componentId = "example-page--logged-in";
await browser.waitForStorybookComponentToBeLoaded({ id: componentId });
await expect($("header")).toMatchElementSnapshot(
`${componentId}-logged-in-state`
);
await $("button=Log out").click();
await expect($("header")).toMatchElementSnapshot(
`${componentId}-logged-out-state`
);
});
it("should create screenshots for the logged out state when it logs in", async () => {
const componentId = "example-page--logged-out";
await browser.waitForStorybookComponentToBeLoaded({ id: componentId });
await expect($("header")).toMatchElementSnapshot(
`${componentId}-logged-out-state`
);
await $("button=Log in").click();
await expect($("header")).toMatchElementSnapshot(
`${componentId}-logged-in-state`
);
});
});
الخيارات هي:
additionalSearchParams
- النوع:
URLSearchParams
- إلزامي: لا
- الافتراضي:
new URLSearchParams()
- مثال:
await browser.waitForStorybookComponentToBeLoaded({
additionalSearchParams: new URLSearchParams({ foo: "bar", abc: "def" }),
id: "componentId",
});
هذا سيضيف معلمات بحث إضافية إلى عنوان URL الخاص بـ Storybook، في المثال أعلاه سيكون عنوان URL http://storybook.url/iframe.html?id=story-id&foo=bar&abc=def
.
راجع وثائق URLSearchParams لمزيد من المعلومات.
clipSelector
- النوع:
string
- إلزامي: لا
- الافتراضي:
#storybook-root > :first-child
لـ Storybook V7 و#root > :first-child:not(script):not(style)
لـ Storybook V6 - مثال:
await browser.waitForStorybookComponentToBeLoaded({
clipSelector: "#your-selector",
id: "componentId",
});
هذا هو المحدد الذي سيتم استخدامه:
- لتحديد العنصر الذي سيتم التقاط لقطة الشاشة له
- للعنصر للانتظار ليكون مرئيًا قبل التقاط لقطة شاشة
id
- النوع:
string
- إلزامي: نعم
- مثال:
await browser.waitForStorybookComponentToBeLoaded({ '#your-selector', id: 'componentId' })
استخدم id
الخاص بالقصة التي يمكن العثور عليها في عنوان URL للقصة. على سبيل المثال، id
في عنوان URL هذا http://localhost:6006/?path=/story/example-page--logged-out
هو example-page--logged-out
timeout
- النوع:
number
- إلزامي: لا
- الافتراضي: 1100 مللي ثانية
- مثال:
await browser.waitForStorybookComponentToBeLoaded({
id: "componentId",
timeout: 20000,
});
الحد الأقصى للمهلة التي نريد الانتظار حتى يكون المكون مرئيًا بعد التحميل على الصفحة
url
- النوع:
string
- إلزامي: لا
- الافتراضي:
http://127.0.0.1:6006
- مثال:
await browser.waitForStorybookComponentToBeLoaded({
id: "componentId",
url: "https://your.url",
});
عنوان URL حيث يتم استضافة مثيل Storybook الخاص بك.
المساهمة
تحديث الحزم
يمكنك تحديث الحزم باستخدام أداة CLI بسيطة. تأكد من تثبيت جميع التبعيات، يمكنك بعد ذلك تشغيل
pnpm update.packages
سيؤدي هذا إلى تشغيل CLI الذي سيطرح عليك الأسئلة التالية
==========================
🤖 Package update Wizard 🧙
==========================
? Which version target would you like to update to? (Minor|Latest)
? Do you want to update the package.json files? (Y/n)
? Do you want to remove all "node_modules" and reinstall dependencies? (Y/n)
? Would you like reinstall the dependencies? (Y/n)
سيؤدي هذا إلى السجلات التالية
افتح لرؤية مثال على السجلات
==========================
🤖 Package update Wizard 🧙
==========================
? Which version target would you like to update to? Minor
? Do you want to update the package.json files? yes
Updating root 'package.json' for minor updates...
Updating packages for minor updates in /Users/wswebcreation/Git/wdio/visual-testing...
Using pnpm
Upgrading /Users/wswebcreation/Git/wdio/visual-testing/package.json
[====================] 38/38 100%
@typescript-eslint/eslint-plugin ^8.7.0 → ^8.8.0
@typescript-eslint/parser ^8.7.0 → ^8.8.0
@typescript-eslint/utils ^8.7.0 → ^8.8.0
@vitest/coverage-v8 ^2.1.1 → ^2.1.2
vitest ^2.1.1 → ^2.1.2
Run pnpm install to install new versions.
Updating packages for minor updates in /Users/wswebcreation/Git/wdio/visual-testing/packages/ocr-service...
Using pnpm
Upgrading /Users/wswebcreation/Git/wdio/visual-testing/packages/ocr-service/package.json
[====================] 11/11 100%
All dependencies match the minor package versions :)
Updating packages for minor updates in /Users/wswebcreation/Git/wdio/visual-testing/packages/visual-reporter...
Using pnpm
Upgrading /Users/wswebcreation/Git/wdio/visual-testing/packages/visual-reporter/package.json
[====================] 11/11 100%
eslint-config-next 14.2.13 → 14.2.14
next 14.2.13 → 14.2.14
Run pnpm install to install new versions.
Updating packages for minor updates in /Users/wswebcreation/Git/wdio/visual-testing/packages/visual-service...
Using pnpm
Upgrading /Users/wswebcreation/Git/wdio/visual-testing/packages/visual-service/package.json
[====================] 5/5 100%
All dependencies match the minor package versions :)
Updating packages for minor updates in /Users/wswebcreation/Git/wdio/visual-testing/packages/webdriver-image-comparison...
Using pnpm
Upgrading /Users/wswebcreation/Git/wdio/visual-testing/packages/webdriver-image-comparison/package.json
[====================] 8/8 100%
All dependencies match the minor package versions :)
? Do you want to remove all "node_modules" and reinstall dependencies? yes
Removing root dependencies in /Users/wswebcreation/Git/wdio/visual-testing...
Removing dependencies in ocr-service...
Removing dependencies in visual-reporter...
Removing dependencies in visual-service...
Removing dependencies in webdriver-image-comparison...
? Would you like reinstall the dependencies? yes
Installing dependencies in /Users/wswebcreation/Git/wdio/visual-testing...
> @wdio/visual-testing-monorepo@ pnpm.install.workaround /Users/wswebcreation/Git/wdio/visual-testing
> pnpm install --shamefully-hoist
Scope: all 5 workspace projects
Lockfile is up to date, resolution step is skipped
Packages: +1274
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 1274, reused 1265, downloaded 0, added 1274, done
dependencies:
- @wdio/ocr-service 2.0.0 <- packages/ocr-service
- @wdio/visual-service 6.0.0 <- packages/visual-service
devDependencies:
- @changesets/cli 2.27.8
- @inquirer/prompts 5.5.0
- @tsconfig/node20 20.1.4
- @types/eslint 9.6.1
- @types/jsdom 21.1.7
- @types/node 20.16.4
- @types/react 18.3.5
- @types/react-dom 18.3.0
- @types/xml2js 0.4.14
- @typescript-eslint/eslint-plugin 8.8.0
- @typescript-eslint/parser 8.8.0
- @typescript-eslint/utils 8.8.0
- @vitest/coverage-v8 2.1.2
- @wdio/appium-service 9.1.2
- @wdio/cli 9.1.2
- @wdio/globals 9.1.2
- @wdio/local-runner 9.1.2
- @wdio/mocha-framework 9.1.2
- @wdio/sauce-service 9.1.2
- @wdio/shared-store-service 9.1.2
- @wdio/spec-reporter 9.1.2
- @wdio/types 9.1.2
- eslint 9.11.1
- eslint-plugin-import 2.30.0
- eslint-plugin-unicorn 55.0.0
- eslint-plugin-wdio 9.0.8
- husky 9.1.6
- jsdom 25.0.1
- pnpm-run-all2 6.2.3
- release-it 17.6.0
- rimraf 6.0.1
- saucelabs 8.0.0
- ts-node 10.9.2
- typescript 5.6.2
- vitest 2.1.2
- webdriverio 9.1.2
. prepare$ husky
└─ Done in 204ms
Done in 9.5s
All packages updated!
الأسئلة
يرجى الانضمام إلى خادم Discord الخاص بنا إذا كانت لديك أي أسئلة أو مشكلات تتعلق بالمساهمة في هذا المشروع. ابحث عن المساهمين في قناة 🙏-contributing
.
المشكلات
إذا كانت لديك أسئلة أو أخطاء أو طلبات ميزات، يرجى تقديم مشكلة. قبل إرسال مشكلة، يرجى البحث في أرشيف المشكلات للمساعدة في تقليل التكرارات، وقراءة الأسئلة الشائعة.
إذا لم تتمكن من العثور عليها هناك، يمكنك تقديم مشكلة حيث يمكنك تقديم:
- 🐛تقرير الخطأ: إنشاء تقرير لمساعدتنا في التحسين
- 📖الوثائق: اقتراح تحسينات أو الإبلاغ عن وثائق مفقودة/غير واضحة.
- 💡طلب ميزة: اقتراح فكرة لهذه الوحدة.
- 💬سؤال: طرح أسئلة.
سير عمل التطوير
لإنشاء PR لهذا المشروع والبدء في المساهمة، اتبع هذا الدليل خطوة بخطوة:
-
قم بعمل fork للمشروع.
-
استنسخ المشروع في مكان ما على جهاز الكمبيوتر الخاص بك
$ git clone https://github.com/webdriverio/visual-testing.git
-
انتقل إلى الدليل وقم بإعداد المشروع
$ cd visual-testing
$ corepack enable
$ pnpm pnpm.install.workaround -
قم بتشغيل وضع المراقبة الذي سيقوم تلقائيًا بترجمة الكود
$ pnpm watch
لبناء المشروع، قم بتشغيل:
$ pnpm build
-
تأكد من أن تغييراتك لا تكسر أي اختبارات، قم بتشغيل:
$ pnpm test
يستخدم هذا المشروع changesets لإنشاء سجلات التغييرات والإصدارات تلقائيًا.
الاختبار
يجب تنفيذ العديد من الاختبارات ليكون قادرًا على اختبار الوحدة. عند إضافة PR، يجب أن تجتاز جميع الاختبارات على الأقل الاختبارات المحلية. يتم اختبار كل PR تلقائيًا مقابل Sauce Labs، انظر خط أنابيب GitHub Actions. قبل الموافقة على PR، سيقوم المساهمون الأساسيون باختبار PR مقابل المحاكيات/محاكيات الأجهزة / الأجهزة الحقيقية.
الاختبار المحلي
أولاً، يجب إنشاء خط أساس محلي. يمكن القيام بذلك باستخدام:
// With the webdriver protocol
$ pnpm run test.local.init
سيقوم هذا الأمر بإنشاء مجلد يسمى localBaseline
الذي سيحتفظ بجميع صور الخط الأساسي.
ثم قم بتشغيل:
// With the webdriver protocol
pnpm run test.local.desktop
سيقوم هذا بتشغيل جميع الاختبارات على جهاز محلي على Chrome.
اختبار مشغل Storybook المحلي (تجريبي)
أولاً، يجب إنشاء خط أساس محلي. يمكن القيام بذلك باستخدام:
pnpm run test.local.desktop.storybook
سيقوم هذا بإجراء اختبارات Storybook باستخدام Chrome في وضع headless مقابل مستودع Storybook التجريبي الموجود في https://govuk-react.github.io/govuk-react/.
لتشغيل الاختبارات باستخدام المزيد من المتصفحات، يمكنك تشغيل
pnpm run test.local.desktop.storybook -- --browsers=chrome,firefox,edge,safari
[!NOTE] تأكد من تثبيت المتصفحات التي تريد التشغيل عليها على جهازك المحلي
اختبار CI مع Sauce Labs (غير مطلوب لـ PR)
يتم استخدام الأمر أدناه لاختبار البناء على GitHub Actions، يمكن استخدامه هناك فقط وليس للتطوير المحلي.
$ pnpm run test.saucelabs
سيختبر مقابل الكثير من التكوينات التي يمكن العثور عليها هنا. يتم فحص جميع PRs تلقائيًا مقابل Sauce Labs.
الإصدار
لإصدار إصدار من أي من الحزم المذكورة أعلاه، قم بما يلي:
- تشغيل خط أنابيب الإصدار
- يتم إنشاء PR للإصدار، اطلب مراجعته والموافقة عليه من قبل عضو آخر في WebdriverIO
- قم بدمج PR
- تشغيل خط أنابيب الإصدار مرة أخرى
- يجب إصدار إصدار جديد 🎉
الائتمانات
يستخدم @wdio/visual-testing
ترخيصًا مفتوح المصدر من LambdaTest وSauce Labs.