كيفية التعامل مع جدول الويب في Selenium

⚡ ملخص ذكي

Selenium تتيح معالجة جداول الويب لمهندسي ضمان الجودة قراءة البيانات الجدولية من صفوف وأعمدة HTML باستخدام XPath وCSS و Selenium 4. محددات المواقع النسبية. تتناول هذه المقالة الجداول الثابتة، والجداول المتداخلة، ومسندات السمات، وتقنيات الذكاء الاصطناعي للشبكات الديناميكية.

  • 🧱 تشريح XPath: يبدأ كل محدد موقع الجدول بـ //table ويتعمق في tbody و tr و td باستخدام الشروط.
  • 🔁 صفوف ديناميكية: تقوم الدالة findElements بإرجاع قائمة من عناصر الويب بحيث يمكن للحلقات عد الصفوف وقراءة الخلايا في وقت التشغيل.
  • 🪄 Selenium 4: تعمل المحددات النسبية أعلى وأسفل وبالقرب على تبسيط استهداف الخلايا المحيطة بعنصر مرساة معروف.
  • 🧠 محددات المواقع بالذكاء الاصطناعي: تكتشف أدوات الإصلاح الذاتي تحولات الأعمدة وتستعيد هوية الصف دون الحاجة إلى تعديلات XPath يدوية.
  • 🛠️ فحص الاختصار: تقوم أدوات مطوري المتصفح بنسخ مسار XPath كامل يمكنك تقليصه إلى الجدول الأول لضمان الموثوقية.

Selenium مثال على XPath لجدول ويب

ما هو جدول الويب في Selenium?

A جدول الويب in Selenium عنصر ويب يُستخدم لعرض البيانات أو المعلومات في جداول. يمكن أن تكون البيانات المعروضة ثابتة أو ديناميكية. يتم الوصول إلى خلايا وصفوف جدول الويب من خلال طرق عنصر الويب المقترنة بمحددات المواقع. مثال نموذجي على ذلك هو شبكة مواصفات المنتج المعروضة في صفحة منتج على موقع تجارة إلكترونية.

قراءة جدول ويب HTML

يحتاج المختبرون في كثير من الأحيان إلى الوصول إلى عناصر، عادةً ما تكون قيمًا نصية، موجودة داخل جداول HTML. مع ذلك، نادرًا ما يُضيف مصممو المواقع سمة id أو name إلى الخلايا الفردية. لذا، نادرًا ما تُجدي طرق مثل By.id() وBy.name() وBy.cssSelector() نفعًا. في هذه الحالة، يُعدّ By.xpath() الخيار الأمثل لأنه يُتيح تتبع علاقات الأصل والفرع داخل وسم الجدول.

كيفية التعامل مع جدول الويب في Selenium

خذ بعين الاعتبار كود HTML أدناه للتعامل مع جداول الويب Selenium.

كيفية كتابة XPath للجدول في Selenium

سوف نستخدم كسباث للحصول على النص الداخلي للخلية التي تحتوي على النص "الخلية الرابعة".

كيفية كتابة XPath للجدول في Selenium

الخطوة 1 - تعيين العنصر الأصلي (الجدول)

تبدأ محددات XPath في WebDriver دائمًا بشرطتين مائلتين متتاليتين "//" متبوعتين بالعنصر الأصل. نظرًا لأننا نتعامل مع جداول الويب في Selenium، يجب أن يكون العنصر الأصل دائمًا هو بطاقة شعار. الجزء الأول من أعمالنا Selenium لذلك يجب أن يبدأ محدد موقع جدول XPath بـ "//table".

Selenium مثال لجدول الويب

الخطوة 2 – إضافة العناصر الفرعية

العنصر الموجود أسفل العنصر مباشرة يكون ، لذا هو ابن وعلى العكس من ذلك، هو والد يتم وضع جميع العناصر الفرعية في XPath على يمين العنصر الأصل، مفصولة بشرطة مائلة واحدة "/" كما هو موضح أدناه.

Selenium مثال لجدول الويب

الخطوة 3 – إضافة المسندات

ال يحتوي العنصر على اثنين الوسوم. هذان الاثنان الوسوم هي أبناء لـ ، لذا هو والد كليهما. الاثنان العناصر أشقاء. الأشقاء هم عناصر فرعية تشترك في نفس الأصل.

للوصول إلى الذي يحتوي على "الخلية الرابعة"، يجب علينا أولاً الوصول إلى ثان وليس الأول. كتابة "//table/tbody/tr" فقط ستستهدف الأول علامة.

فكيف نصل إلى الثاني؟ الجواب هو استخدام المسندات. المسندات هي أرقام أو سمات HTML محاطة بأقواس مربعة "[ ]" تميز عنصرًا فرعيًا عن العناصر الشقيقة له.بما أن الصف الذي نحتاجه هو الثاني، فإننا نستخدم "[2]" كمسند.

 Selenium مثال لجدول الويب

إذا حذفنا الشرط، فإن XPath يُرجع أول عنصر شقيق. لذلك، فإن أيًا من رموز XPath أدناه سيصل إلى العنصر الأول. .

Selenium جدول الويب باستخدام Xpath

الخطوة 4 – إضافة العناصر التابعة باستخدام المسندات المناسبة

العنصر التالي الذي نحتاجه هو الثاني بتطبيق القواعد من الخطوتين 2 و 3، نصل إلى XPath الموضح أدناه.

جدول الويب في Selenium باستخدام اكس باث

بعد أن حصلنا على مُحدِّد XPath الصحيح، يُمكننا الوصول إلى الخلية وقراءة نصها الداخلي باستخدام الكود أدناه. هذا يفترض أنك قمت بحفظ صفحة HTML باسم "newhtml.html" داخل محرك الأقراص C.

جدول الويب في Selenium باستخدام اكس باث

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/write-xpath-table.html";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(
        By.xpath("//table/tbody/tr[2]/td[2]")).getText();
    System.out.println(innerText);
    driver.quit();
}

جدول الويب في Selenium باستخدام اكس باث

الوصول إلى الجداول المتداخلة

تنطبق المبادئ نفسها على الجداول المتداخلة. الجداول المتداخلة هي جداول موضوعة داخل جدول آخر. ويرد أدناه مثال على ذلك.

كيفية الوصول إلى الجداول المتداخلة في Selenium

للوصول إلى الخلية التي تحتوي على النص "4-5-6" باستخدام أفكار الأصل/الفرع والمسند من القسم السابق، يمكننا تكوين XPath الموضح أدناه.

كيفية الوصول إلى الجداول المتداخلة في Selenium

يسترجع كود WebDriver أدناه النص الداخلي للخلية المستهدفة.

الوصول إلى الجداول المتداخلة في Selenium

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/accessing-nested-table.html";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(
        By.xpath("//table/tbody/tr[2]/td[2]/table/tbody/tr/td[2]")).getText();
    System.out.println(innerText);
    driver.quit();
}

يؤكد الإخراج أدناه أنه تم الوصول إلى الجدول الداخلي بنجاح.

الوصول إلى الجداول المتداخلة في Selenium

استخدام السمات كمسندات

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

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

Selenium مثال لجدول الويب باستخدام السمات كمسندات

Selenium مثال لجدول الويب باستخدام السمات كمسندات

يمكننا استخدام السمة الفريدة للجدول (width=”270”) كمسند. يتم استخدام السمات كمسندات عن طريق إضافة الرمز @ إليها قبلهافي المثال أعلاه، تقع الخلية "من نيويورك إلى شيكاغو" في الخلية الأولى من الرابع لذا يجب أن يبدو XPath الخاص بنا كما هو موضح أدناه.

Selenium مثال لجدول الويب مع السمات كمسندات

تذكر أنه عند وضع XPath في الداخل Java، قم بإلغاء علامات الاقتباس المزدوجة المحيطة بـ "270" باستخدام شرطة مائلة عكسية حتى لا يتم إنهاء سلسلة By.xpath() مبكرًا.

Selenium مثال لجدول الويب مع السمات كمسندات

نحن الآن جاهزون للوصول إلى تلك الخلية باستخدام الكود أدناه.

Selenium مثال لجدول الويب مع السمات كمسندات

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/newtours/";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(By
        .xpath("//table[@width=\"270\"]/tbody/tr[4]/td"))
        .getText();
    System.out.println(innerText);
    driver.quit();
}

Selenium مثال لجدول الويب مع السمات كمسندات

الاختصار: استخدم فحص العنصر للوصول إلى الجداول في Selenium

إذا كان من الصعب الحصول على فهرس أو سمة عنصر ما، فإن أسرع طريقة لإنشاء XPath هي استخدام Inspect Element في أدوات مطوري المتصفحات الحديثة.

انظر إلى المثال التالي من Mercury الصفحة الرئيسية للجولات.

Selenium مثال لجدول الويب مع السمات كمسندات

خطوة 1

انقر بزر الماوس الأيمن على الخلية المستهدفة واختر "فحص" لعرض مسار DOM، ثم انسخ XPath بالكامل.

Selenium مثال لجدول الويب مع السمات كمسندات

خطوة 2

ابحث عن العنصر الأصلي "الجدول" الأول واحذف كل شيء على يساره.

Selenium مثال لجدول الويب مع السمات كمسندات

خطوة 3

قم بإضافة بادئة XPath المتبقية بشرطتين مائلتين للأمام "//" وانسخها إلى كود WebDriver الخاص بك.

Selenium مثال لجدول الويب مع السمات

يسترجع كود WebDriver أدناه النص الداخلي للعنصر المتداخل بعمق.

Selenium مثال لجدول الويب مع السمات

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/newtours/";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(By
        .xpath("//table/tbody/tr/td[2]"
        + "//table/tbody/tr[4]/td/"
        + "table/tbody/tr/td[2]/"
        + "table/tbody/tr[2]/td[1]/"
        + "table[2]/tbody/tr[3]/td[2]/font"))
        .getText();
    System.out.println(innerText);
    driver.quit();
}

كيفية حساب الصفوف والأعمدة في جدول ويب ديناميكي

تعرض جداول الويب الديناميكية، مثل لوحات المعلومات أو نتائج البحث، أعدادًا مختلفة من الصفوف في كل مرة يتم فيها تحميل الصفحة. وللتعامل معها، استخدم findElements لجلب كل في قائمة، ثم قم بالمرور على كل خلية لقراءتها. يقوم المقتطف البرمجي أدناه بحساب الصفوف وقراءة كل خلية في جدول يحمل المعرّف "customers".

List<WebElement> rows = driver.findElements(
    By.xpath("//table[@id='customers']//tr"));
System.out.println("Total rows: " + rows.size());

for (int i = 1; i <= rows.size(); i++) {
    List<WebElement> cells = driver.findElements(
        By.xpath("//table[@id='customers']//tr[" + i + "]/td"));
    for (WebElement cell : cells) {
        System.out.println(cell.getText());
    }
}

لفّ جهاز تحديد الموقع في WebDriverWait مع visibilityOfAllElementsLocatedBy عند تحميل الجدول بواسطة AJAX. هذا يمنع وجود مراجع عناصر قديمة في الشبكات بطيئة العرض.

Selenium 4. محددات المواقع النسبية لجداول الويب

Selenium قدّم الإصدار 4 محددات نسبية تستهدف العناصر بناءً على موقعها المرئي. وهي مفيدة عندما تتعطل فهارس XPath بسبب إعادة ترتيب الصفوف. above(), below(), toLeftOf(), toRightOf()و near() جميعها تقبل عنصر ويب رابط.

import static org.openqa.selenium.support.locators.RelativeLocator.with;

WebElement emailHeader = driver.findElement(By.xpath("//th[text()='Email']"));
WebElement emailCell = driver.findElement(
    with(By.tagName("td")).below(emailHeader));
System.out.println(emailCell.getText());

تظل محددات المواقع النسبية قابلة للقراءة عند تغيير ترتيب الأعمدة. قم بإقرانها بانتظارات صريحة للحصول على أفضل النتائج في الصفحات التي تعتمد على البيانات.

أدوات الذكاء الاصطناعي للتعامل مع جداول الويب الديناميكية

تُقلل منصات الاختبار المدعومة بالذكاء الاصطناعي من صيانة أجهزة تحديد المواقع على الشبكات التي تتغير باستمرار. أدوات مثل Testim, مابلو يعمل تستخدم هذه التقنية رؤية الحاسوب بالإضافة إلى نماذج DOM لاكتشاف تحولات الأعمدة وتحديد المواقع ذاتية الإصلاح. وتحدد الصفوف من خلال نص العنوان وتشابه الخلايا بدلاً من فهارس XPath الثابتة.

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

ملخص

  • تُعدّ الدالة By.xpath() الطريقة الأكثر موثوقية للوصول إلى خلايا جدول الويب في Selenium.
  • إذا كان عد الأشقاء صعباً، فاستخدم سمة فريدة كمسند، مسبوقة بالرمز @.
  • تُرجع الدالة findElements قائمة يدعم ذلك عد الصفوف في الجداول الديناميكية.
  • Selenium 4 محددات نسبية (أعلى، أسفل، قريب) تقلل الاعتماد على XPath الموضعي.
  • تعمل خاصية فحص العنصر في أدوات المطورين على تسريع إنشاء XPath للخلايا المدفونة بعمق.
  • أدوات الذكاء الاصطناعي مثل Testim، Mabl، و Healenium محددات ذاتية الإصلاح للشبكات المتغيرة.

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

جدول ويب في Selenium هو عنصر ويب يعرض البيانات الجدولية في صفوف وأعمدة. يمكن أن يكون ثابتًا أو ديناميكيًا. يصل المختبرون إلى خلاياه من خلال طرق عنصر الويب بالإضافة إلى XPath أو محددات CSS لأن الجداول نادرًا ما تعرض معرّفات فريدة على الخلايا الفردية.

لا تحتوي معظم خلايا الجدول على سمة id أو name، لذا لن تعمل الدالتان By.id() و By.name(). يتتبع XPath بنية العناصر الأبوية والفرعية للجدول، وعناصر tbody، و tr، و td، مما يجعله أداة تحديد المواقع الأكثر موثوقية للخلايا.

استخدم الدالة `driver.findElements(By.xpath(“//table[@id='tbl']//tr”)).size()` لحساب عدد الصفوف، و`//table[@id='tbl']//tr[1]/td` لحساب عدد الأعمدة. تُرجع الدالة `findElements` قائمةً. يدعم هذا البرنامج دالة size() لحساب إجمالي الصفوف بسرعة.

Selenium أضاف الإصدار 4 محددات نسبية مثل above() و below() و toLeftOf() و toRightOf() و near(). تساعد هذه المحددات في استهداف الخلايا الموجودة حول خلية مرجعية معروفة، وهو أمر مفيد عند تغيير فهارس XPath في الجداول الديناميكية.

استخدم دالة findElements للتكرار عبر الصفوف، ثم اقرأ كل خلية باستخدام دالة getText(). أنشئ مسار XPath ديناميكيًا باستخدام دمج السلاسل النصية مثل //tr[“+i+”]/td[“+j+”]. انتظر حتى يتم تحميل الجدول باستخدام WebDriverWait قبل قراءة القيم.

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

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

تُعيد الدالة findElement عنصر ويب واحد، وتُطلق استثناء NoSuchElementException في حال عدم وجوده. أما الدالة findElements فتُعيد قائمة. ويعيد قائمة فارغة إذا لم يتم العثور على أي تطابق. استخدم findElements عند البحثping على صفوف أو أعمدة الجدول.

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