التنفيذ الموازي في Selenium

⚡ ملخص ذكي

الجلسات، والتشغيل المتوازي، والتبعية في Selenium قم بدمج معرف جلسة فريد لكل مثيل من WebDriver مع TestNG تتيح عناصر التحكم في المجموعة تشغيل العديد من نوافذ المتصفح بشكل مستقل أو مرتب في وقت واحد وإنهاء دورة الانحدار بشكل أسرع.

  • 🧩 المبدأ الرئيسي: كل مثيل جديد من WebDriver يقوم بإنشاء sessionId جديد، لذلك لا يتشارك برنامجان تشغيل الأوامر أو ملفات تعريف الارتباط على نفس الجهاز.
  • ⚙️ التنفيذ: قم بتعيين parallel="methods" (أو الاختبارات، أو الفئات، أو النسخ) بالإضافة إلى عدد الخيوط على TestNG يُستخدم وسم suite في ملف testng.xml لتوزيع التنفيذ.
  • 🧵 تماثل: استخدم WebDriver واحدًا لكل طريقة @Test لتجنب حالات التزامن على نوافذ المتصفح المشتركة أثناء عمليات التشغيل المتزامنة.
  • 🔗 الاعتماد: قم بترتيب الاختبارات باستخدام dependsOnMethods داخل علامات تضمين testng.xml أو التعليق التوضيحي @Test عندما يجب أن تسبق طريقة واحدة طريقة أخرى.
  • 🤖 استخدام الذكاء الاصطناعي: تتنبأ أدوات الذكاء الاصطناعي الحديثة بعدد الخيوط الأمثل، والأساليب المتوازية الآمنة للمجموعات، وتكشف عن المرشحين غير الموثوق بهم من بيانات التشغيل التاريخية.

كيفية تشغيل التنفيذ المتوازي في Selenium

لفهم كيفية تشغيل البرامج النصية بالتوازي، عليك أولاً أن تعرف كيف Selenium يعزل كل متصفح من خلال الجلسات.

لماذا نحتاج إلى التعامل مع الجلسة؟

أثناء تنفيذ الاختبار، Selenium يتطلب برنامج WebDriver التفاعل مع المتصفح في كل خطوة لتنفيذ الأوامر المحددة. أثناء تشغيل هذا الاختبار، قد يقوم مستخدم آخر بتشغيل برنامج نصي ثانٍ على نفس الجهاز وباستخدام نفس نوع المتصفح.

التعامل مع الجلسة

في مثل هذه الحالة، نحتاج إلى آلية تمنع تداخل التنفيذين. Selenium يتم حل هذه المشكلة من خلال إدارة الجلسات.

كيفية تحقيق التعامل مع الجلسة في Selenium برنامج تشغيل الويب؟

إذا قمت بفحص Selenium ستجد في مصدر WebDriver متغيرًا يسمى sessionIdفي كل مرة تقوم فيها بإنشاء مثيل جديد لـ WebDriver، يتم إنشاء مثيل جديد. sessionId يتم توليدها وإلحاقها بذلك Firefoxبرنامج تشغيل Chrome أو IE.

تحقيق التعامل مع الجلسة في Selenium ويب درايفر

يتم تنفيذ كل أمر لاحق فقط داخل جلسة المتصفح المحددة هذه.

تحقيق التعامل مع الجلسة في Selenium ويب درايفر

لأن هذا مدمج في WebDriver، فلا حاجة لتعيين sessionId يدويًا.

Code على سبيل المثال: يتم إنشاء جلستين مختلفتين لنسختين من WebDriver.

SessionHandling.java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class SessionHandling {
    public static void main(String... strings) {
        // First session of WebDriver
        WebDriver driver = new FirefoxDriver();
        // Go to guru99 demo site
        driver.get("https://demo.guru99.com/V4/");

        // Second session of WebDriver
        WebDriver driver2 = new FirefoxDriver();
        // Go to guru99 demo site
        driver2.get("https://demo.guru99.com/V4/");
    }
}

كيفية إجراء الاختبارات المتوازية مع Selenium

توجد حالات ترغب فيها بتشغيل عدة اختبارات في نفس الوقت، مثل: التحقق من التوافق مع مختلف المتصفحات أو أجنحة كبيرة مخصصة للتدخين.

في مثل هذه الحالات ، فإن parallel السمة على TestNG يقوم وسم المجموعة بالعمل.

قم بإجراء اختبارات متوازية باستخدام Selenium

تقبل السمة المتوازية لعلامة المجموعة أربع قيم:

قيمة السمةمعنى
اختباراتالكل حالات تجريبية داخل علامة من تجريب تشغيل ملف XML بالتوازي.
فصولجميع حالات الاختبار داخل Java تشغيل الفصل بالتوازي.
طرقجميع الطرق التي تحمل التعليق التوضيحي @Test يتم تنفيذها بالتوازي.
حالاتيتم تشغيل الاختبارات في نفس الحالة بالتوازي، بينما يتم تشغيل طريقتين من حالتين مختلفتين في خيوط مختلفة.

استخدم thread-count تحدد السمة عدد الخيوط المخصصة لهذا التنفيذ. قم بإقرانها مع TestNG الإطار و تثبيت TestNG in Eclipse قبل التشغيل. وللتوسع لأكثر من جهاز واحد، قم بتوجيه نفس المجموعة من خلال Selenium شبكة 4 للتنفيذ المتوازي الموزع.

مثال كامل: ثلاث حالات اختبار تعمل بالتوازي وتملأ بيانات تسجيل الدخول https://demo.guru99.com/.

يبدو المشروع الكامل كما يلي:

قم بإجراء اختبارات متوازية باستخدام Selenium

اختبارGuru99MultipleSession.java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;

public class TestGuru99MultipleSession {

    @Test
    public void executeSessionOne() {
        // First session of WebDriver
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/V4/");
        // Find the user name text box and fill it
        driver.findElement(By.name("uid")).sendKeys("Driver 1");
    }

    @Test
    public void executeSessionTwo() {
        // Second session of WebDriver
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/V4/");
        driver.findElement(By.name("uid")).sendKeys("Driver 2");
    }

    @Test
    public void executeSessionThree() {
        // Third session of WebDriver
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/V4/");
        driver.findElement(By.name("uid")).sendKeys("Driver 3");
    }
}

TestNG.XML

testng.xml (الأساليب المتوازية)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite" thread-count="3" parallel="methods">
  <test name="testGuru">
    <classes>
      <class name="TestGuru99MultipleSession"/>
    </classes>
  </test>
</suite>

ترتيب حالة الاختبار والتبعية

يمكنك تحديد ترتيب وتبعية حالة اختبار التنفيذ. لنفترض أن لديك حالتي اختبار، testGuru99TC1 و testGuru99TC2، و انت تريد testGuru99TC2 للتشغيل قبل testGuru99TC1. استخدم ال dependsOnMethods السمة (أو dependsOnGroups (للتسلسل على مستوى المجموعة) لإصلاح هذا الترتيب. لنطاق أوسع إطار الأتمتة التصميم، المقارنة JUnit vs TestNG، ومراجعة البحث عن عنصر يرجى الرجوع إلى ما إذا كانت الاختبارات التابعة لديك تشترك في محددات المواقع.

testng.xml (dependsOnMethods)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite" thread-count="3" parallel="methods">
  <test name="testGuru">
    <classes>
      <class name="TestGuru99MultipleSession">
        <include name="testGuru99TC1" dependsOnMethods="testGuru99TC2"/>
        <include name="testGuru99TC2"/>
      </class>
    </classes>
  </test>
</suite>

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

الأسئلة الشائعة

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

تقبل السمة المتوازية في علامة المجموعة الاختبارات أو الفئات أو الأساليب أو النسخ. TestNG يقوم بإنشاء عدة خيوط (يتم تحديدها بواسطة عدد الخيوط) ويشغل الوحدة المختارة بشكل متزامن، مما يقلل من إجمالي وقت التنفيذ.

استخدم السمة dependsOnMethods داخل علامة التضمين في ملف testng.xml، أو @Test(dependsOnMethods = “name”) في التعليمات البرمجية. TestNG يقوم بتشغيل المتطلبات الأساسية أولاً ويتخطى الاختبار التابع في حالة الفشل.

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

نعم. يقوم الذكاء الاصطناعي بتحليل مخططات الاستدعاء وسجلات الفشل التاريخية لاقتراح روابط dependsOnMethods، ووضع علامات على التبعيات الدائرية، واقتراح مجموعات متوازية آمنة، مما يقلل من الصيانة اليدوية لملف testng.xml.

تلخيص هذه التدوينة بـ: