استخدام Chrome لإصلاح خطأ ملف DevToolsActivePort في السيلينيوم في إجراءات GitHub

استخدام Chrome لإصلاح خطأ ملف DevToolsActivePort في السيلينيوم في إجراءات GitHub
استخدام Chrome لإصلاح خطأ ملف DevToolsActivePort في السيلينيوم في إجراءات GitHub

التغلب على فشل اختبار Chrome في خطوط أنابيب CI/CD

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

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

في هذا الإعداد، يمكن لأصغر اختلال في المحاذاة، مثل عدم تطابق إصدار ChromeDriver، أن يؤدي إلى توقف تنفيذ الاختبار، مما يكلف وقتًا وموارد ثمينة. ولحسن الحظ، فإن فهم المشكلات الأساسية يجعل حلها أسهل بكثير 🛠️.

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

يأمر مثال للاستخدام
CHROME_VERSION="117.0.5938.62" يضبط إصدار Chrome محددًا، وهو ضروري لضمان توافق ChromeDriver أثناء اختبارات CI لمنع عدم التطابق بين Chrome وChromeDriver.
MAJOR_VERSION=$(echo $CHROME_VERSION | cut -d '.' -f1) يستخرج رقم الإصدار الرئيسي من إصدار Chrome الكامل. يُستخدم هذا لتنزيل إصدار مطابق من ChromeDriver، مما يضمن التوافق.
LATEST_DRIVER=$(wget -qO- ...) جلب أحدث إصدار متوافق من ChromeDriver لإصدار Chrome المحدد، وهو أمر ضروري لتجنب أخطاء "DevToolsActivePort" في البرامج النصية للتشغيل الآلي.
if [ -z "$LATEST_DRIVER" ] يتحقق مما إذا كان متغير إصدار ChromeDriver فارغًا، مما يشير إلى وجود خطأ في جلب إصدار متوافق. يساعد هذا الشرط في تطبيق الإجراء الاحتياطي لمنع فشل الاختبار.
sudo dpkg -i $CHROME_DEB يتم تثبيت حزمة Chrome التي تم تنزيلها باستخدام dpkg، وهو أمر مفيد بشكل خاص في بيئات Linux مثل GitHub Actions.
sudo rm -f /usr/local/bin/chromedriver يحذف أي برنامج ChromeDriver تم تثبيته مسبقًا. وهذا يضمن عدم وجود تعارض في الإصدار أثناء التثبيت الجديد.
options.addArguments("--no-sandbox") تعطيل ميزة وضع الحماية في Chrome. يعد هذا مهمًا بشكل خاص في بيئات CI، حيث يمكن أن يمنع وضع الحماية Chrome من بدء التشغيل في وضع مقطوعة الرأس.
options.addArguments("--disable-dev-shm-usage") زيادة الذاكرة المشتركة المتاحة عن طريق تعطيل استخدام /dev/shm، مما قد يمنع تعطل Chrome في البيئات ذات الذاكرة المحدودة، مثل الحاويات.
options.addArguments("--remote-debugging-port=9222") تمكين تصحيح الأخطاء عن بعد على منفذ محدد. يعد هذا أحد متطلبات تشغيل Chrome بدون رأس بشكل صحيح في بعض البيئات، مما يمنع أخطاء "DevToolsActivePort".
driver.quit() يغلق جميع نوافذ Chrome وينهي جلسة WebDriver، مما يؤدي إلى تحرير الموارد. يعد هذا أمرًا ضروريًا في مسارات CI/CD لمنع تسرب الموارد وتجنب نفاد الذاكرة المتوفرة.

الحل التفصيلي لإعداد Chrome وChromeDriver في CI

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

بعد ذلك، يتابع البرنامج النصي تثبيت ChromeDriver المتوافق مع الإصدار عن طريق عزل الإصدار الرئيسي من Chrome (على سبيل المثال، "117" من "117.0.5938.62") باستخدام أمر لتحليله. يسمح هذا للبرنامج النصي بإحضار برنامج ChromeDriver الدقيق المطلوب لهذا الإصدار الرئيسي المحدد باستخدام نمط عنوان URL المصمم لإصدارات ChromeDriver. من خلال التأكد من محاذاة هذه الإصدارات، يمنع الإعداد الإصدارات غير المتطابقة من التسبب في فشل تهيئة ChromeDriver، والذي يؤدي غالبًا إلى ظهور خطأ DevTools. إذا فشل ChromeDriver في تنزيل الإصدار المحدد، يتضمن البرنامج النصي خيارًا احتياطيًا لتنزيل أحدث إصدار، مع الحفاظ على المرونة. تعتبر هذه الخطوات مفيدة بشكل خاص في خطوط أنابيب CI/CD الآلية حيث تكون الحلول السريعة والموثوقة ذات أولوية 🔧.

بعد التنزيل، يقوم البرنامج النصي بحذف أي ChromeDriver تم تثبيته مسبقًا من النظام باستخدام "sudo rm -f" لتجنب التعارض مع برامج التشغيل الأقدم. وهذا يضمن وجود الإصدار الصحيح فقط، مما يقلل من مخاطر تعارضات الإصدار التي يمكن أن تعطل استقرار الاختبار. تم أيضًا تعيين أذونات ChromeDriver لتكون قابلة للتنفيذ، وهي خطوة ضرورية لتشغيل برنامج التشغيل في بيئات CI/CD. يؤدي استخدام Chrome في الوضع "بدون رأس" مع خيارات مثل "--no-sandbox" و"--disable-dev-shm-usage" أيضًا إلى تقليل أثر موارد Chrome. تعمل هذه الخيارات على تمكين الاختبارات من التشغيل في بيئات ذات موارد محدودة (مثل الخوادم السحابية أو خطوط أنابيب CI) دون التسبب في تعطل Chrome، وهو أحد الأسباب الشائعة وراء خطأ DevToolsActivePort.

أخيرًا، في إعداد WebDriver، تضمن خيارات مثل "--disable-gpu" و"-remote-debugging-port=9222" تشغيل Chrome أكثر استقرارًا في الوضع بدون رأس. تعمل العلامة "--disable-gpu" على تعطيل عرض GPU، وهو أمر غير ضروري ويشكل مشكلة في بعض الأحيان في وضع مقطوعة الرأس. وفي الوقت نفسه، يتيح خيار "-remote-debugging-port" لمتصفح Chrome فتح منفذ تصحيح الأخطاء الضروري لاتصال السيلينيوم به في CI. باختصار، يمنع هذا الإعداد اختناقات الأتمتة الشائعة، مما يتيح بيئة اختبار أكثر موثوقية وقوة. ونتيجة لذلك، فإن هذه البرامج النصية تجعل تشغيل Chrome بدون تشغيل على أنظمة CI/CD تجربة أكثر سلاسة، مما يضمن تشغيل الاختبارات التلقائية بشكل متسق دون حدوث عوائق 🚀.

حل الخطأ "ملف DevToolsActivePort غير موجود" في اختبارات السيلينيوم على إجراءات GitHub

الحل 1: البرنامج النصي للتثبيت والتكوين لمتصفح Chrome وChromeDriver

sudo apt-get update
sudo apt-get install -y wget apt-transport-https curl
CHROME_VERSION="117.0.5938.62"
CHROME_DEB="google-chrome-stable_${CHROME_VERSION}-1_amd64.deb"
wget https://mirror.cs.uchicago.edu/google-chrome/pool/main/g/google-chrome-stable/$CHROME_DEB
sudo dpkg -i $CHROME_DEB || sudo apt-get install -f -y
# Install ChromeDriver matching Chrome
sudo apt-get install -y wget unzip
MAJOR_VERSION=$(echo $CHROME_VERSION | cut -d '.' -f1)
LATEST_DRIVER=$(wget -qO- https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$MAJOR_VERSION)
if [ -z "$LATEST_DRIVER" ]; then
  echo "Falling back to latest ChromeDriver version."
  LATEST_DRIVER=$(wget -qO- https://chromedriver.storage.googleapis.com/LATEST_RELEASE)
fi
sudo rm -f /usr/local/bin/chromedriver
wget https://chromedriver.storage.googleapis.com/$LATEST_DRIVER/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver

إعداد WebDriver باستخدام Java لإجراءات GitHub في وضع مقطوعة الرأس

الحل 2: تكوين خيارات Chrome وتهيئة WebDriver في Java

// Import necessary libraries
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import io.github.bonigarcia.wdm.WebDriverManager;
// Set up ChromeDriver
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--headless");
options.addArguments("--disable-gpu");
options.addArguments("--remote-debugging-port=9222");
ChromeDriver driver = new ChromeDriver(options);
// Start Selenium test logic here
driver.quit();

إضافة اختبارات الوحدة للتحقق من توافق Chrome وWebDriver

الحل 3: اختبارات الوحدة لضمان التوافق ومنع الأخطاء أثناء تنفيذ CI

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
class WebDriverTests {
  private WebDriver driver;
  @BeforeEach
  void setUp() {
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--headless");
    options.addArguments("--no-sandbox");
    driver = new ChromeDriver(options);
  }
  @Test
  void testDriverInitialization() {
    driver.get("https://www.google.com");
    assertEquals("Google", driver.getTitle());
  }
  @AfterEach
  void tearDown() {
    driver.quit();
  }
}

تحسين اختبارات السيلينيوم باستخدام إجراءات GitHub وChrome مقطوعة الرأس

جانب واحد مهم من الجري كروم مقطوعة الرأس مع السيلينيوم في خطوط أنابيب CI/CD مثل GitHub Actions هو فهم القيود البيئية. إن تشغيل Chrome في وضع مقطوعة الرأس يعني أنه يعمل بدون واجهة رسومية، مما يجعله مثاليًا لبيئات CI. ومع ذلك، يمكن أن يكون Chrome بدون رأس أكثر حساسية لتكوينات النظام ويتطلب إعدادًا إضافيًا مقارنة بالبيئة المحلية. عادةً ما يرتبط الخطأ "ملف DevToolsActivePort غير موجود" بفشل في تهيئة Chrome، وغالبًا ما يكون ذلك بسبب قيود الذاكرة أو عدم تطابق التكوين. تنفيذ تكوينات موفرة للذاكرة مثل --disable-dev-shm-usage و --لا يوجد رمل يساعد في التغلب على هذه المشكلات ويمكنه تثبيت الاختبارات بشكل كبير في بيئات CI/CD ذات الذاكرة المحدودة.

لضمان التوافق، من الضروري الحفاظ على توافق إصداري Chrome وChromeDriver. تعد الإصدارات غير المتسقة مصدرًا متكررًا للأخطاء في إجراءات GitHub، حيث قد يستخدم المُشغل الإصدار الأحدث افتراضيًا، والذي قد لا يتطابق مع متطلبات ChromeDriver. لمعالجة هذه المشكلة، يتضمن الحل الذي نقدمه تحليل إصدار Chrome الرئيسي لجلب إصدار ChromeDriver الدقيق الذي يتوافق معه، مما يؤدي إلى تحسين الاستقرار. بالإضافة إلى ذلك، الإعداد منفذ التصحيح عن بعد يسمح لـ ChromeDriver بالتفاعل مع المتصفح بشكل أكثر موثوقية من خلال تمكين منفذ الاتصال. يعد هذا الإعداد ضروريًا عند استخدام GitHub Actions أو الأدوات المشابهة للتشغيل الآلي اختبارات المتصفح على الجهاز الظاهري.

تُحدث هذه التكوينات فرقًا كبيرًا في الكفاءة، مما يقلل الأخطاء ويحسن موثوقية عمليات التشغيل الاختبارية. من خلال ضمان خيارات موفرة للموارد واستخدام الإصدارات الصحيحة، من المرجح أن يتم تنفيذ عمليات تشغيل Chrome بدون مراقبة بنجاح، مما يوفر على المطورين من التعامل مع الأخطاء المحبطة في منتصف الاختبار. في النهاية، تعمل التكوينات القوية والتبعيات المتوافقة على جعل تجربة اختبار CI/CD أكثر سلاسة، مما يمكّن المطورين من التركيز على إنشاء تطبيقاتهم وتحسينها دون تعطيل مشكلات الإعداد المستمرة 🚀.

الأسئلة والحلول الشائعة لتشغيل السيلينيوم مع Chrome في إجراءات GitHub

  1. ماذا يعني الخطأ "ملف DevToolsActivePort غير موجود"؟
  2. يحدث هذا الخطأ عندما يفشل Chrome في بدء التشغيل بشكل صحيح في وضع مقطوعة الرأس، وذلك عادةً بسبب عدم تطابق الإعداد أو نقص موارد النظام. ضبط خيارات الذاكرة مثل --disable-dev-shm-usage غالبا ما يحلها.
  3. ما أهمية مطابقة إصدارات Chrome وChromeDriver؟
  4. مطابقة الإصدارات تتجنب أخطاء التوافق. استخدام MAJOR_VERSION=$(echo $CHROME_VERSION | cut -d '.' -f1) ويضمن جلب ChromeDriver المحدد عملهما معًا بسلاسة.
  5. كيف --remote-debugging-port=9222 مساعدة في اختبار مقطوعة الرأس؟
  6. فهو يتيح التحكم في منفذ Chrome بواسطة ChromeDriver، مما يسمح للاختبارات بالاتصال بمثيل المتصفح بشكل أكثر فعالية ومنع أخطاء DevTools.
  7. ماذا يفعل --no-sandbox يفعل؟
  8. يؤدي هذا إلى تعطيل وضع الحماية في Chrome، مما يساعد Chrome على بدء التشغيل في بيئات CI، حيث يمكن أن يؤدي وضع الحماية في بعض الأحيان إلى تعطل Chrome بدون رأس في البيئات المقيدة.
  9. هل هناك بديل إذا فشل تنزيل إصدار ChromeDriver؟
  10. نعم، يتضمن البرنامج النصي الخاص بنا خيارًا احتياطيًا يستخدم --latest_release إذا فشل الإصدار المطابق، فتأكد من توفر ChromeDriver بغض النظر عن إصدار Chrome المثبت.
  11. كيف أتجنب المشكلات المتعلقة بذاكرة Chrome في مسارات CI/CD؟
  12. استخدام --disable-dev-shm-usage يعيد توجيه الذاكرة المشتركة، مما يمنع تعطل Chrome بسبب المساحة المحدودة /dev/shm في بيئات CI.
  13. هل يمكنني تصحيح أخطاء Chrome في وضع مقطوعة الرأس؟
  14. نعم باستخدام --remote-debugging-port ويتيح لك إجراء اختبار محليًا فتح Chrome DevTools لتصحيح الأخطاء في الوضع بدون رأس.
  15. هل يتعامل WebDriverManager مع تحديثات ChromeDriver تلقائيًا؟
  16. يعمل WebDriverManager على تبسيط تحديثات برنامج التشغيل محليًا، ولكن في مسارات CI/CD، يعد إعداد إصدارات محددة، كما هو موضح، أكثر موثوقية للإصدارات القابلة للتكرار.
  17. ما هو الغرض من driver.quit() في البرنامج النصي؟
  18. يقوم هذا الأمر بتحرير الموارد عن طريق إغلاق Chrome وإنهاء جلسة WebDriver، مما يمنع تسرب الذاكرة في بيئات CI/CD.
  19. كيف يمكنني اختبار إعداد السيلينيوم الخاص بي على إجراءات GitHub قبل الالتزام؟
  20. تشغيل الاختبارات محليًا باستخدام headless يمكن للخيارات وتكوينات CI اكتشاف المشكلات قبل الدفع إلى GitHub، مما يجعل تصحيح الأخطاء أسهل.
  21. ما الأذونات التي أحتاجها لبرنامج ChromeDriver في CI؟
  22. يتطلب ChromeDriver أذونات التنفيذ، التي تم تعيينها بواسطة sudo chmod +x /usr/local/bin/chromedriver، لإجراء الاختبارات بنجاح في إجراءات GitHub.

الأفكار النهائية حول تكوين Chrome بدون رأس لاختبارات CI/CD

يؤدي ضمان الإعداد الصحيح لاختبارات السيلينيوم باستخدام Chrome بدون رأس على GitHub Actions إلى توفير الوقت وتعزيز الموثوقية. يمكن أن تؤدي معالجة الأخطاء مثل "ملف DevToolsActivePort غير موجود" إلى جعل اختبار CI/CD أكثر سلاسة وأقل إحباطًا للمطورين.

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

المراجع والمواد المصدرية لاستكشاف مشكلات السيلينيوم وChromeDriver وإصلاحها
  1. دليل تفصيلي لاستكشاف الأخطاء وإصلاحها حول التعامل مع مشكلات DevToolsActivePort في بيئات Chrome بدون رأس لـ CI/CD. وثائق السيلينيوم WebDriver
  2. تعليمات التثبيت والتكوين الشاملة لإصدارات Chrome وChromeDriver في إعدادات التكامل المستمر، مقدمة من توثيق إجراءات جيثب
  3. حل خطوة بخطوة لإعداد ChromeDriver، والتوافق، وخيارات التكوين المتوفرة في وثائق WebDriverManager
  4. مرجع حول أفضل الممارسات لتكوين Chrome بدون رأس لتحسين كفاءة الذاكرة في CI/CD، خاصة في البيئات المقيدة. اقرأ المزيد في دليل مطوري جوجل كروم