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

ما هي الروابط المعطلة؟
الروابط المعطلة هي روابط أو URLالخوادم التي لا يمكن الوصول إليها. قد تكون معطلة أو لا تعمل بسبب خطأ ما في الخادم.
A URL ستكون حالة الطلب دائمًا 2xx، وهي حالة صحيحة. توجد رموز حالة HTTP مختلفة، ولكل منها غرضه الخاص. أما في حالة الطلبات غير الصالحة، فتكون حالة HTTP هي 4xx و5xx.
تُستخدم فئة رموز الحالة 4xx بشكل أساسي لأخطاء جانب العميل، بينما تُستخدم فئة رموز الحالة 5xx بشكل أساسي لأخطاء استجابة الخادم.
لن نتمكن على الأرجح من تأكيد ما إذا كان هذا الرابط يعمل أم لا حتى ننقر عليه ونؤكده.
لماذا يجب عليك التحقق من الروابط المعطلة؟
يجب عليك دائمًا التأكد من عدم وجود روابط معطلة على الموقع، لأنه لا ينبغي للمستخدم أن يصل إلى صفحة خطأ.
يحدث الخطأ إذا لم يتم تحديث القواعد بشكل صحيح، أو إذا كانت الموارد المطلوبة غير موجودة على الخادم.
يعد التحقق اليدوي من الروابط مهمة شاقة، لأن كل صفحة ويب قد تحتوي على عدد كبير من الروابط، ويجب تكرار العملية اليدوية لجميع الصفحات.
برنامج أتمتة يستخدم Selenium من شأنها أتمتة العملية هو الحل الأكثر ملاءمة.
كيفية التحقق من الروابط والصور المعطلة في Selenium
للتحقق من الروابط المعطلة، ستحتاج إلى القيام بالخطوات التالية.
- اجمع كل الروابط الموجودة في صفحة الويب بناءً على الوسم.
- أرسل طلب HTTP للرابط واقرأ رمز استجابة HTTP.
- تحقق مما إذا كان الرابط صالحًا أم معطلاً بناءً على رمز استجابة HTTP.
- كرر هذا لجميع الروابط التي تم التقاطها.
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).


.png)