محاكاة الأجهزة الجوّالة

يسمح متصفّح Chrome للمستخدمين بمحاكاة Chrome على جهاز جوّال من إصدار Chrome المخصّص للكمبيوتر المكتبي، وذلك من خلال تفعيل وضع الجهاز باستخدام "أدوات مطوّري البرامج في Chrome". تؤدي هذه الميزة إلى تسريع تطوير الويب، وتسمح للمطوّرين باختبار كيفية معالجة موقع إلكتروني على جهاز جوّال بسرعة، بدون الحاجة إلى جهاز حقيقي. يمكن لواجهة ChromeDriver محاكاة الأجهزة أيضًا باستخدام ميزة "mobileEmulation"، التي يتم تحديدها باستخدام قيمة قائمة.

كما هو الحال في "أدوات مطوّري البرامج"، تتوفّر طريقتان في ChromeDriver لتفعيل ميزة "محاكاة الأجهزة الجوّالة":

  • تحديد جهاز معروف
  • تحديد سمات الأجهزة الفردية

يعتمد تنسيق معجم mobileEmulation على الطريقة المطلوبة.

تحديد جهاز جوّال معروف

لتفعيل محاكاة الجهاز باستخدام جهاز معيّن، يجب أن يحتوي معجم mobileEmulation على deviceName. استخدِم اسم جهاز صالحًا من إعدادات الأجهزة المحاكية في DevTools كقيمة لسمة deviceName.

لقطة شاشة لإعدادات "الأجهزة"

Java

Map<String, String> mobileEmulation = new HashMap<>();
mobileEmulation.put("deviceName", "Nexus 5");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setExperimentalOption("mobileEmulation", mobileEmulation);
WebDriver driver = new ChromeDriver(chromeOptions);

Ruby

mobile_emulation = { "deviceName" => "Nexus 5" }
caps = Selenium::WebDriver::Remote::Capabilities.chrome(
   "chromeOptions" => { "mobileEmulation" => mobile_emulation })
driver = Selenium::WebDriver.for :remote, url: 'http://localhost:4444/wd/hub',
desired_capabilities: caps

Python

from selenium import webdriver
mobile_emulation = { "deviceName": "Nexus 5" }
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities = chrome_options.to_capabilities())

مصدر الأجهزة المعروفة

يتم إنشاء قائمة الأجهزة المعروفة من لوحة المحاكاة في "أدوات مطوّري البرامج". ومع ذلك، يمكنك استخدام إصدار مختلف من ChromeDriver مع إصدار Chrome يحتوي على قائمة أحدث أو أقدم من الأجهزة.

إذا حاولت استخدام اسم جهاز لا يتعرّف عليه ChromeDriver، ستظهر لك رسالة خطأ مفادها: "يجب أن يكون <your device name> جهازًا صالحًا". لمحاكاة جهاز لا يعرفه ChromeDriver، فعِّل ميزة "محاكاة الأجهزة الجوّالة" باستخدام قياسات الجهاز الفردي.

تحديد سمات الأجهزة الفردية

يمكنك تفعيل ميزة "محاكاة الأجهزة الجوّالة" من خلال تحديد سمات فردية. يمكن أن يحتوي القاموس "mobileEmulation" على قواميس deviceMetrics وclientHints وسلسلة userAgent.

يجب تحديد مقاييس الجهاز التالية في القاموس "deviceMetrics":

  • "width": عرض شاشة الجهاز بالبكسل
  • "height": ارتفاع شاشة الجهاز بالبكسل
  • "pixelRatio": نسبة وحدات البكسل على الجهاز
  • "touch" - ما إذا كان سيتم محاكاة أحداث اللمس تكون القيمة التلقائية هي true، ويمكن عادةً حذفها.
  • "mobile": ما إذا كان يجب أن يتصرّف المتصفّح كوكيل مستخدم على الأجهزة الجوّالة (تداخل أشرطة التمرير، وعرض أحداث الاتجاه، وتصغير المحتوى ليلائم مساحة العرض، وما إلى ذلك) تكون القيمة التلقائية هي true، ويمكن عادةً حذفها.

يمكن أن يتضمّن قاموس "clientHints" الإدخالات التالية:

  • "platform": نظام التشغيل يمكن أن تكون قيمة معروفة ("Android" أو "ChromeOS" أو "ChromiumOS" أو "Fuchsia" أو "Linux" أو "macOS" أو "Windows") تتطابق تمامًا مع القيمة التي يعرضها Chrome الذي يعمل على النظام الأساسي المحدّد، أو يمكن أن تكون قيمة يحدّدها المستخدم. هذه القيمة مطلوبة.
  • "mobile": ما إذا كان المتصفّح سيطلب إصدارًا مخصّصًا للأجهزة الجوّالة أو للكمبيوتر المكتبي من المرجع عادةً ما يضبط Chrome الذي يعمل على هاتف جوّال يعمل بنظام التشغيل Android هذه القيمة على true. يضبط Chrome على جهاز Android لوحي هذه القيمة على "خطأ". يضبط Chrome على جهاز كمبيوتر مكتبي هذه القيمة أيضًا على false. يمكنك استخدام هذه المعلومات لتحديد محاكاة واقعية. هذه القيمة مطلوبة.
  • إنّ الإدخالات المتبقية اختيارية ويمكن حذفها ما لم تكن ذات صلة بالاختبار:
    • "brands": قائمة بأزواج العلامات التجارية / الإصدارات الرئيسية في حال عدم إدخال هذه القيم، سيستخدم المتصفّح قيمه الخاصة.
    • "fullVersionList": قائمة بزوجات العلامة التجارية / الإصدار تم حذف أنّ المتصفّح يستخدم قيمه الخاصة.
    • "platformVersion": إصدار نظام التشغيل القيمة التلقائية هي سلسلة فارغة.
    • "model": طراز الجهاز القيمة التلقائية هي سلسلة فارغة.
    • "البنية": بنية وحدة المعالجة المركزية (CPU). القيم المعروفة هي "x86" و "arm". يُتاح للمستخدم تقديم أي قيمة سلسلة. القيمة التلقائية هي سلسلة فارغة.
    • "bitness": عدد بتات النظام الأساسي القيم المعروفة هي "32" و "64". يُتاح للمستخدم تقديم أي قيمة سلسلة. يتم ضبط القيمة التلقائية على سلسلة فارغة.
    • "wow64": لمحاكاة نظام التشغيل Windows 32 على نظام التشغيل Windows 64 قيمة منطقية تكون القيمة التلقائية لها هي "خطأ".

يمكن لواجهة ChromeDriver استنتاج قيمة "userAgent" من "clientHints" على الأنظمة الأساسية التالية: Android وChromeOS وChromiumOS وFuchsia وLinux وmacOS وWindows. وبالتالي، يمكن حذف هذه القيمة.

في حال حذف قاموس "clientHints" (الوضع القديم)، يبذل ChromeDriver قصارى جهده لاستنتاج "clientHints" من "userAgent". هذه الميزة غير موثوقة، بسبب الغموض الداخلي في تنسيق قيمة "userAgent".

يمكن العثور على الهواتف والأجهزة اللوحية المتوفّرة ضمن لوحة "محاكاة الأجهزة الجوّالة" في رمز مصدر "أدوات مطوّري البرامج".

Java

Map<String, Object> deviceMetrics = new HashMap<>();
deviceMetrics.put("width", 360);
deviceMetrics.put("height", 640);
deviceMetrics.put("pixelRatio", 3.0);
Map<String, Object> mobileEmulation = new HashMap<>();
mobileEmulation.put("deviceMetrics", deviceMetrics);
mobileEmulation.put("userAgent", "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19");
Map<String, Object> clientHints = new HashMap<>();
clientHints.put("platform", "Android");
clientHints.put("mobile", true);
mobileEmulation.put("clientHints", clientHints);
ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.setExperimentalOption("mobileEmulation", mobileEmulation); WebDriver driver = new ChromeDriver(chromeOptions);

Ruby

mobile_emulation = {
   "deviceMetrics" => { "width" => 360, "height" => 640, "pixelRatio" => 3.0 },
   "userAgent" => "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
   "clientHints" => { "platform" => "Android", "mobile" => true}
}
caps = Selenium::WebDriver::Remote::Capabilities.chrome("chromeOptions" => mobile_emulation)
driver = Selenium::WebDriver.for :remote, url: 'http://localhost:4444/wd/hub', desired_capabilities: caps

Python

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
mobile_emulation = {
   "deviceMetrics": { "width": 360, "height": 640, "pixelRatio": 3.0 },
   "userAgent": "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
   "clientHints": {"platform": "Android", "mobile": True} }
chrome_options = Options()
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome(chrome_options = chrome_options)

JSON

مثال على إعداد محاكاة الأجهزة الجوّالة بالكامل:

"mobileEmulation": {
  "userAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/111.0.0.0 Mobile Safari/537.36",
  "deviceMetrics": {
     "mobile": true,
     "touch": true,
     "width": 412,
     "height": 823,
     "pixelRatio": 1.75
  },
  "clientHints": {
     "brands": [
        {"brand": "Google Chrome", "version": "111"},
        {"brand": "Chromium", "version": "111"}
     ],
     "fullVersionList": [
        {"brand": "Google Chrome", "version": "111.0.5563.64"},
        {"brand": "Chromium", "version": "111.0.5563.64"}
     ],
     "platform": "Android",
     "platformVersion": "11",
     "architecture": "arm",
     "model": "lorem ipsum (2022)"
     "mobile": true,
     "bitness": "32",
     "wow64": false
  }
}

محاكاة الأجهزة الجوّالة مقارنةً بالأجهزة الحقيقية

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

  • غالبًا ما تتضمّن الأجهزة الجوّالة وحدة معالجة رسومات مختلفة، ما قد يؤدي إلى تغييرات كبيرة في الأداء.
  • لا يتم محاكاة واجهة المستخدم المخصّصة للأجهزة الجوّالة (على وجه الخصوص، يؤثّر إخفاء شريط العناوين في ارتفاع الصفحة).
  • لا تتوفّر النوافذ المنبثقة لإزالة الالتباس (حيث يمكنك اختيار أحد أهداف اللمس القليلة).
  • لا تتوفّر العديد من واجهات برمجة التطبيقات للأجهزة (مثل حدث orientationchange).