Учебники

65) Содержит, родного брата, предка

Если простой XPath не может найти сложный веб-элемент для нашего тестового скрипта, нам нужно использовать функции из библиотеки XPath 1.0. С помощью комбинации этих функций мы можем создать более конкретный XPath. Давайте обсудим 3 такие функции —

  1. Содержит
  2. родной брат
  3. предок
  4. И ИЛИ
  5. родитель
  6. Начинается с
  7. Оси XPath

Давайте изучим их подробно —

Содержит

Используя функцию «содержит» в XPath, мы можем извлечь все элементы, которые соответствуют определенному текстовому значению.

Ex. Здесь мы ищем привязку. Содержит текст как «SAP M».

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

родной брат

Используя ключевое слово sibling, мы можем получить веб-элемент, связанный с каким-либо другим элементом.

Пример: здесь на основе родственного элемента ‘a’ мы находим ‘h4’

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

Ancestor : чтобы найти элемент на основе родительского элемента, мы можем использовать атрибут ancestor в XPath.

Давайте разберемся с этими тремя функциями на примере:

Тестовые шаги

Примечание. Со времени создания учебного пособия домашняя страница Guru99 была обновлена, поэтому вместо этого используйте демонстрационный сайт для запуска тестов.

  1. Перейдите на http://demo.guru99.com/test/guru99home/
  2. В разделе «Некоторые из наших самых популярных курсов» найдите все веб-элементы, которые являются родственными элементами веб-элемента с текстом «SELENIUM».
  3. Мы найдем элемент, используя функции contains, ancestor и sibling

ИСПОЛЬЗОВАНИЕ Содержит и родного брата

import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;

public class SiblingAndParentInXpath {

    @Test

    public void testSiblingAndParentInXpath(){

    	WebDriver driver;
    	String driverPath = "C:\\geckodriver.exe";
    	System.setProperty("webdriver.gecko.driver", driverPath);
        driver = new FirefoxDriver();        
        
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://demo.guru99.com/test/guru99home/");

        //Search element inside 'Popular course' which are sibling of control 'SELENIUM' ,Here first we will find a h2 whose text is ''A few of our most popular courses' ,then we move to its parent element which is a 'div' , inside this div we will find a link whose text is 'SELENIUM' then at last we will find all of the sibling elements of this link('SELENIUM')
        
        List <WebElement> dateBox = driver.findElements(By.xpath("//h2[contains(text(),'A few of our most popular courses')]/parent::div//div[//a[text()='SELENIUM']]/following-sibling::div[@class='rt-grid-2 rt-omega']"));

        //Print all the which are sibling of the the element named as 'SELENIUM' in 'Popular course'
        for (WebElement webElement : dateBox) {
            System.out.println(webElement.getText());
        }     

        driver.close();
    }
}

Выход будет как:

Функция предка

Мы можем достичь той же функциональности с помощью функции «предок».

Теперь предположим, что нам нужно найти все элементы в разделе «Популярный курс» с помощью предка якоря, текст которого «SELENIUM»

Здесь наш запрос xpath будет похож

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

Полный код

import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;

public class AncestorInXpath{

@Test

    public void testAncestorInXpath(){

        WebDriver driver = new FirefoxDriver();             
		driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://demo.guru99.com/test/guru99home/");

        //Search All elements in 'Popular course' section 
		//with the help of ancestor of the anchor whose text is 'SELENIUM'

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

        //Print all the which are sibling of the element named as 'SELENIUM' in 'Popular course'

        for (WebElement webElement : dateBox) {
            System.out.println(webElement.getText());
        }
     
        driver.quit();
    }
}

Вывод будет выглядеть как

Использование AND и OR

Используя AND и OR, вы можете поместить 2 условия в наше выражение XPath.

  • В случае AND оба условия должны быть выполнены, тогда только он находит элемент.
  • В случае ИЛИ любое из 2 условий должно быть выполнено, тогда только он находит элемент.

Здесь наш XPath-запрос будет похож

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

Тестовые шаги:

  1. Перейти на http://demo.guru99.com/v1/
  2. В этом разделе будет использован вышеуказанный демонстрационный сайт для поиска элементов с различными функциями 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 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();
	}

}

родитель

Используя Parent, вы можете найти родительский узел текущего узла на веб-странице.

Здесь наш XPath-запрос будет похож

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

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();

	}

}

Начинается с

Используя функцию «Начинается с», вы можете найти элемент, атрибут которого динамически изменяется при обновлении или других операциях, таких как нажатие, отправка и т. Д.

Здесь наш 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

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

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

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 не может быть использован для поиска элемента. В такой ситуации нам нужны разные функции из запроса xpath.
  • Есть некоторые важные функции XPath, такие как содержит, родитель, предки, последующий брат и т. Д.
  • С помощью этих функций вы можете создавать сложные выражения XPath.