يحتوي XPath على: نص، واسم شقيق وأسلاف في Selenium

🚀 ملخص ذكي

يحتوي XPath على، شقيق، وسلف في Selenium تمكين تحديد دقيق لعناصر الويب باستخدام العلاقات المنظمة وأنماط النص. تُحسّن وظائف XPath هذه موثوقية الأتمتة ومرونتها وسهولة صيانتها في تسلسلات DOM المعقدة.

  • استعمل contains() لتحديد العناصر الديناميكية ذات النص الجزئي، مما يحسن من المتانة ضد الاختلافات النصية.
  • تطبيق following-sibling و ancestor للتنقل بين التسلسلات الهرمية للعناصر بكفاءة وtracالعقد ذات الصلة.
  • دمج الوظائف مع المشغلات المنطقية (AND، OR) لتحقيق استهداف دقيق ومحسّن للعناصر.
  • استخدم محاور XPath (السابقة، واللاحقة) للتنقل عبر أشجار DOM المعقدة بطريقة منهجية.
  • دمج هذه التعبيرات في Selenium نصوص برمجية لأتمتة اختبارات الويب القابلة للصيانة والديناميكية والمرنة.

يحتوي XPath

ما الذي يحتوي عليه XPath؟

يحتوي XPath هي دالة ضمن تعبير XPath، تُستخدم للبحث عن عناصر الويب التي تحتوي على نص معين. يمكننا أن نستنتجtracيُستخدم الأمر `contains()` في XPath للبحث عن جميع العناصر التي تطابق قيمة النص المُعطى في صفحة الويب. تتيح دالة `contains()` في XPath إمكانية العثور على العنصر حتى مع وجود جزء من النص.

مثال - يحتوي على نص

نحن هنا نبحث عن مرساة تحتوي على نص مثل 'SAP م.

"//h4/a[contains(text(),'SAP M')]"

يحتوي XPath

ملاحظة: يمكنك ممارسة تمرين XPath التالي على هذا https://demo.guru99.com/test/selenium-xpath.html

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

👉 سجل مجانًا للبث المباشر Selenium مشروع الاختبار

متابعة الأخ في XPath

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

الأخوة في مثال XPath:
هنا، على أساس العنصر الشقيق لـ 'a' نجد 'h4'

"//div[@class='canvas- graph']//a[@href='/accounting.html'][i[@class='icon-usd']]/following-sibling::h4"

متابعة الأخ في XPath

سلف:للعثور على عنصر على أساس العنصر الأصلي، يمكننا استخدام سمة الأسلاف في XPath.

متابعة الأخ في XPath

دعونا نفهم هذه الوظائف الثلاث باستخدام مثال -

خطوات الاختبار:

ملاحظة: منذ تاريخ إنشاء البرنامج التعليمي، الصفحة الرئيسية لـ Guruتم تحديث الإصدار 99، لذا استخدم الموقع التجريبي بدلاً من ذلك لإجراء الاختبارات.

  1. انتقل إلى البرنامج المساعد في التأليف https://demo.guru99.com/test/guru99home/
  2. في قسم "بعض دوراتنا الأكثر شعبية"، ابحث عن جميع عناصر الويب الشقيقة لعنصر ويب نصه "SELENIUM"
  3. سنقوم بالبحث عن العناصر باستخدام وظائف النص XPath التي تحتوي على النص والأسلاف والأخوة.

متابعة الأخ في XPath

الاستخدام يحتوي على نص وXPath Sibling

import java.time.Duration;
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;
import org.openqa.selenium.chrome.ChromeOptions;
import org.testng.annotations.Test;

// If you prefer WebDriverManager (optional):
// import io.github.bonigarcia.wdm.WebDriverManager;

public class SiblingAndParentInXpath_Chrome {
    @Test
    public void testSiblingAndParentInXpath() {

        // === Option A: Use local ChromeDriver binary path ===
        // Update this path to your chromedriver location:
        System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe");

        // === Option B: Use WebDriverManager (uncomment next line and remove Option A lines) ===
        // WebDriverManager.chromedriver().setup();

        ChromeOptions options = new ChromeOptions();
        // Add any flags you need, e.g. headless:
        // options.addArguments("--headless=new");

        WebDriver driver = new ChromeDriver(options);
        try {

            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
            driver.manage().window().maximize();
            driver.get("https://demo.guru99.com/test/guru99home/");

            // Find all siblings (divs) next to the 'SELENIUM' tile within
            // the "A few of our most popular courses" section.
            // Steps encoded in XPath:
            // 1) Locate the H2 that contains the section title
            // 2) Move to its parent DIV
            // 3) Inside it, locate the link with text 'SELENIUM'
            // 4) From the SELENIUM tile's parent DIV, get following sibling tiles

            List<WebElement> dateBox = driver.findElements(By.xpath(
                "//h2[contains(., 'A few of our most popular courses')]/parent::div" +
                "//a[normalize-space(.)='SELENIUM']/parent::div" +
                "/following-sibling::div[contains(@class,'rt-grid-2')]"
            ));

            // Print the text of each sibling element
            for (WebElement el : dateBox) {
                System.out.println(el.getText());
            }

        } finally {
            driver.quit();
        }
    }
}

سيكون الإخراج مثل:

الاستخدام يحتوي على نص وXPath Sibling

XPath السلف في Selenium

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

الآن، لنفترض أننا بحاجة إلى البحث عن جميع العناصر في قسم "الدورة التدريبية الشائعة" بمساعدة سلف المرساة الذي يكون نصه "SELENIUM"

هنا سيكون استعلام xpath الخاص بنا مثل

"//div[.//a[text()='SELENIUM']]/ancestor::div[@class='rt-grid-2 rt-omega']/following-sibling::div"

اكتملت Code

import java.time.Duration;
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;
import org.openqa.selenium.chrome.ChromeOptions;
import org.testng.annotations.Test;

public class AncestorInXpath_Chrome {

@Test

    public void testAncestorInXpath() {

        // Set path to your ChromeDriver executable
        System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe");

        ChromeOptions options = new ChromeOptions();
        WebDriver driver = new ChromeDriver(options);

        try {

            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
            driver.manage().window().maximize();
            driver.get("https://demo.guru99.com/test/guru99home/");

            // Search all elements in 'Popular course' section 
            // using the ancestor of the 'SELENIUM' link

            List <WebElement> dateBox = driver.findElements(
                By.xpath("//div[.//a[text()='SELENIUM']]/ancestor::div[@class='rt-grid-2 rt-omega']/following-sibling::div")
            );

            // Print all sibling elements of the 'SELENIUM' tile

            for (WebElement element : dateBox) {
                System.out.println(element.getText());
            }

        } finally {
            driver.quit();
        }
    }
}

سيبدو الإخراج مثل-

اكتملت Code

باستخدام AND وOR

من خلال استخدام AND وOR، يمكنك وضع شرطين في تعبير XPath الخاص بنا.

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

هنا، سيكون استعلام XPath الخاص بنا مثل

Xpath=//*[@type='submit' OR @name='btnReset']

Xpath=//input[@type='submit' and @name='btnLogin']

باستخدام AND وOR

خطوات الاختبار:

  1. انتقل إلى البرنامج المساعد في التأليف https://demo.guru99.com/
  2. في هذا القسم، سنستخدم موقع العرض التوضيحي أعلاه للبحث عن عناصر ذات وظائف مختلفة لـ XPath.

ستجد عنصرًا يستخدم محاور AND وOR والأصل والبدء بـ وXPath

و أو مثال

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

public class AND_OR {
	public static void main(String[] args) {
		WebDriver driver;
		WebElement w,x;
		System.setProperty("webdriver.chrome.driver","E://Selenium//Selenium_Jars//chromedriver.exe");
		 driver= new ChromeDriver();
 		 
         // Launch the application
     	 driver.get("https://www.guru99.com/");
     	 
     	//Search element using OR in the xpath
     	 w=driver.findElement(By.xpath("//*[@type='submit' OR @name='btnReset']"));
      	
     	 //Print the text of the element
			System.out.println(w.getText());
			
		//Search element using AND in the xpath
			x=driver.findElement(By.xpath("//input[@type='submit' and @name='btnLogin']"));	
			 
		//Print the text of the searched element
			System.out.println(x.getText());
			 
	//Close the browser
     driver.quit();
	}

}

XPath الأصل في Selenium

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

هنا، سيكون استعلام XPath الخاص بنا مثل

Xpath=//*[@id='rt-feature']//parent::div

XPath الأصل في Selenium

XPath باستخدام الأصل

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


public class Parent {
	public static void main(String[] args) {
		WebDriver driver;
		WebElement w;
		
		System.setProperty("webdriver.chrome.driver","E://Selenium//Selenium_Jars//chromedriver.exe");
		 driver= new ChromeDriver();
 		 
         // Launch the application
     	 driver.get("https://www.guru99.com/");
     	 
     	 //Search the element by using PARENT
     	 w=driver.findElement(By.xpath("//*[@id='rt-feature']//parent::div"));
      	
		//Print the text of the searched element
     	 System.out.println(w.getText());
	 
	//Close the browser
     driver.quit();
	}
}

ابدا ب

باستخدام وظيفة Starts-with، يمكنك العثور على العنصر الذي تتغير سماته ديناميكيًا عند التحديث أو العمليات الأخرى مثل النقر والإرسال وما إلى ذلك.

هنا سيكون استعلام XPath الخاص بنا مثل

Xpath=//label[starts-with(@id,'message')]

ابدا ب

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


public class StartsWith {
	public static void main(String[] args) {
		WebDriver driver;
		WebElement w;
		
		System.setProperty("webdriver.chrome.driver","E://Selenium//Selenium_Jars//chromedriver.exe");
		 driver= new ChromeDriver();
 		 
         // Launch the application
     	 driver.get("https://www.guru99.com/");
     	 
     	 //Search the element by using starts-with
     	 w=driver.findElement(By.xpath("//label[starts-with(@id,'message')]"));
     	
     	 //Print the text of the searched element
     	System.out.println(w.getText());
     	 
     	//Close the browser
	        driver.quit();
	}
}

محاور Xpath

باستخدام محاور XPath، يمكنك العثور على العناصر الديناميكية والمعقدة للغاية على صفحة الويب. تحتوي محاور XPath على عدة طرق للعثور على عنصر. هنا، سنناقش بعض الطرق.

متابعيك: ستعيد هذه الوظيفة العنصر المباشر للمكون المعين.

هنا سيكون استعلام XPath الخاص بنا مثل

Xpath=//*[@type='text']//following::input

XPath باستخدام التالي
XPath باستخدام ما يلي
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;


public class Following {
	public static void main(String[] args) {
		WebDriver driver;
		WebElement w;
		
		System.setProperty("webdriver.chrome.driver","E://Selenium//Selenium_Jars//chromedriver.exe");
		 driver= new ChromeDriver();
 		 
         // Launch the application
     	 driver.get("https://www.guru99.com/");
     	 
     	 //Search the element by using Following method
     	 w=driver.findElement(By.xpath("//*[@type='text']//following::input"));
      	
		//Print the text of the searched element
     	 System.out.println(w.getText());
	 
	//Close the browser
     driver.quit();
	}
}

السابق: ستعيد هذه الوظيفة العنصر السابق للعنصر المعين.

هنا سيكون استعلام XPath الخاص بنا مثل

Xpath= //*[@type='submit']//preceding::input

XPath باستخدام السابق

XPath باستخدام السابق
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;


public class Preceding {
	public static void main(String[] args) {
		
		WebDriver driver;
		WebElement w;
		
		System.setProperty("webdriver.chrome.driver","E://Selenium//Selenium_Jars//chromedriver.exe");
		 driver= new ChromeDriver();
 		 
         // Launch the application
     	 driver.get("https://www.guru99.com/");
     	 
     	 //Search the element by using preceding method
     	 w=driver.findElement(By.xpath("//*[@type='submit']//preceding::input"));
      	
		//Print the searched element
     	 System.out.println(w.getText());
	 
	//Close the browser
     driver.quit();

	}
}

d) تنازلي: ستعيد هذه الوظيفة العنصر السليل للعنصر المعين.

هنا سيكون استعلام XPath الخاص بنا مثل

Xpath= //*[@id='rt-feature']//descendant::a

XPath باستخدام السليل

XPath باستخدام السليل
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;


public class Descendant {
	public static void main(String[] args) {
		WebDriver driver;
		WebElement w;
		System.setProperty("webdriver.chrome.driver","E://Selenium//Selenium_Jars//chromedriver.exe");
		 driver= new ChromeDriver();
 		 
         // Launch the application
     	 driver.get("https://www.guru99.com/");
     	 
     	 //Search the element by using descendant method
     	 w=driver.findElement(By.xpath("//*[@id='rt-feature']//descendant::a"));
      	
		//Print the searched element
     	 System.out.println(w.getText());
	 
	//Close the browser
     driver.quit();
	}
}

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

في XPath، يحدد /* جميع عناصر الجذر في مستند XML أو HTML. ويعني ذلك "تحديد أي عنصر يقع مباشرةً أسفل العقدة الجذرية". على سبيل المثال، في مستند HTML، يطابق /* نظرًا لأنه العنصر الأعلى مستوى أسفل الجذر.

تساعد دالة contains() في XPath على تحديد العناصر التي تتطابق سماتها أو نصوصها جزئيًا مع قيمة معينة. وهي مفيدة بشكل خاص عندما تكون السلسلة النصية غير متوقعة أو متغيرة. على سبيل المثال، //div[contains(@class,'menu')] يطابق أي التي تشمل فئتها كلمة "القائمة".

لتحديد موقع العناصر بناءً على تطابق جزئي ضمن سمة فئتها، استخدم الدالة contains(). على سبيل المثال، //button[contains(@class,'submit')] يستهدف أي كائن يحمل اسم فئة يتضمن "إرسال"، مثل "submit-btn" أو "form-submit". إنها طريقة مرنة للتعامل مع أسماء الفئات الديناميكية.

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