Если простой XPath не может найти сложный веб-элемент для нашего тестового сценария, нам нужно использовать функции из библиотеки XPath 1.0. Комбинируя эти функции, мы можем создать более конкретный XPath. Давайте обсудим 3 такие функции -
- Содержит
- Брат или сестра
- Предок
- И ИЛИ
- Родитель
- Начинается с
- Топоры XPath
Давайте изучим их подробно -
Что содержит () в селене?
contains () в Selenium - это функция в выражении Xpath, которая используется для поиска веб-элементов, содержащих определенный текст. Мы можем извлечь все элементы, соответствующие заданному текстовому значению, с помощью функции XPath contains () на всей веб-странице. Содержит в XPath есть возможность найти элемент с частичным текстом.
Бывший. Здесь мы ищем якорь. Содержит текст как «SAP M».
"// h4 / a [содержит (text (), 'SAP M')]"
ПРИМЕЧАНИЕ. Вы можете попрактиковаться в следующем упражнении XPath на этом http://demo.guru99.com/test/selenium-xpath.html.
Что такое Sibling в Selenium Webdriver?
Родственный элемент в Selenium Webdriver - это функция, используемая для выборки веб-элемента, который является родственником родительского элемента. Если родительский элемент известен, то можно легко найти или найти веб-элемент, который может использовать атрибут sibling выражения Xpath в selenium webdriver.
Родственный брат в примере XPath: здесь на основе родственного элемента 'a' мы находим 'h4'
"// div [@ class = 'canvas- graph'] // a [@href = '/ Accounting.html'] [i [@ class = 'icon-usd']] / following-sibling :: h4»
Предок : чтобы найти элемент на основе родительского элемента, мы можем использовать атрибут предка XPath.
Давайте разберемся с этими 3 функциями на примере -
Шаги тестирования
Примечание. С момента создания учебника домашняя страница Guru99 была обновлена, поэтому для запуска тестов используйте демонстрационный сайт.
- Перейдите на http://demo.guru99.com/test/guru99home/
- В разделе «Некоторые из наших самых популярных курсов» выполните поиск по всем веб-элементам, которые являются родственниками веб-элемента, текст которого - «SELENIUM».
- Мы найдем элемент, используя XPath text contains, ancestor и sibling.
ИСПОЛЬЗОВАНИЕ Contains и XPath 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;открытый класс SiblingAndParentInXpath {@Тестpublic void testSiblingAndParentInXpath () {Драйвер WebDriver;String driverPath = "C: \\ geckodriver.exe";System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новый FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/test/guru99home/");// Поиск элемента внутри 'Popular course', который является братом элемента управления 'SELENIUM'. Здесь сначала мы найдем h2 с текстом «Несколько наших самых популярных курсов», затем мы перейдем к его родительскому элементу, который является div ', внутри этого div мы найдем ссылку, текст которой -' SELENIUM ', тогда, наконец, мы найдем все родственные элементы этой ссылки (' SELENIUM ')ListdateBox = driver.findElements (By.xpath ("// h2 [contains (text (), 'Несколько наших самых популярных курсов')] / parent :: div // div [// a [text () = 'СЕЛЕНА']] / следующий-брат :: div [@ class = 'rt-grid-2 rt-omega'] "));// Вывести все элементы, являющиеся родственниками элемента с именем «SELENIUM» в «Популярном курсе»для (WebElement webElement: dateBox) {System.out.println (webElement.getText ());}driver.close ();}}
Результат будет таким:
Предок в Selenium Webdriver
Предок в Selenium Webdriver - это функция, используемая для поиска предка определенного члена на указанном уровне. Уровень предка, который должен быть возвращен, или уровень предка относительно уровня члена могут быть явно указаны. Он возвращает количество иерархических шагов от предка, определяя местонахождение указанного предка, которого хочет пользователь.
Теперь предположим, что нам нужно выполнить поиск по всем элементам в разделе «Популярный курс» с помощью предка якоря, текст которого - «SELENIUM».
Здесь наш запрос xpath будет похож на
"//div[.//a[text()='SELENIUM' sizesune/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 {@Тестpublic void testAncestorInXpath () {Драйвер WebDriver = новый FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/test/guru99home/");// Поиск по всем элементам в разделе "Популярный курс"// с помощью предка якоря, текст которого - SELENIUMСписокdateBox = driver.findElements (By.xpath ("// div [.// a [text () = 'SELENIUM']] / ancestor :: div [@ class = 'rt-grid-2 rt- omega '] / следующий-брат :: div "));// Вывести все элементы, являющиеся родственниками элемента с именем 'SELENIUM' в 'Popular course'для (WebElement webElement: dateBox) {System.out.println (webElement.getText ());}driver.quit ();}}
Результат будет выглядеть так:
Использование И и ИЛИ
Используя AND и OR, вы можете поместить 2 условия в наше выражение XPath.
- В случае И оба условия должны быть истинными, тогда только он находит элемент.
- В случае ИЛИ любое из двух условий должно быть истинным, тогда только элемент находит элемент.
Здесь наш запрос XPath будет похож на
Xpath = // * [@ type = 'submit' OR @ name = 'btnReset']
Xpath = // input [@ type = 'submit' и @ name = 'btnLogin']
Шаги тестирования:
- Перейдите на http://demo.guru99.com/v1/
- В разделе будет использоваться демонстрационный сайт, показанный выше, для поиска элемента с различными функциями XPath.
Вы найдете элемент, использующий оси И и ИЛИ, родительский элемент, начало с и оси XPath.
И ИЛИ Пример
import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;публичный класс AND_OR {public static void main (String [] args) {Драйвер WebDriver;WebElement w, x;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");драйвер = новый ChromeDriver ();// Запускаем приложениеdriver.get ("https://www.guru99.com/");// Поиск элемента с помощью ИЛИ в xpathw = driver.findElement (By.xpath ("// * [@ type = 'submit' OR @ name = 'btnReset']"));// Распечатываем текст элементаSystem.out.println (w.getText ());// Поиск элемента с помощью И в xpathx = driver.findElement (By.xpath ("// input [@ type = 'submit' и @ name = 'btnLogin']"));// Распечатываем текст искомого элементаSystem.out.println (x.getText ());// Закрываем браузерdriver.quit ();}}
Что такое родитель в селене?
Родительский узел в Selenium - это метод, используемый для получения родительского узла текущего узла, выбранного на веб-странице. Это очень полезно в ситуации, когда вы выбираете элемент и вам нужно получить родительский элемент с помощью Xpath. Этот метод также используется для получения родительского объекта.
Здесь наш запрос XPath будет похож на
Xpath = // * [@ id = 'rt-feature'] // parent :: div
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;WebElement w;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");драйвер = новый ChromeDriver ();// Запускаем приложениеdriver.get ("https://www.guru99.com/");// Поиск элемента с помощью PARENTw = driver.findElement (By.xpath ("// * [@ id = 'rt-feature'] // parent :: div"));// Распечатываем текст искомого элементаSystem.out.println (w.getText ());// Закрываем браузерdriver.quit ();}}
Начинается с
Используя функцию Starts-with, вы можете найти элемент, атрибут которого динамически изменяется при обновлении или других операциях, таких как щелчок, отправка и т. Д.
Здесь наш запрос XPath будет похож на
Xpath = // метка [начинается с (@ id, 'message')]
import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;открытый класс StartsWith {public static void main (String [] args) {Драйвер WebDriver;WebElement w;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");драйвер = новый ChromeDriver ();// Запускаем приложениеdriver.get ("https://www.guru99.com/");// Ищем элемент, используя начинается сw = driver.findElement (By.xpath ("// метка [начинается с (@ id, 'message')]"));// Распечатываем текст искомого элементаSystem.out.println (w.getText ());// Закрываем браузерdriver.quit ();}}
Оси Xpath
Используя оси XPath, вы можете найти динамические и очень сложные элементы на веб-странице. Оси XPath содержат несколько методов поиска элемента. Здесь мы обсудим несколько методов.
следующее : Эта функция вернет непосредственный элемент конкретного компонента.
Здесь наш запрос XPath будет похож на
Xpath = // * [@ type = 'text'] // после :: input
XPath, используя следующие
import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;public class Follow {public static void main (String [] args) {Драйвер WebDriver;WebElement w;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");драйвер = новый ChromeDriver ();// Запускаем приложениеdriver.get ("https://www.guru99.com/");// Ищем элемент, используя следующий методw = driver.findElement (By.xpath ("// * [@ type = 'text'] // после :: input"));// Распечатываем текст искомого элементаSystem.out.println (w.getText ());// Закрываем браузерdriver.quit ();}}
Предшествующий: эта функция вернет предыдущий элемент конкретного элемента.
Здесь наш запрос XPath будет похож на
Xpath = // * [@ type = 'submit'] // предшествующий :: input
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;WebElement w;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");драйвер = новый ChromeDriver ();// Запускаем приложениеdriver.get ("https://www.guru99.com/");// Ищем элемент, используя предыдущий методw = driver.findElement (By.xpath ("// * [@ type = 'submit'] // предшествующий :: input"));// Распечатать искомый элементSystem.out.println (w.getText ());// Закрываем браузерdriver.quit ();}}
г) Потомок: эта функция вернет элемент-потомок конкретного элемента.
Здесь наш запрос XPath будет похож на
Xpath = // * [@ id = 'rt-feature'] // потомок :: a
XPath с использованием Descendant
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;WebElement w;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");драйвер = новый ChromeDriver ();// Запускаем приложениеdriver.get ("https://www.guru99.com/");// Ищем элемент, используя метод-потомокw = driver.findElement (By.xpath ("// * [@ id = 'rt-feature'] // потомок :: a"));// Распечатать искомый элементSystem.out.println (w.getText ());// Закрываем браузерdriver.quit ();}}
Резюме
- Бывают ситуации, когда обычный XPath не может быть использован для поиска элемента. В такой ситуации нам нужны разные функции из запроса xpath.
- Есть некоторые важные функции XPath, такие как XPath contains, parent, ancestors, following-sibling и т. Д.
- С помощью этих функций вы можете создавать сложные выражения XPath.