حدد جواب الحوار قبل النقر.
تعامل مع التأكيد الأصلي عمدا ثم تحقق مما يغيره القبول والإلغاء فعليا.

طبعة مترجمة. تظل المعرفات الفنية في شكلها الأصلي.

ينقر الاختبار على إزالة المسودة التجريبية. يظهر تأكيد المتصفح. يسجل المستمع الرسالة ولا يفعل شيئا بعدها. لا ينتهي النقر لأن التطبيق ينتظر جوابا، لا مهلة أخرى. مراقبة الحوار دون الإجابة قد توقف رحلة بسيطة.
يتبع هذا الدليل توثيق الحوارات في Playwright باستخدام مسودة محلية مختلقة. لا يحذف مستندا حقيقيا ولا يرسل طلبا إلى خادم. يفحص جوابي confirm ونتيجتيهما المرئيتين. نختار سياسة الجواب قبل فتح الحوار.
التأكيد الأصلي ليس نافذة من الصفحة
حوار JavaScript confirm جزء من واجهة المتصفح، لا عنصر HTML يمكن أن ينقره getByRole. تختلف النافذة التي يصممها التطبيق؛ فقد تملك دور حوار وأزرارا عادية. حدد الآلية أولا.
يرفض Playwright الحوارات الأصلية تلقائيا دون مستمع. عند تسجيل مستمع يجب عليه القبول أو الرفض. تسجيل الرسالة فقط قد يحجب الإجراء. لهذا يمكن أن تغير إضافة سجل للتشخيص سلوك الاختبار.
سجل الجواب قبل الإجراء
ثبت المعالج قبل النقر. استخدم مستمعا لمرة واحدة عندما تتوقع حوارا واحدا، واجعل الجواب المختار واضحا في الكود. في حالة الإلغاء نحافظ على المسودة:
let observed;
page.once('dialog', async dialog => {
observed = { type: dialog.type(), message: dialog.message() };
await dialog.dismiss();
});
await page.getByRole('button', { name: 'Remove demo draft' }).click();
expect(observed).toEqual({ type: 'confirm', message: 'Remove demo draft?' });
await expect(page.getByRole('status')).toHaveText('Demo draft kept');يفترض المثال الصفحة المضبوطة واستيراد expect. يجيب المعالج أولا ثم يفحص الاختبار النوع والرسالة بعد النقر. يمنع ذلك بقاء حوار مفتوح لأن فحصا داخل المعالج أخفق قبل الإجابة.
لحالة قبول مصرح بها، أضف معالجا جديدا يستدعي accept() وكرر على مثال جديد ثم افحص الحالة المحلية. لا تعمم مستمعا يقبل كل الحوارات على رحلات أخرى. قد يطلب تأكيد لاحق إجراء تدميريا مختلفا ويحصل بصمت على نعم.
يحتاج الإلغاء إلى توقع وظيفي
رفض الحوار يثبت الجواب المرسل، لا احترام التطبيق له. تحقق من بقاء المسودة متاحة ومن عمل الإجراء المفيد التالي. في المنتج الحقيقي أضف دليلا مدعوما على عدم حذف سجل الخادم.
يحتاج القبول إلى الدقة نفسها. اختفاء التأكيد لا يثبت الحذف. حدد السجل المضبوط والبيئة المصرح بها والنتيجة النهائية. المثال يغير حالة مرئية فقط، لذلك لا تثبت لقطته أثرا على الخادم.
يجب أن يؤدي الحوار غير المتوقع إلى إخفاق واضح، لا أن يختفي بفضل معالج واسع. احتفظ بسياق يكفي لفهم الاختلاف دون نشر نص خاص. قد تتضمن الرسائل أسماء سجلات أو تفاصيل حسابات.
ضيق عمر المعالج
يبقى مستمع on() نشطا حتى إزالته أو إغلاق الصفحة. قد يناسب تسلسلا مقصودا، لكن حدد أنواع الحوارات ورسائلها وأجوبتها. يعبر once() عن حالة حوار واحد بشكل أوضح.
تضيف حوارات prompt قيمة إدخال عند القبول. لـ beforeunload معالجة وخيارات إغلاق موثقة خاصة به. لا تفترض أن مثال التأكيد يغطيهما. اقرأ API المناسب قبل توسيع المجموعة.
يمكن أن تكون ملاحظة النتيجة قصيرة: الرسالة المتوقعة، الإلغاء يحافظ، القبول المصرح به يزيل، ودليل الخادم منفصل. هذا أنفع من تسجيل وقت ظهور الحوار وحده.
يصف AnyTest اختبارات قابلة للمراجعة بعد استكشاف التطبيق. اسأل هل تجيب الرحلة عن التأكيد المتوقع أم تقبل كل ما يظهر. لا ندعي ميزة حوارات معينة في AnyTest. تحمي الإجابات المقصودة معنى الاختبار وتحمي الفحوص التالية الوظيفة.
الأسئلة الشائعة
لماذا يعلق النقر عندما يسجل المستمع النص فقط؟
تحجب الحوارات الأصلية تنفيذ الصفحة. يجب أن يقبل المستمع المسجل الحوار أو يرفضه.
هل رفض التأكيد يثبت أن الإلغاء يعمل؟
لا. افحص الحالة المحفوظة وأدلة الخادم عندما تتطلبها الوظيفة الحقيقية.