The Chromium Chronicle رقم 21: التشغيل التلقائي الشامل لواجهة المستخدم في نظام التشغيل ChromeOS

الحلقة 21: أداء "بريندان هانسكنيشت" في مدينة ماونتن فيو في كاليفورنيا (أيار/مايو 2021)
الحلقات السابقة

في السابق، كانت أتمتة واجهة مستخدم نظام التشغيل ChromeOS في الاختبارات الشاملة (E2E) على مستوى جميع مجموعة الأجهزة أمرًا صعبًا. في Tast، تم إنشاء مكتبة واجهة مستخدم جديدة التي تستخدم شجرة Chrome a11y (إمكانية الوصول) للتحكّم في واجهة مستخدم ChromeOS. This تمكّن المطوّرين من إنشاء اختبارات E2E بسهولة مقابل أي مساحة عرض واجهة المستخدم (واجهة مستخدم الكمبيوتر المكتبي على نظام التشغيل ChromeOS، والتطبيقات الأصلية، وتطبيقات الويب، وواجهة مستخدم متصفّح Chrome)

تحتوي المكتبة على طريقة بسيطة وسلسلة لوصف كيفية العثور على عنصر واجهة مستخدم. على سبيل المثال، يمكن تحديد مجلد عمليات التنزيل في تطبيق "الملفات" على النحو التالي:

filesWindow := nodewith.NameStartingWith("Files")
  .ClassName("RootView").Role(role.Window)
downloadsButton := nodewith.Name("Downloads")
  .Role(role.TreeItem).Ancestor(filesWindow)

وبمجرد تحديد باحث عن العقدة، يمكن التفاعل مع العقدة بعدة طرق. بدءًا من النقرات البسيطة إلى انتظار التركيز، تعرض واجهة المستخدم وصولًا مستقرًا إلى العديد من العمليات. على سبيل المثال، إلى اليمين وانقر على مجلد عمليات التنزيل (Downloads) وانقر بزر الماوس الأيسر على زر النسخ، يمكنك كتابة:

ui := uiauto.New(tconn)
if err := uiauto.Combine("copy downloads",
  ui.RightClick(downloadsButton),
  ui.LeftClick(nodewith.Name("Copy").Role(role.MenuItem)),
)(ctx); err != nil { /* do error handling */ }

هناك برامج تضمين حالية حول المناطق الشائعة لواجهة المستخدم (الإعدادات، ومشغِّل التطبيقات وتطبيق الملفات وما إلى ذلك).

تستخدم الدالة uiauto.Run المستخدمة أعلاه قائمة بالإجراءات. في هذه الدورة، السياق، الإجراء هو مجرد func(context.Context) error. باستخدام بسيطة، يمكن الخلط بين أنواع أخرى من الإجراءات مع إجراءات واجهة المستخدم. على سبيل المثال، يعد استخدام لوحة المفاتيح أمرًا سهلاً مثل:

if err := uiauto.Combine("do some random stuff",
  ui.FocusAndWait( /* some text field */ ),
  kb.TypeAction("Hello, world!"),
  kb.AccelAction("Enter"),
  func(ctx context.Context) error {
    // My custom action!
  },
)(ctx); err != nil { /* do error handling */ }

للحصول على دليل أكثر تفصيلاً، يمكنك الاطّلاع على الدرس التطبيقي حول الترميز: Tast Codes: Chrome UI Automation

عند كتابة هذه الاختبارات، من المفيد جدًا تفريغ شجرة "a11y" في Chrome لتصحيح الأخطاء. ما عليك سوى إضافة الرمز التالي للقيام بذلك:

defer faillog.DumpUITreeOnError(ctx, s.OutDir(), s.HasError, tconn)
s.Fatal("I would like to see the ui tree here")

سيتم الآن تخزين شجرة a11y مع سجلّات التذوّق الأخرى باسم faillog/ui_tree.txt.

إذا كانت لديك أي أسئلة، تواصَل مع مجموعة المستخدمين الأكثر أذواقًا.