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

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

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

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

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

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

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: برمجة واجهة المستخدم في Chrome

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

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.

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