Como encontrar o elemento usando contains em xpath

Alguém pode me ajudar como usar contains em meu xpath? Meu xpath muda o tempo todo quando usuários são adicionados, então não consigo encontrar o elemento usando o xpath.

Este é o meu xpath:

.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[9]/td/table/tbody/tr/td[1]/strong[2] 

Alterações quando um novo usuário é adicionado:

.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2] 

Por favor, me ajude como fazer isso.

Comentários

  • Compartilhe seu HTML e elemento que você está tentando localizar.

Resposta

Eu testei um aplicativo ExtJS. A maioria dos atributos dos elementos da página são dinâmicos. Eles mudam não apenas quando você adiciona um novo usuário ou algo assim, eles mudam toda vez que você abre o aplicativo.

Eu descobri as expressões xpath que obtenho das ferramentas (Firebug etc.) não são muito úteis. Aqui está o porquê:

  1. difícil de ler
  2. quebram facilmente
  3. difícil de depurar

O que eu faço, em vez disso, é passar um tempo olhando para o HTML e identificar possíveis atributos únicos que não são dinâmicos e criar minhas próprias expressões. Se nenhum dos atributos são stati c para um determinado elemento, use qualquer outro elemento na página que tenha atributos estáticos com as relações pai / filho / irmão para localizar.

Costumo usar “contém”, mas há mais. Aqui estão alguns exemplos:

  • condição múltipla: //div[@class="bubble-title" and contains(text(), "Cover")]
  • correspondência parcial: //span[contains(text(), "Assign Rate")]
  • começa com: //input[starts-with(@id,"reportcombo")]
  • o valor tem espaços: //div[./div/div[normalize-space(.)="More Actions..."]]
  • irmão: //td[.="LoadType"]/following-sibling::td[1]/select"
  • mais complexo: //td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]

Dê uma olhada na página W3C XSL Functions para mais algumas idéias.

Editar: Link atualizado. Edição 2: XPATH alterado

Comentários

  • Ótimos exemplos! Eu ‘ estou usando métodos semelhantes para automatizar um aplicativo JSF com muitos formulários dinâmicos. Eu ‘ achei a especificação W3C muito útil .
  • Que prazer saber disso alguém aí já percorreu o mesmo caminho! Obrigado!
  • O link de especificação W3C anterior não está funcionando agora. Em vez disso, consulte esta página .

Resposta

Você deve dividir o xpath para buscar tabelas individuais para fins de clareza.

Eu sugiro o seguinte:

// Get the content or container WebElement content = driver.findElement(By.id("contentText")); //Get the table of users WebElement tblUsers = content.findElement(By.xpath(".//table/tbody/tr[2]/td/table/tbody/tr/td[1]/table")); // Get the rows which change always as and when users are added WebElement allUsers = tblUsers.findElements(By.xpath(".//tbody/tr")); // Loop through each row of users table for(WebElement user : allUsers) { // Get the username WebElement username = user.findElement(By.xpath(".//td/table/tbody/tr/td[1]/strong[2]")); System.out.println("Username: " + username.getText()); } 

Comentários

  • isso não ‘ realmente fornece qualquer exemplo de como usar contains

Resposta

Podemos usar algo como

By.xpath("//td[contains(text(),"youruser")]") //here user text is case sensitive

By.xpath("//td[contains(lower-case(text()),"youruser")]") //to handle case sensitivity. Here user is not case sensitive

Resposta

.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2] 

Esse XPath deve ser drasticamente reduzido. É provável que isso falhe se você estiver testando em navegadores diferentes e se alguma coisa mudar na página, isso pode gerar um falso positivo por olhar para o elemento errado. Eu recomendo procurar “XPaths Relativos” e também “XPath Axes”, mas eu poderia demonstrar um XPath melhor para você se você postasse uma captura de tela do HTML e da página da web.

Com base no que você postou, você poderia fazer algo como: //table[@id ="something" ou @class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row") ou ./text() = "Exact Text Match"]//strong[2]

Normalmente, com as linhas da tabela, acabo identificando a linha com base no texto de uma célula dentro da linha. //table[@id ="something" ou @class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row") ou ./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match") ou ./text() = "Exact Text Match"]

Resposta

Por favor, tente o código abaixo:

public List<WebElement> getText(String xpath) throws Exception { return driver.findElements(By.xpath(xpath)).getText(); } if(tool.getText("//\*[@id="contentText"]//\*/table//\*/strong").contains("<yourtext>")) { system.out.println("Your text is available in the particular xpath"); } else { system.out.println("Your text is not available in the particular xpath"); } 

Está funcionando bem para mim. Posso encontrar qualquer texto em qualquer xpath usando o código acima.

Resposta

O 2 de seu XPath muda de tr[9] para tr[10]. Parece que o número do terceiro “tr” significa o número do usuário.

Na minha prática, excluir esse número pode extrair todos os dados de usuários “do HTML. (testado por RSelenium + rvest):

.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr/td/table/tbody/tr/td[1]/strong[2] 

Resposta

Embora muitas respostas já estejam presentes, você também pode consultar os links abaixo:

https://medium.com/edureka/xpath-in-selenium-cd659373e01a

XPath CheatSheet

Resposta

XPATH

driver.findElement(By.xpath("/html/body/div/input[1]")).sendKeys("123"); driver.findElement(By.xpath("//input[1]")).click(); driver.findElement(By.xpath("(//input[1])[4])")).click(); driver.findElement(By.xpath("//tag[@AN="AV"]")).sendKeys("123"); driver.findElement(By.xpath("//tag[text()="AV"]")).sendKeys("123"); driver.findElement(By.xpath("//tag[@AN="AV" and @AN="AV"]")).click(); driver.findElement(By.xpath("//tag[contains(text(),"usrn")]").getText(); driver.findElement(By.xpath("//tag[contains(@AN,"usrn")]").getText(); driver.findElement(By.xpath("//tag[starts-with(text(),"usrn")]").getText(); driver.findElement(By.xpath("//tag[starts-with(@AN,"usrn")]").getText(); ex : //input[starts-with(@id,"reportcombo")] 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *