Screengrab هي أداة مساعدة من بيئة Fastlane لأتمتة إنشاء لقطات شاشة التطبيقات المحمولة على Android و iOS. بدلاً من التمرير اليدوي عبر الشاشات على عشرات الأجهزة، يقوم المطور بتشغيل أمر واحد، ويقوم Screengrab بالتقاط جميع الشاشات المطلوبة بشكل مستقل. وفقاً لـ Fastlane Docs, 2026، تدعم الأداة ما يصل إلى 30 لغة في نفس الوقت وأي دقات شاشة محددة في التكوين.
النقاط الرئيسية
Screengrab هو مكون من بيئة Fastlane مصمم للإنشاء الآلي للقطات شاشة التطبيقات المحمولة. ظهرت الأداة في عام 2015 كاستجابة للمشكلة: للنشر في Google Play و App Store، يلزم من 4 إلى 10 لقطات لكل لغة. مع دعم 30 لغة، هذا يعني 120–300 لقطة يدوية.
يقوم المطور بتشغيل التطبيق يدوياً على جهاز محاكاة أو جهاز، ويتنقل إلى الشاشة المطلوبة، ويلتقط صورة للشاشة، وينقلها إلى الحاسوب، ويقصها ويحفظها في المجلد الصحيح. تتكرر العملية لكل لغة وكل اتجاه. وفقاً لـ Google Play Console، يتم تحديث التطبيق المتوسط كل أسبوعين، مما يحوّل لقطات الشاشة إلى روتين منتظم.
يحل Screengrab المشكلة بشكل جذري: يصف المطور سيناريوهات الاختبار باستخدام إطار UI (Espresso لـ Android، XCTest لـ iOS)، ويقوم Screengrab بتشغيلها على جميع الأجهزة واللغات المطلوبة تلقائياً. يقوم Fastlane بتنسيق العملية: بناء التطبيق، تشغيل الاختبارات، جمع اللقطات وتعبئتها في هيكل المجلدات المطلوب.
النتيجة — مائة لقطة شاشة في 10–15 دقيقة بدلاً من عدة ساعات من العمل اليدوي. يوصي Google بتحديث لقطات الشاشة مع كل تغيير كبير في واجهة المستخدم، ودون الأتمتة غالباً ما يتم تجاهل هذه النصيحة.
تقوم هيكلة Screengrab على مكونين رئيسيين: عميل على الجهاز (screengrab-lib) ومشغّل يدير تنفيذ الاختبارات وجمع النتائج. على Android، يتم استخدام إطار الاختبارات المأثورة؛ على iOS — XCTest.
يستدعي Fastlane إجراء screengrab، الذي يقرأ ملف التكوين Screengrabfile. يقوم المشغّل ببناء APK الاختبار مع مكتبة screengrab-lib المتصلة، ويثبته على الأجهزة أو المحاكيات المتصلة، ويشغّل اختبارات UI المعلّمة بتعليقات للقطات الشاشة.
# Fastfile — وصف lane للقطات الشاشة
lane :screenshots do
capture_android_screenshots(
output_directory: "fastlane/metadata/android/screenshots",
locales: ["ru-RU", "en-US", "de-DE"],
devices: ["pixel_6", "pixel_tablet"],
use_tests_external_storage: true
)
end
يقوم Screengrab بإنشاء تسلسل هرمي من المجلدات: اللغة → الجهاز → اللقطات. يتطابق الهيكل تماماً مع متطلبات Google Play Console و App Store Connect. يتطلب App Store أحجاماً محددة بالتمام لكل نوع جهاز، ويقوم Screengrab بإنشاء لقطات بالمواصفات المطلوبة بالضبط.
تستطيع الأداة تشغيل الاختبارات بالتوازي على جميع الأجهزة والمحاكيات المتصلة. تبدأ محاكيات Android تلقائياً إذا لم تكن نشطة. بالنسبة لـ iOS، يستخدم Screengrab محاكيات Xcode.
يتكون تثبيت Screengrab من جزئين: إضافة المكتبة إلى المشروع وتكوين ملف التكوين. على Android، يلزم إطار UI Espresso ومكتبة screengrab-lib من مستودع Fastlane.
في build.gradle وحدة التطبيق، تتم إضافة تبعية screengrab-lib. توفر المكتبة فئة ScreenCapturer، التي تلتقط صورة للشاشة في لحظة الاستدعاء.
// build.gradle (module: app)
androidTestImplementation(
'tools.fastlane:screengrab-lib:2.1.0'
)
يتم وسم اختبار UI بتعليق Screengrab.screenshot() في النقاط المطلوبة. يلتقط كل استدعاء الشاشة الحالية ويحفظها بالاسم المحدد.
import tools.fastlane.screengrab.Screengrab
import tools.fastlane.screengrab.locale.LocaleTestRule
class ScreenshotTest {
@get:Rule
val localeTestRule = LocaleTestRule()
@Test
fun testTakeScreenshots() {
Screengrab.screenshot("main_screen")
// الإجراءات: النقر على زر تسجيل الدخول
Screengrab.screenshot("login_screen")
}
}
يخزن ملف Screengrabfile معلمات التشغيل: قائمة الأجهزة، اللغات، المهلات الزمنية ومسار الحفظ. عادةً ما يوجد الملف في مجلد fastlane بجانب Fastfile.
التوطين هو الميزة الرئيسية لـ Screengrab، والسبب الرئيسي لاختياره. تقوم الأداة بتبديل لغة التطبيق تلقائياً قبل كل تشغيل اختبار وتلتقط صوراً للشاشة بجميع اللغات المحددة.
تتم تعيين اللغات في Screengrabfile باستخدام المعلم locales. لكل لغة، يقوم Screengrab بإعادة تثبيت التطبيق مع الموارد المقابلة ويشغّل دورة اختبار كاملة. يقوم LocaleTestRule على Android بتبديل الإعدادات الإقليمية للجهاز تلقائياً.
# Screengrabfile
locales [
"ru-RU",
"en-US",
"de-DE",
"fr-FR",
"es-ES",
"ja-JP",
"ko-KR"
]
يقوم Screengrab بإنشاء الدليلات حسب النمط: screenshots/{locale}/{device_name}/{screenshot_name}.png. يتطابق هذا الهيكل مباشرةً مع متطلبات Google Play، مما يسمح برفع اللقطات عبر Fastlane deliver بأمر واحد.
بالنسبة لـ iOS، يتوقع App Store Connect استقبال اللقطات في هيكل مسطح حسب اللغة. يقوم Fastlane بتحويل تسلسل Screengrab تلقائياً إلى التنسيق المطلوب عند النشر.
يعد التكامل مع CI/CD واحداً من المزايا الرئيسية لـ Screengrab. تعمل الأداة من سطر الأوامر ولا تتطلب واجهة رسومية، مما يجعلها مثالية لبناءات الخادم.
في بيئة CI، يلزم تشغيل محاكي Android أو محاكي iOS، ثم استدعاء lane مع اللقطات. يدعم GitHub Actions التخزين المؤقت لـ AVD، مما يسرع عمليات التشغيل المتكررة.
في تكوين CI، من المهم مراعاة قيود الذاكرة والوقت. تتطلب محاكيات Android على الأقل 2 جيجابايت من ذاكرة RAM للجهاز الواحد، ويستغرق تشغيل كامل على 7 لغات وجهازين ما بين 20–40 دقيقة.
# Fastfile — lane لـ CI مع مهلات زمنية
lane :ci_screenshots do
capture_android_screenshots(
locales: ["en-US", "ru-RU"],
devices: ["pixel_6"],
clear_previous_screenshots: true,
tests_timeout: "600",
output_directory: "screenshots/ci"
)
end
بالنسبة لـ Jenkins، يتم استخدام خطوة sh مع استدعاء bundle exec fastlane. يوصى بتشغيل اللقطات ليلاً أو عن طريق مشغّل بعد الدمج في الفرع الرئيسي لتجنب إبطاء دورة التطوير.
Screengrab ليست الأداة الوحيدة لأتمتة اللقطات. توجد بدائل بأساليب مختلفة: أدوات نظام التشغيل المضمنة، ومنصات تجارية، ومكتبات لقطات في الكود المصدري.
| الأداة | المنصة | التوطين | CI/CD |
|---|---|---|---|
| Screengrab | Android, iOS | تلقائي | مباشر |
| ADB Shell | Android | يدوي | عبر النصوص البرمجية |
| XCTest | iOS | يدوي | عبر xcodebuild |
| Firebase Test Lab | Android | يتطلب إعدادات | نعم |
| Appium | متعدد المنصات | يدوي | عبر WebDriver |
يوفر ADB Shell تحكماً كاملاً، ولكنه يتطلب كتابة نصوص برمجية لكل سيناريو. XCTest مضمن في Xcode، ولكنه لا يدير التوطين تلقائياً. يشغّل Firebase Test Lab الاختبارات على أجهزة حقيقية في السحابة، مما يوفر تغطية قصوى، ولكنه يتقاضى عن كل دقيقة.
يتفوق Screengrab بفضل المزيج: يدير Fastlane دورة حياة البناء بأكملها — من التجميع إلى النشر. يقبل Google Play هيكل مجلدات Screengrab مباشرةً عبر Fastlane deliver.
عند العمل مع Screengrab، يواجه المطورون عادةً عدة مشاكل متكررة. يقلّل معرفة الأخطاء الشائعة من وقت تصحيح الأخطاء في أول تشغيل.
تنشأ المشكلة عندما يقوم Screengrab بالتقاط صورة قبل اكتمال عرض الشاشة. الحل هو إضافة تأخير Thread.sleep() قبل استدعاء screenshot() أو استخدام IdlingResource من Espresso لانتظار العمليات غير المتزامنة.
يجب أن تتوافق إصدار screengrab-lib مع إصدار Fastlane. يتم تحديث Fastlane شهرياً، وقد لا تدعم المكتبة القديمة معلمات تكوين جديدة. الحل هو مزامنة الإصدارات عبر Gemfile و gradle.properties.
يمكن أن يستغرق التشغيل على 30 لغة على 5 أجهزة أكثر من ساعة. الحل هو تقسيم عمليات التشغيل: واحدة للمتجر بجميع اللغات، وأخرى للاحتياجات الداخلية بلغتين. يسمح GitHub Actions باستخدام استراتيجيات مصفوفة للتشغيلات المتوازية.
يتطلب محاكي Android الافتراضية المادية، والتي ليست متوفرة دائماً على خوادم CI. يجب تمكين KVM، وإلا فلن يبدأ المحاكي. الحل هو استخدام صور x86 بدون تسارع GPU أو Firebase Test Lab.
الأسئلة الشائعة
ADB يلتقط ما يظهر على الشاشة في اللحظة الحالية. يتكامل Screengrab مع اختبارات UI، ويبدّل اللغات والأجهزة تلقائياً، ويلتقط سلسلة من اللقطات حسب سيناريو بدون تدخل بشري.
لا، Screengrab هو مكون من بيئة Fastlane ويستخدم بنيته التحتية للبناء والتثبيت والتنسيق. لا يمكن تشغيل مكتبة screengrab-lib بشكل منفصل — يلزم Fastlane كموزع.
على جهاز واحد، يستغرق تشغيل على 10 لغات ما بين 15–25 دقيقة. تتطلب كل لغة إعادة تثبيت التطبيق ودورة اختبار UI كاملة. يقلّل التشغيل المتوازي على أجهزة متعددة الوقت بشكل متناسب.
نعم، يدعم Screengrab iOS عبر XCTest ومحاكيات Xcode. التكوين مماثل لـ Android: تتم إضافة اللغات والأجهزة، وتكتب اختبارات UI بلغة Swift باستخدام XCTest مع التقاط عبر XCUIScreenshot.
لا يدعم Screengrab الوضع التزايدي — يولّد كل تشغيل مجموعة كاملة من اللقطات. يوصى بإعداد lane منفصل لـ CI بقائمة لغات محدودة لتجنب استبدال اللقطات الموجودة من التشغيل الرئيسي.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا