Come trovare un elemento usando contiene in xpath

Qualcuno può aiutarmi a usare contiene nel mio xpath? Il mio xpath cambia continuamente quando gli utenti vengono aggiunti, quindi non posso “trovare elementi utilizzando xpath.

Questo è il mio 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] 

Cambiamenti quando viene aggiunto un nuovo utente:

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

Aiutami a farlo.

Commenti

  • Condividi il tuo HTML e lelemento che stai cercando di individuare.

Rispondi

Ho testato unapplicazione ExtJS. La maggior parte degli attributi degli elementi della pagina sono dinamici. Cambiano non solo quando aggiungi un nuovo utente o qualcosa del genere, ma cambiano ogni volta che apri lapplicazione.

Ho trovato le espressioni xpath ottenute dagli strumenti (Firebug ecc.) non sono molto utili. Ecco perché:

  1. difficile da leggere
  2. si rompe facilmente
  3. difficile da eseguire il debug

Quello che faccio invece, è piuttosto passare del tempo a guardare lHTML e identificare possibili attributi univoci che non sono dinamici e escogitare le mie espressioni. Se nessuno dei gli attributi sono stati c per un certo elemento, usa qualsiasi altro elemento nella pagina che abbia attributi statici con le relazioni genitore / figlio / fratello da individuare.

Uso spesso “contiene”, ma ce ne sono di più. Di seguito sono riportati alcuni esempi:

  • condizione multipla: //div[@class="bubble-title" and contains(text(), "Cover")]
  • corrispondenza parziale: //span[contains(text(), "Assign Rate")]
  • inizia con: //input[starts-with(@id,"reportcombo")]
  • il valore contiene spazi: //div[./div/div[normalize-space(.)="More Actions..."]]
  • fratello: //td[.="LoadType"]/following-sibling::td[1]/select"
  • più complesso: //td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]

Dai unocchiata alla pagina Funzioni XSL del W3C per altre idee.

Modifica: collegamento aggiornato. Modifica 2: XPATH cambiato

Commenti

  • Grandi esempi! ‘ utilizzo metodi simili per automatizzare unapp JSF con molti moduli dinamici. ‘ ho trovato la specifica W3C molto utile .
  • Che piacere saperlo qualcuno là fuori ha percorso lo stesso sentiero! Grazie!
  • Il precedente collegamento alle specifiche W3C non funziona ora. Consulta invece questa pagina .

Risposta

Dovresti suddividere lxpath per recuperare le singole tabelle per motivi di chiarezza.

Suggerisco quanto segue:

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

Commenti

  • questo ‘ non fornisce davvero alcun esempio su come utilizzare contains

Risposta

Possiamo usare qualcosa come

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

Risposta

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

Questo XPath dovrebbe essere drasticamente ridotto. È probabile che non riesca se stai testando in browser diversi e se qualcosa cambia nella pagina potrebbe generare un falso positivo a causa del fatto che guarda lelemento sbagliato. Consiglio di cercare “XPath relativi” e anche “XPath Axes”, ma potrei dimostrarti un XPath migliore se pubblicassi uno screenshot dellHTML e della pagina web.

In base a ciò che hai pubblicato, potresti fare qualcosa come: //table[@id ="something" o @class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row") o ./text() = "Exact Text Match"]//strong[2]

Di solito con le righe della tabella finisco per identificare la riga in base al testo di una cella allinterno della riga. //table[@id ="something" o @class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row") o ./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match") o ./text() = "Exact Text Match"]

Risposta

Prova con il codice seguente:

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"); } 

Funziona bene per me. Posso trovare qualsiasi testo su qualsiasi xpath utilizzando il codice sopra.

Risposta

Il 2 del tuo XPath cambia da tr[9] a tr[10]. Sembra che il numero del 3 ° “tr” significhi il numero dellutente.

Nella mia pratica, eliminare quel numero può estrarre i dati di tutti gli utenti dallHTML. (testato da 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] 

Risposta

Sebbene siano già presenti molte risposte, puoi anche fare riferimento ai link seguenti:

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

XPath CheatSheet

Risposta

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")] 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *