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

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

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

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

لتفعيل محاكاة الأجهزة الجوّالة باستخدام اسم جهاز معيّن، يجب أن يحتوي قاموس "mobileEmulation" على "deviceName". استخدِم اسم جهاز صالحًا من لوحة محاكاة أدوات مطوّري البرامج كقيمة للسمة "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())

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

من الممكن أيضًا تمكين محاكاة الأجهزة الجوّالة من خلال تحديد سمات فردية. ولتفعيل محاكاة الأجهزة الجوّالة بهذه الطريقة، يمكن أن يتضمّن قاموس "mobileEmulation" قواميس "deviceMetrics" و "clientHints" وسلسلة "userAgent". يجب تحديد مقاييس الجهاز التالية في قاموس "deviceMetrics":

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

يمكن أن يحتوي قاموس "clientHints" على الإدخالات التالية:

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

بإمكان ChromeDriver استنتاج القيمة "userAgent" من "clientHints" على الأنظمة الأساسية التالية: "Android" و"Chrome OS" و"Chromium OS" و"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
  }
}

الاختلافات بين محاكاة الأجهزة الجوّالة والأجهزة الحقيقية

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

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