Jak najít prvek pomocí contains obsahuje v xpath

Může mi někdo prosím pomoci, jak používat obsahuje v mém xpath? Můj xpath se neustále mění, když jsou přidáni uživatelé, takže nemohu najít prvek pomocí xpath.

Toto je můj 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] 

Změny při přidání nového uživatele:

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

Pomozte mi, jak to udělat.

Komentáře

  • Sdílejte HTML a prvky, které se pokoušíte najít.

Odpovědět

Testoval jsem aplikaci ExtJS. Většina atributů prvku stránky je dynamická. Mění se nejen při přidání nového uživatele nebo tak něco, mění se pokaždé, když otevřete aplikaci.

Zjistil jsem výrazy xpath, které získávám z nástrojů (Firebug atd.), nejsou příliš užitečné. Důvod:

  1. těžko čitelný
  2. snadno se rozbije
  3. těžko laditelné

Co místo toho dělám, je spíše trávit čas prohlížením HTML a identifikováním možných jedinečných atributů, které nejsou dynamické, a přijít s mými vlastními výrazy. Pokud žádný z atributy jsou stati c pro určitý prvek použijte k vyhledání jakýkoli jiný prvek na stránce, který má statické atributy se vztahy rodič / dítě / sourozenec.

Často používám „contains“, ale je jich více. Zde je několik příkladů:

  • vícenásobná podmínka: //div[@class="bubble-title" and contains(text(), "Cover")]
  • částečná shoda: //span[contains(text(), "Assign Rate")]
  • začíná: //input[starts-with(@id,"reportcombo")]
  • hodnota obsahuje mezery: //div[./div/div[normalize-space(.)="More Actions..."]]
  • sourozenec: //td[.="LoadType"]/following-sibling::td[1]/select"
  • složitější: //td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]

Podívejte se na stránku funkcí W3C XSL pro další nápady.

Upravit: Odkaz byl aktualizován. Edit 2: XPATH changed

Komentáře

  • Skvělé příklady! ‚ m používám podobné metody pro automatizaci aplikace JSF s mnoha dynamickými formami. ‚ shledal jsem specifikaci W3C velmi užitečnou .
  • s potěšením to vědět někdo tam šel stejnou cestou! Děkuji!
  • Předchozí odkaz se specifikací W3C nyní nefunguje. Místo toho přejděte na tuto stránku .

Odpovědět

Chcete-li načíst jednotlivé tabulky, měli byste kvůli jasnosti rozdělit cestu xpath.

Navrhuji následující:

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

Komentáře

  • toto ‚ ve skutečnosti neposkytuje žádný příklad, jak používat contains

Odpověď

Můžeme použít něco jako

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

Odpověď

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

XPath by měl být drasticky zkrácen. To pravděpodobně selže, pokud testujete v různých prohlížečích a pokud se na stránce někdy něco změní, mohlo by to vyvolat falešně pozitivní výsledek při pohledu na nesprávný prvek. Doporučuji vyhledat „Relativní XPath“ a také „XPath Axes“, ale mohl bych vám předvést lepší XPath, pokud byste zveřejnili snímek obrazovky s HTML a webovou stránkou.

Na základě toho, co jste zveřejnili, můžete udělat něco jako: //table[@id ="something" nebo @class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row") nebo ./text() = "Exact Text Match"]//strong[2]

Obvykle u řádků tabulky nakonec identifikuji řádek na základě textu z buňky v řádku. //table[@id ="something" nebo @class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row") nebo ./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match") nebo ./text() = "Exact Text Match"]

Odpověď

Zkuste prosím následující kód:

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

Pro mě to funguje dobře. Pomocí výše uvedeného kódu najdu jakýkoli text na libovolné cestě xpath.

Odpovědět

2 z vašich XPath se změní z tr[9]tr[10]. Zdá se, že číslo 3. „tr“ znamená číslo uživatele.

Podle mé praxe může toto číslo smazat data všech uživatelů z HTML. (testováno 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] 

Odpověď

Ačkoli již existuje mnoho odpovědí, můžete také odkázat na následující odkazy:

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

XPath CheatSheet

Odpověď

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *