اختبار بصري
ماذا يمكنه أن يفعل؟
يوفر WebdriverIO مقارنات الصور على الشاشات والعناصر أو الصفحة الكاملة لـ
- 🖥️ متصفحات سطح المكتب (كروم / فايرفوكس / سفاري / مايكروسوفت إيدج)
- 📱 متصفحات الجوال / الأجهزة اللوحية (كروم على محاكيات أندرويد / سفاري على محاكيات iOS / المحاكيات / الأجهزة الحقيقية) عبر Appium
- 📱 التطبيقات الأصلية (محاكيات أندرويد / محاكيات iOS / الأجهزة الحقيقية) عبر Appium (🌟 جديد 🌟)
- 📳 التطبيقات الهجينة عبر Appium
من خلال @wdio/visual-service
وهي خدمة خفيفة الوزن لـ WebdriverIO.
هذا يسمح لك بـ:
- حفظ أو مقارنة الشاشات/العناصر/الصفحة الكاملة مقابل خط أساس
- إنشاء خط أساس تلقائياً عندما لا يكون هناك خط أساس
- حظر مناطق مخصصة وحتى استبعاد تلقائي لشريط الحالة و/أو شريط الأدوات (للجوال فقط) أثناء المقارنة
- زيادة أبعاد لقطات شاشة العناصر
- إخفاء النص أثناء مقارنة الموقع لـ:
- تحسين الاستقرار ومنع تقلب عرض الخطوط
- التركيز فقط على تخطيط الموقع
- استخدام طرق مقارنة مختلفة ومجموعة من المطابقات الإضافية لاختبارات أكثر قابلية للقراءة
- التحقق من كيفية دعم موقعك للتنقل باستخدام لوحة المفاتيح، انظر أيضًا التنقل عبر موقع الويب
- وأكثر من ذلك بكثير، راجع خيارات الخدمة وخيارات الطريقة
الخدمة هي وحدة خفيفة الوزن لاسترداد البيانات ولقطات الشاشة المطلوبة لجميع المتصفحات/الأجهزة. قوة المقارنة تأتي من ResembleJS. إذا كنت ترغب في مقارنة الصور عبر الإنترنت، يمكنك التحقق من الأداة عبر الإنترنت.
يمكن استخدام الطرق saveScreen
، saveElement
، checkScreen
، checkElement
والمطابقات toMatchScreenSnapshot
وtoMatchElementSnapshot
للتطبيقات/السياقات الأصلية.
يرجى استخدام الخاصية isHybridApp:true
في إعدادات الخدمة الخاصة بك عندما تريد استخدامها للتطبيقات الهجينة.
التثبيت
الطريقة الأسهل هي الاحتفاظ بـ @wdio/visual-service
كتبعية تطوير في ملف package.json
الخاص بك، عبر:
npm install --save-dev @wdio/visual-service
الاستخدام
يمكن استخدام @wdio/visual-service
كخدمة عادية. يمكنك إعدادها في ملف التكوين الخاص بك على النحو التالي:
import path from "node:path";
// wdio.conf.ts
export const config = {
// ...
// =====
// Setup
// =====
services: [
[
"visual",
{
// بعض الخيارات، راجع المستندات للمزيد
baselineFolder: path.join(process.cwd(), "tests", "baseline"),
formatImageName: "{tag}-{logName}-{width}x{height}",
screenshotPath: path.join(process.cwd(), "tmp"),
savePerInstance: true,
// ... المزيد من الخيارات
},
],
],
// ...
};
يمكن العثور على المزيد من خيارات الخدمة هنا.
بمجرد إعدادها في تكوين WebdriverIO الخاص بك، يمكنك المضي قدمًا وإضافة تأكيدات بصرية إلى اختباراتك.
القدرات
لاستخدام وحدة الاختبار البصري، لا تحتاج إلى إضافة أي خيارات إضافية إلى قدراتك. ومع ذلك، في بعض الحالات، قد ترغب في إضافة بيانات وصفية إضافية إلى اختباراتك البصرية، مثل logName
.
يتيح لك logName
تعيين اسم مخصص لكل قدرة، والتي يمكن تضمينها بعد ذلك في أسماء ملفات الصور. هذا مفيد بشكل خاص لتمييز لقطات الشاشة التي تم التقاطها عبر متصفحات أو أجهزة أو تكوينات مختلفة.
لتمكين ذلك، يمكنك تحديد logName
في قسم capabilities
والتأكد من أن خيار formatImageName
في خدمة الاختبار البصري يشير إليه. هذه هي الطريقة التي يمكنك بها إعداده:
import path from "node:path";
// wdio.conf.ts
export const config = {
// ...
// =====
// Setup
// =====
capabilities: [
{
browserName: 'chrome',
'wdio-ics:options': {
logName: 'chrome-mac-15', // اسم سجل مخصص لـ Chrome
},
}
{
browserName: 'firefox',
'wdio-ics:options': {
logName: 'firefox-mac-15', // اسم سجل مخصص لـ Firefox
},
}
],
services: [
[
"visual",
{
// بعض الخيارات، راجع المستندات للمزيد
baselineFolder: path.join(process.cwd(), "tests", "baseline"),
screenshotPath: path.join(process.cwd(), "tmp"),
// التنسيق أدناه سيستخدم `logName` م ن القدرات
formatImageName: "{tag}-{logName}-{width}x{height}",
// ... المزيد من الخيارات
},
],
],
// ...
};
كيف يعمل
-
إعداد
logName
:- في قسم
capabilities
، قم بتعيينlogName
فريد لكل متصفح أو جهاز. على سبيل المثال،chrome-mac-15
يحدد الاختبارات التي تعمل على Chrome على نظام macOS الإصدار 15.
- في قسم
-
تسمية الصورة المخصصة:
-
يدمج خيار
formatImageName
الـlogName
في أسماء ملفات لقطة الشاشة. على سبيل المثال، إذا كانتtag
هي homepage والدقة هي1920x1080
، فقد يبدو اسم الملف الناتج كما يلي:homepage-chrome-mac-15-1920x1080.png
-
-
فوائد التسمية المخصصة:
- يصبح التمييز بين لقطات الشاشة من متصفحات أو أجهزة مختلفة أسهل بكثير، خاصة عند إدارة خطوط الأساس وتصحيح الاختلافات.
-
ملاحظة حول الإعدادات الافتراضية:
- إذا لم يتم تعيين
logName
في القدرات، فسيظهر خيارformatImageName
كسلسلة فارغة في أسماء الملفات (homepage--15-1920x1080.png
)
- إذا لم يتم تعيين
MultiRemote لـ WebdriverIO
نحن ندعم أيضًا MultiRemote. لجعل هذا يعمل بشكل صحيح تأكد من إضافة wdio-ics:options
إلى
القدرات الخاصة بك كما يمكنك أن ترى أدناه. هذا سيضمن أن كل لقطة شاشة سيكون لها اسم فريد خاص بها.
كتابة اختباراتك لن تكون مختلفة مقارنة باستخدام testrunner
// wdio.conf.js
export const config = {
capabilities: {
chromeBrowserOne: {
capabilities: {
browserName: "chrome",
"goog:chromeOptions": {
args: ["disable-infobars"],
},
// هذا!!!
"wdio-ics:options": {
logName: "chrome-latest-one",
},
},
},
chromeBrowserTwo: {
capabilities: {
browserName: "chrome",
"goog:chromeOptions": {
args: ["disable-infobars"],
},
// هذا!!!
"wdio-ics:options": {
logName: "chrome-latest-two",
},
},
},
},
};
التشغيل برمجيًا
فيما يلي مثال بسيط لكيفية استخدام @wdio/visual-service
عبر خيارات remote
:
import { remote } from "webdriverio";
import VisualService from "@wdio/visual-service";
let visualService = new VisualService({
autoSaveBaseline: true,
});
const browser = await remote({
logLevel: "silent",
capabilities: {
browserName: "chrome",
},
});
// "ابدأ" الخدمة لإضافة الأوامر المخصصة إلى `browser`
visualService.remoteSetup(browser);
await browser.url("https://webdriver.io/");
// أو استخدم هذا لحفظ لقطة شاشة فقط
await browser.saveFullPageScreen("examplePaged", {});
// أو استخدم هذا للتحقق. لا يلزم الجمع بين الطريقتين، راجع الأسئلة الشائعة
await browser.checkFullPageScreen("examplePaged", {});
await browser.deleteSession();