Se um XPath simples não puder encontrar um elemento da web complicado para nosso script de teste, precisamos usar as funções da biblioteca XPath 1.0. Com a combinação dessas funções, podemos criar XPath mais específico. Vamos discutir 3 dessas funções -
- Contém
- Irmão
- Antepassado
- E OU
- Pai
- Começa com
- Eixos XPath
Vamos estudá-los em detalhes -
O que contém () no selênio?
contains () no Selenium é uma função dentro da expressão Xpath que é usada para pesquisar os elementos da web que contêm um determinado texto. Podemos extrair todos os elementos que correspondem ao valor de texto fornecido usando a função XPath contains () em toda a página da web. Contém em XPath tem capacidade de localizar o elemento com texto parcial.
Ex. Aqui, estamos pesquisando uma âncora que contém texto como 'SAP M'.
"// h4 / a [contém (text (), 'SAP M')]"
NOTA: Você pode praticar o seguinte exercício XPath neste http://demo.guru99.com/test/selenium-xpath.html
O que é irmão no Selenium Webdriver?
Um irmão no Selenium Webdriver é uma função usada para buscar um elemento da web que é irmão do elemento pai. Se o elemento pai for conhecido, então o elemento web pode ser facilmente encontrado ou localizado, podendo usar o atributo sibling da expressão Xpath no selenium webdriver.
Exemplo de irmão em XPath: aqui, com base no elemento irmão de 'a', estamos encontrando 'h4'
"// div [@ class = 'canvas- graph'] // a [@href = '/ accounting.html'] [i [@ class = 'icon-usd']] / following-sibling :: h4"
Ancestral : Para encontrar um elemento com base no elemento pai, podemos usar o atributo ancestral do XPath.
Vamos entender essas 3 funções usando um exemplo -
Etapas de teste
Nota: Desde a data de criação do tutorial, a página inicial do Guru99 foi atualizada, então use o site de demonstração para executar testes
- Vá para http://demo.guru99.com/test/guru99home/
- Na seção 'Alguns de nossos cursos mais populares', pesquise todos os Web Elements que são irmãos de um WebElement cujo texto é 'SELENIUM'
- Encontraremos o elemento usando o texto XPath contém, ancestral e função de irmão.
USANDO Contém e irmão XPath
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 {@Testepublic void testSiblingAndParentInXpath () {Driver WebDriver;String driverPath = "C: \\ geckodriver.exe";System.setProperty ("webdriver.gecko.driver", driverPath);driver = novo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/test/guru99home/");// Pesquisar elemento dentro de 'Curso popular' que são irmãos do controle 'SELENIUM'. Aqui, primeiro encontraremos um h2 cujo texto é '' Alguns de nossos cursos mais populares ', então passamos para seu elemento pai que é um' div ', dentro deste div encontraremos um link cujo texto é' SELENIUM 'e, por fim, encontraremos todos os elementos irmãos deste link (' SELENIUM ')ListdateBox = driver.findElements (By.xpath ("// h2 [contains (text (), 'Alguns de nossos cursos mais populares')] / parent :: div // div [// a [text () = 'SELENIUM']] / following-sibling :: div [@ class = 'rt-grid-2 rt-omega'] "));// Imprime todos os que são irmãos do elemento nomeado como 'SELENIUM' em 'Curso popular'para (WebElement webElement: dateBox) {System.out.println (webElement.getText ());}driver.close ();}}
O resultado será como:
Ancestral em Selenium Webdriver
Ancestral no Selenium Webdriver é uma função usada para encontrar o ancestral de um membro específico na camada especificada. O nível do ancestral a ser retornado ou o nível do ancestral em relação ao nível do membro pode ser especificado explicitamente. Ele retorna o número de etapas hierárquicas do ancestral, localizando o ancestral especificado que o usuário deseja.
Agora suponha que precisamos Pesquisar todos os elementos na seção 'Curso popular' com a ajuda do ancestral da âncora cujo texto é 'SELENIUM'
Aqui, nossa consulta xpath será como
"//div[.//a[text()='SELENIUM']]/ancestor::div[@class='rt-grid-2 rt-omega '] / following-sibling :: div"
Código Completo
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 {@Testepublic void testAncestorInXpath () {Driver WebDriver = novo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/test/guru99home/");// Pesquisar todos os elementos na seção 'Curso popular'// com a ajuda do ancestral da âncora cujo texto é 'SELENIUM'ListdateBox = driver.findElements (By.xpath ("// div [.// a [text () = 'SELENIUM']] / ancestor :: div [@ class = 'rt-grid-2 rt- omega '] / seguinte-irmão :: div "));// Imprime todos os que são irmãos do elemento nomeado como 'SELENIUM' em 'Curso popular'para (WebElement webElement: dateBox) {System.out.println (webElement.getText ());}driver.quit ();}}
A saída será semelhante a-
Usando AND e OR
Usando AND e OR, você pode colocar 2 condições em nossa expressão XPath.
- No caso de AND, as duas condições devem ser verdadeiras, então apenas ele encontra o elemento.
- No caso de OR, qualquer uma das 2 condições deve ser verdadeira, então apenas ela encontra o elemento.
Aqui, nossa consulta XPath será como
Xpath = // * [@ type = 'submit' OR @ name = 'btnReset']
Xpath = // input [@ type = 'submit' and @ name = 'btnLogin']
Etapas do teste:
- Vá para http://demo.guru99.com/v1/
- Na seção, usaremos o site de demonstração acima para pesquisar elementos com diferentes funções do XPath.
Você encontrará um elemento usando os eixos AND e OR, pai, começa com e XPath
AND OR Exemplo
import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;classe pública AND_OR {public static void main (String [] args) {Driver WebDriver;WebElement w, x;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");driver = novo ChromeDriver ();// Inicie o aplicativodriver.get ("https://www.guru99.com/");// Pesquisar elemento usando OR no xpathw = driver.findElement (By.xpath ("// * [@ type = 'submit' OR @ name = 'btnReset']"));// Imprime o texto do elementoSystem.out.println (w.getText ());// Pesquisar elemento usando AND no xpathx = driver.findElement (By.xpath ("// input [@ type = 'submit' and @ name = 'btnLogin']"));// Imprime o texto do elemento pesquisadoSystem.out.println (x.getText ());// Feche o navegadordriver.quit ();}}
O que é o pai no selênio?
Pai no Selenium é um método usado para recuperar o nó pai do nó atual selecionado na página da web. É muito útil na situação em que você seleciona um elemento e precisa obter o elemento pai usando o Xpath. Este método também é usado para obter o pai do pai.
Aqui, nossa consulta XPath será como
Xpath = // * [@ id = 'rt-feature'] // pai :: div
XPath usando pai
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) {Driver WebDriver;WebElement w;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");driver = novo ChromeDriver ();// Inicie o aplicativodriver.get ("https://www.guru99.com/");// Pesquise o elemento usando PARENTw = driver.findElement (By.xpath ("// * [@ id = 'rt-feature'] // pai :: div"));// Imprime o texto do elemento pesquisadoSystem.out.println (w.getText ());// Feche o navegadordriver.quit ();}}
Começa com
Usando a função Starts-with, você pode encontrar o elemento cujo atributo muda dinamicamente na atualização ou em outras operações como clicar, enviar, etc.
Aqui, nossa consulta XPath será como
Xpath = // rótulo [começa com (@ id, 'mensagem')]
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) {Driver WebDriver;WebElement w;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");driver = novo ChromeDriver ();// Inicie o aplicativodriver.get ("https://www.guru99.com/");// Pesquise o elemento usando começa comw = driver.findElement (By.xpath ("// rótulo [começa com (@ id, 'mensagem')]"));// Imprime o texto do elemento pesquisadoSystem.out.println (w.getText ());// Feche o navegadordriver.quit ();}}
Eixos Xpath
Usando eixos XPath, você pode encontrar os elementos dinâmicos e muito complexos em uma página da web. Os eixos XPath contêm vários métodos para localizar um elemento. Aqui, discutirei alguns métodos.
seguinte : Esta função retornará o elemento imediato do componente específico.
Aqui, nossa consulta XPath será como
Xpath = // * [@ type = 'text'] // seguindo :: input
XPath usando o seguinte
import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;public class Seguindo {public static void main (String [] args) {Driver WebDriver;WebElement w;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");driver = novo ChromeDriver ();// Inicie o aplicativodriver.get ("https://www.guru99.com/");// Pesquise o elemento usando o método seguintew = driver.findElement (By.xpath ("// * [@ type = 'text'] // seguinte :: input"));// Imprime o texto do elemento pesquisadoSystem.out.println (w.getText ());// Feche o navegadordriver.quit ();}}
Precedente: esta função retornará o elemento anterior do elemento específico.
Aqui, nossa consulta XPath será como
Xpath = // * [@ type = 'submit'] // precedendo :: input
XPath usando precedente
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) {Driver WebDriver;WebElement w;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");driver = novo ChromeDriver ();// Inicie o aplicativodriver.get ("https://www.guru99.com/");// Pesquise o elemento usando o método anteriorw = driver.findElement (By.xpath ("// * [@ type = 'submit'] // precedente :: input"));// Imprime o elemento pesquisadoSystem.out.println (w.getText ());// Feche o navegadordriver.quit ();}}
d) Descendente: Esta função retornará o elemento descendente do elemento particular.
Aqui, nossa consulta XPath será como
Xpath = // * [@ id = 'rt-feature'] // descendente :: a
XPath usando 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) {Driver WebDriver;WebElement w;System.setProperty ("webdriver.chrome.driver", "E: //Selenium//Selenium_Jars//chromedriver.exe");driver = novo ChromeDriver ();// Inicie o aplicativodriver.get ("https://www.guru99.com/");// Pesquise o elemento usando o método descendentew = driver.findElement (By.xpath ("// * [@ id = 'rt-feature'] // descendente :: a"));// Imprime o elemento pesquisadoSystem.out.println (w.getText ());// Feche o navegadordriver.quit ();}}
Resumo
- Existem algumas situações em que o XPath regular não pode ser usado para localizar um elemento. Em tal situação, precisamos de funções diferentes da consulta xpath.
- Existem algumas funções XPath importantes, como XPath contém, pai, ancestrais, irmão seguinte, etc.
- Com a ajuda dessas funções, você pode criar expressões XPath complexas.