جعل وكلاء الذكاء الاصطناعي يفهمون الشاشة: الدليل العملي لتصميم Semantics في Jetpack Compose
مقدمة
لجعل وكلاء الذكاء الاصطناعي وأدوات أتمتة الاختبار في Jetpack Compose يفهمون بدقة "ماذا يفعل هذا الزر"، فإن التصميم الصحيح لـ Semantics هو المفتاح.
يمتلك Compose داخلياً "Semantics Tree"، وهو يعمل كبنية دلالية تستعين بها إمكانية الوصول وUIAutomator وأدوات الذكاء الاصطناعي للتشغيل التلقائي (مثل Appium/UIAutomator/MCP). إنه يشبه ARIA و DOM في الويب.
الخصائص الرئيسية لـ Semantics
contentDescription
أساسي لإضافة معنى للأزرار التي تحتوي على أيقونات فقط.
IconButton(
onClick = onDelete,
modifier = Modifier.semantics {
contentDescription = "حذف"
}
) {
Icon(Icons.Default.Delete, contentDescription = null)
}
يتعرف عليه الذكاء الاصطناعي وإمكانية الوصول كـ "زر حذف · قابل للنقر · دور Button".
role
يحدد نوع واجهة المستخدم للعنصر المخصص. مجرد Box(clickable) سيكون "شيء ما قابل للنقر"، لكن إضافة role يوضح المعنى كـ Button أو Switch أو Checkbox أو Tab.
Modifier.semantics {
role = Role.Button
}
stateDescription
يُعلم الذكاء الاصطناعي بالحالة الحالية لواجهة المستخدم.
Modifier.semantics {
stateDescription =
if (subscribed) "مشترك"
else "غير مشترك"
}
testTag
المعرّف الأهم لـ MCP وAppium ووكلاء واجهة المستخدم التلقائية. يتيح تعريفاً مستقراً لا يعتمد على الإحداثيات أو OCR أو تغييرات النص.
Modifier.testTag("login_button")
الإعداد للتكامل مع UIAutomator
لا ينشئ Compose تسلسلاً هرمياً مباشراً للـ View، لذا قد لا يرى UIAutomator الـ testTag. يمكن حل ذلك بإضافة ما يلي إلى الجذر:
Scaffold(
modifier = Modifier.semantics {
testTagsAsResourceId = true
}
)
سيُتعرف على testTag كـ resource-id ويمكن استرداده مباشرةً من UIAutomator.
نمط التنفيذ الأكثر وضوحاً للذكاء الاصطناعي
أفضل الممارسات هي دمج خصائص متعددة.
Button(
onClick = login,
modifier = Modifier
.testTag("login_button")
.semantics {
contentDescription = "تسجيل الدخول"
role = Role.Button
}
) {
Text("تسجيل الدخول")
}
| الخاصية | فهم الذكاء الاصطناعي |
|---|---|
| testTag | التعريف الفريد |
| contentDescription | فهم المعنى |
| role | فهم نوع واجهة المستخدم |
| clickable | فهم إمكانية التنفيذ |
دمج واجهة مستخدم معقدة في معنى واحد
عند الرغبة في عرض تركيبة معقدة من أيقونات ونصوص و Badge للذكاء الاصطناعي كزر واحد، استخدم clearAndSetSemantics.
Modifier.clearAndSetSemantics {
contentDescription = "إضافة المنتج إلى السلة"
role = Role.Button
}
يمكن تجاهل البنية المتداخلة الداخلية ومجموعات الأيقونات، وتمرير المعنى فقط إلى الذكاء الاصطناعي.
ما يمكن تحقيقه بتصميم Semantics
استقرار التشغيل التلقائي
بوجود testTag، يمكن التشغيل المستقر دون إحداثيات أو OCR. حتى بعد إعادة تصميم واجهة المستخدم، لن تتعطل الأتمتة طالما ظل testTag كما هو. كما تتحسن مقاومة التعامل مع اللغات المتعددة.
تقليل عدد الرموز (Tokens)
عند الاعتماد على لقطات الشاشة فقط، يحتاج تحليل الصور إلى رموز ضخمة، لكن مع Semantics Tree يمكن معالجة البيانات كبيانات منظمة خفيفة.
[
{"type": "Button", "label": "تسجيل الدخول"},
{"type": "TextField", "label": "البريد الإلكتروني"},
{"type": "TextField", "label": "كلمة المرور"}
]
فعّال بشكل خاص في عمليات التشغيل التلقائي الطويلة وتحليل الشاشات الواسعة، ويساهم في منع context overflow.
فهم الذكاء الاصطناعي للحالة
بفضل stateDescription، يمكن للذكاء الاصطناعي تقدير الحالة الحالية للشاشة واتخاذ قرارات مثل "الوضع الحالي متوقف، إذن دعني أضغط زر التشغيل". يمكّن هذا من فهم الشاشة كآلة حالة.
التحليل المنظم في تكامل MCP
بجلب Semantics Tree عبر MCP Server وتمريره إلى LLM Agent، يصبح فهم معنى الشاشة كاملاً وتقدير مرشحي العمليات التالية وتحليل انتقالات الحالة ممكناً.
Compose UI → Semantics Tree → MCP Server → LLM Agent
ملخص استخدام خصائص Semantics
| الخاصية | الاستخدام |
|---|---|
| testTag | التعريف الفريد |
| contentDescription | المعنى |
| role | نوع واجهة المستخدم |
| stateDescription | الحالة |
| collectionInfo | بنية القائمة |
| traversalIndex | ترتيب التنقل |
| customActions | عمليات مخصصة للذكاء الاصطناعي |
خلاصة
Compose يمكّن من فصل "المظهر" عن "المعنى". جوهر تصميم Semantics هو القدرة على تصميم واجهة المستخدم للإنسان وبنية المعنى للذكاء الاصطناعي بشكل مستقل.
إذا كنت ستستخدم وكلاء الذكاء الاصطناعي وMCP وUIAutomator والاختبارات التلقائية E2E، فإن التوحيد القياسي التالي لكل مكوّن يوفر عائداً عالياً على الاستثمار:
Modifier
.testTag(...)
.semantics {
contentDescription = ...
role = ...
}
تمرير "ما هو هذا الزر · ماذا يحدث عند الضغط · ما هي الحالة الآن" عبر Semantics بدلاً من اللون والموضع والحجم — هذا هو جوهر تصميم واجهة المستخدم المتوافقة مع الذكاء الاصطناعي.