كيفية البحث عن الروابط المعطلة في Selenium

⚡ ملخص ذكي

العثور على الروابط المعطلة في Selenium يتضمن WebDriver جمع كل علامة رابط، وإرسال طلب HTTP HEAD إلى كل منها URLوقراءة رمز الاستجابة. الروابط التي تُرجع رمز 400 أو أعلى تُعتبر معطلة، بينما الروابط الصحيحة تُرجع رموز 2xx.

  • 🔗 فريف: الرابط المعطل هو URL والتي لا يمكن الوصول إليها، وعادة ما تؤدي إلى ظهور خطأ 4xx أو 5xx.
  • 🧭 لماذا يهم: تؤدي الروابط المعطلة إلى الإضرار بتجربة المستخدم وتحسين محركات البحث، لذا فإن عمليات التحقق الآلية تحل محل التحقق اليدوي البطيء.
  • 📥 جمع الروابط: استخدم findElements مع By.tagName(“a”) لتجميع كل عنصر رابط في الصفحة في قائمة.
  • 📡 إرسال طلب HEAD: افتح HTTPURLقم بالاتصال، واضبط الطريقة على HEAD، واقرأ رمز الاستجابة لكل URL.
  • ✅ التحقق من الحالة: اعتبر رمز الاستجابة 400 أو أعلى بمثابة رابط معطل، وأي رمز 2xx بمثابة رابط يعمل.

كيفية البحث عن الروابط المعطلة في Selenium

ما هي الروابط المعطلة؟

الروابط المعطلة هي روابط أو URLالخوادم التي لا يمكن الوصول إليها. قد تكون معطلة أو لا تعمل بسبب خطأ ما في الخادم.

A URL ستكون حالة الطلب دائمًا 2xx، وهي حالة صحيحة. توجد رموز حالة HTTP مختلفة، ولكل منها غرضه الخاص. أما في حالة الطلبات غير الصالحة، فتكون حالة HTTP هي 4xx و5xx.

تُستخدم فئة رموز الحالة 4xx بشكل أساسي لأخطاء جانب العميل، بينما تُستخدم فئة رموز الحالة 5xx بشكل أساسي لأخطاء استجابة الخادم.

لن نتمكن على الأرجح من تأكيد ما إذا كان هذا الرابط يعمل أم لا حتى ننقر عليه ونؤكده.

لماذا يجب عليك التحقق من الروابط المعطلة؟

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

يحدث الخطأ إذا لم يتم تحديث القواعد بشكل صحيح، أو إذا كانت الموارد المطلوبة غير موجودة على الخادم.

يعد التحقق اليدوي من الروابط مهمة شاقة، لأن كل صفحة ويب قد تحتوي على عدد كبير من الروابط، ويجب تكرار العملية اليدوية لجميع الصفحات.

برنامج أتمتة يستخدم Selenium من شأنها أتمتة العملية هو الحل الأكثر ملاءمة.

كيفية التحقق من الروابط والصور المعطلة في Selenium

للتحقق من الروابط المعطلة، ستحتاج إلى القيام بالخطوات التالية.

  1. اجمع كل الروابط الموجودة في صفحة الويب بناءً على الوسم.
  2. أرسل طلب HTTP للرابط واقرأ رمز استجابة HTTP.
  3. تحقق مما إذا كان الرابط صالحًا أم معطلاً بناءً على رمز استجابة HTTP.
  4. كرر هذا لجميع الروابط التي تم التقاطها.

Code للعثور على الروابط المعطلة في صفحة ويب

يوجد أدناه رمز برنامج تشغيل الويب الذي يختبر حالة الاستخدام لدينا:

package automationPractice;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class BrokenLinks {

    private static WebDriver driver = null;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        String homePage = "http://www.zlti.com";
        String url = "";
        HttpURLConnection huc = null;
        int respCode = 200;

        driver = new ChromeDriver();

        driver.manage().window().maximize();

        driver.get(homePage);

        List<WebElement> links = driver.findElements(By.tagName("a"));

        Iterator<WebElement> it = links.iterator();

        while(it.hasNext()){

            url = it.next().getAttribute("href");

            System.out.println(url);

            if(url == null || url.isEmpty()){
                System.out.println("URL is either not configured for anchor tag or it is empty");
                continue;
            }

            if(!url.startsWith(homePage)){
                System.out.println("URL belongs to another domain, skipping it.");
                continue;
            }

            try {
                huc = (HttpURLConnection)(new URL(url).openConnection());

                huc.setRequestMethod("HEAD");

                huc.connect();

                respCode = huc.getResponseCode();

                if(respCode >= 400){
                    System.out.println(url+" is a broken link");
                }
                else{
                    System.out.println(url+" is a valid link");
                }

            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        driver.quit();

    }
}

شرح كود الروابط المعطلة

الخطوة 1: استيراد الحزم

قم باستيراد الحزمة التالية بالإضافة إلى الحزم الافتراضية:

import java.net.HttpURLConnection;

باستخدام الطرق الموجودة في هذه الحزمة، يمكننا إرسال طلبات HTTP والتقاط رموز استجابة HTTP من الاستجابة.

الخطوة 2: جمع كافة الروابط في صفحة الويب

حدد جميع الروابط في صفحة الويب وقم بتخزينها في قائمة.

List<WebElement> links = driver.findElements(By.tagName("a"));

احصل على مُكرِّر للتنقل عبر القائمة.

Iterator<WebElement> it = links.iterator();

الخطوة الثالثة: تحديد والتحقق URL

في هذا الجزء، سنتحقق مما إذا كان URL ينتمي إلى نطاق طرف ثالث أو ما إذا كان URL فارغ/معدوم.

احصل على رابط الصفحة (href) الخاص بعلامة الرابط (anchor tag) وقم بتخزينه في متغير عنوان URL.

url = it.next().getAttribute("href");

تحقق مما إذا كان URL إذا كان الشرط فارغًا أو معدومًا، فتجاوز الخطوات المتبقية.

if(url == null || url.isEmpty()){
              System.out.println("URL is either not configured for anchor tag or it is empty");
              continue;
     }

تحقق مما إذا كان ملف URL ينتمي إلى نطاق رئيسي أو إلى طرف ثالث. تخطَّ الخطوات المتبقية إذا كان ينتمي إلى نطاق طرف ثالث.

 if(!url.startsWith(homePage)){
           System.out.println("URL belongs to another domain, skipping it.");
           continue;
   }

الخطوة 4: إرسال طلب HTTP

بروتوكول HTTPURLيحتوي صنف الاتصال على طرق لإرسال طلب HTTP والتقاط رمز استجابة HTTP. لذا، فإن ناتج طريقة openConnection() (URLيتم تحويل نوع الاتصال إلى HttpURLالاتصال.

huc = (HttpURLConnection)(new URL(url).openConnection());

يمكننا تعيين نوع الطلب على أنه "HEAD" بدلاً من "GET"، بحيث يتم إرجاع الرؤوس فقط وليس نص المستند.

huc.setRequestMethod("HEAD");

عند استدعاء طريقة connect()، يتم إنشاء الاتصال الفعلي بعنوان URL ويتم إرسال الطلب.

huc.connect();

الخطوة 5: التحقق من صحة الروابط

باستخدام getResponseCodeباستخدام الدالة ()، يمكننا الحصول على رمز الاستجابة للطلب.

respCode = huc.getResponseCode();

بناءً على رمز الاستجابة، سنحاول التحقق من حالة الرابط.

if(respCode >= 400){
        System.out.println(url+" is a broken link");
}
else{
        System.out.println(url+" is a valid link");
}

وبالتالي، يمكننا الحصول على جميع الروابط من صفحة ويب وطباعة ما إذا كانت الروابط صالحة أم معطلة.

كيفية الحصول على جميع روابط صفحة الويب

أحد الإجراءات الشائعة في الويب الاختبار هو اختبار ما إذا كانت جميع الروابط الموجودة داخل الصفحة تعمل أم لا. ويمكن القيام بذلك بسهولة باستخدام مجموعة من Java لكل حلقة, العثور على العناصر () & بواسطة.tagName("أ") الأسلوب.

تقوم الدالة findElements() بإرجاع قائمة بعناصر الويب التي تحمل الوسم a. باستخدام حلقة for-each، يتم الوصول إلى كل عنصر.

احصل على جميع روابط صفحة الويب

يتحقق رمز WebDriver الموجود أدناه من كل رابط من ملف Mercury الصفحة الرئيسية للجولات لتحديد تلك التي تعمل وتلك التي لا تزال قيد الإنشاء.

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.*;

public class P1 {

    public static void main(String[] args) {
        String baseUrl = "https://demo.guru99.com/test/newtours/";
        System.setProperty("webdriver.chrome.driver", "G:\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();

        String underConsTitle = "Under Construction: Mercury Tours";
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

        driver.get(baseUrl);
        List<WebElement> linkElements = driver.findElements(By.tagName("a"));
        String[] linkTexts = new String[linkElements.size()];
        int i = 0;

        //extract the link texts of each link element
        for (WebElement e : linkElements) {
            linkTexts[i] = e.getText();
            i++;
        }

        //test each link
        for (String t : linkTexts) {
            driver.findElement(By.linkText(t)).click();
            if (driver.getTitle().equals(underConsTitle)) {
                System.out.println("\"" + t + "\""
                        + " is under construction.");
            } else {
                System.out.println("\"" + t + "\""
                        + " is working.");
            }
            driver.navigate().back();
        }
        driver.quit();
    }
}

يجب أن يكون الإخراج مشابهًا لما هو موضح أدناه.

  • يتم الوصول إلى روابط الصور باستخدام طريقتي By.cssSelector() و By.xpath().

احصل على جميع روابط صفحة الويب

استكشاف الأخطاء وإصلاحها

في حالة نادرة، قد يكون الرابط الأول الذي يصل إليه الكود هو رابط "الرئيسية". في هذه الحالة، ستعرض الدالة driver.navigate.back() صفحة فارغة، لأن أول إجراء هو فتح متصفح. لن يتمكن برنامج التشغيل من العثور على جميع الروابط الأخرى في متصفح فارغ. لذلك، سيُصدر مُحرر الأكواد استثناءً ولن يتم تنفيذ باقي الكود. يمكن معالجة هذا بسهولة باستخدام حلقة شرطية (if loop).

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

Selenium يجمع جميع علامات الترابط، ويرسل طلب HTTP HEAD إلى كل منها URLويصنف أي رابط يعيد رمز الخطأ 400 أو أعلى على أنه معطل.

يشير رمز 4xx إلى مشكلة من جانب العميل، مثل صفحة مفقودة، بينما يشير رمز 5xx إلى فشل من جانب الخادم أثناء معالجة الطلب.

نعم. يتم جمع مصادر الصور باستخدام By.cssSelector() أو By.xpath()، ثم كل src URL يتم التحقق من صحتها من خلال رمز استجابة HTTP الخاص بها.

نعم. تقوم برامج الزحف القائمة على الذكاء الاصطناعي بفحص الصفحات، وتتبع الروابط، وتحديد الروابط المعطلة أو التي تعيد التوجيه. URLبدون كتابة نصوص برمجية يدوية.

يقوم الذكاء الاصطناعي بمراقبة حالة الروابط بمرور الوقت، ويتنبأ بالأعطال، ويقترح بدائل، مما يقلل من عمليات التدقيق اليدوي المتكررة للروابط.

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