Quelquun peut-il sil vous plaît maider à utiliser contient dans mon xpath? Mon xpath change tout le temps lorsque des utilisateurs sont ajoutés, donc je ne peux « pas trouver délément en utilisant xpath.
Voici mon 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]
Changements lors de lajout dun nouvel utilisateur:
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]
Aidez-moi à le faire.
Commentaires
- Partagez votre code HTML et lélément que vous essayez de localiser.
Réponse
Jai testé une application ExtJS. La plupart des attributs des éléments de page sont dynamiques. Ils changent non seulement lorsque vous ajoutez un nouvel utilisateur ou quelque chose, mais ils changent à chaque fois que vous ouvrez lapplication.
Jai trouvé les expressions xpath que jobtiens des outils (Firebug etc.) ne sont pas très utiles. Voici pourquoi:
- difficile à lire
- casser facilement
- difficile à déboguer
Ce que je fais à la place, cest plutôt passer du temps à regarder le HTML et à identifier déventuels attributs uniques qui ne sont pas dynamiques et à proposer mes propres expressions. Si aucune des les attributs sont stati c pour un certain élément, utilisez tout autre élément de la page qui a des attributs statiques avec les relations parent / enfant / frère à localiser.
Jutilise souvent « contient », mais il y en a plus. Voici quelques exemples:
- condition multiple:
//div[@class="bubble-title" and contains(text(), "Cover")]
- correspondance partielle:
//span[contains(text(), "Assign Rate")]
- commence par:
//input[starts-with(@id,"reportcombo")]
- la valeur comporte des espaces:
//div[./div/div[normalize-space(.)="More Actions..."]]
- frère / sœur:
//td[.="LoadType"]/following-sibling::td[1]/select"
- plus complexe:
//td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]
Jetez un œil à la page des fonctions XSL du W3C pour dautres idées.
Edit: Lien mis à jour. Edit 2: XPATH changé
Commentaires
- Grands exemples! Jutilise ‘ des méthodes similaires pour automatiser une application JSF avec de nombreux formulaires dynamiques. ‘ jai trouvé la spécification W3C très utile .
- Quel plaisir de savoir cela quelquun là-bas a marché le même chemin! Merci!
- Le lien de spécification précédent du W3C ne fonctionne pas actuellement. Veuillez plutôt vous référer à cette page .
Réponse
Vous devriez diviser le xpath pour récupérer des tables individuelles par souci de clarté.
Je suggère ce qui suit:
// 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()); }
Commentaires
- cela ne ‘ pas vraiment fournir un exemple sur la façon dutiliser
contains
Réponse
Nous pouvons utiliser quelque chose comme
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
Réponse
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]
Ce XPath devrait être considérablement raccourci. Cela échouera probablement si vous testez dans différents navigateurs et si quelque chose change sur la page, cela pourrait générer un faux positif en raison de la recherche du mauvais élément. Je recommande de rechercher « XPaths relatifs » et aussi « XPath Axes », mais je pourrais vous montrer un meilleur XPath si vous publiez une capture décran du HTML et de la page Web.
Daprès ce que vous avez publié, vous pouvez faire quelque chose comme: //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]
Habituellement, avec les lignes de tableau, je finis par identifier la ligne en fonction du texte dune cellule dans la ligne. //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"]
Réponse
Veuillez essayer le code ci-dessous:
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"); }
Cela fonctionne très bien pour moi. Je peux trouver nimporte quel texte sur nimporte quel xpath en utilisant le code ci-dessus.
Réponse
Le 2 de votre XPath change de tr[9]
à tr[10]
. Il semble que le numéro du 3ème « tr » signifie le numéro dutilisateur.
Dans ma pratique, supprimer ce numéro peut extraire toutes les données des utilisateurs du HTML. (testé par 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]
Réponse
Bien que de nombreuses réponses soient déjà présentes, vous pouvez également consulter les liens ci-dessous:
Réponse
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")]