Hogyan találhatunk meg elemet az xpath használatával

Tudna valaki segíteni abban, hogy miként használhatom az xpath tartalmát? Az xpath a felhasználók hozzáadásakor folyamatosan változik, ezért nem találom az elemet az xpath használatával.

Ez az én 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] 

Változások az új felhasználó hozzáadásakor:

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

Kérem, segítsen nekem, hogyan kell elkészíteni.

Megjegyzések

  • Oszd meg a HTML-t és a megkeresni kívánt elemet.

Válasz

Teszteltem egy ExtJS alkalmazást. A legtöbb oldalelem attribútum dinamikus. Ezek nem csak akkor változnak, amikor új felhasználót vagy valamit hozzáad, hanem minden alkalommal, amikor megnyitja az alkalmazást.

Megtaláltam az eszközökből nyert xpath-kifejezések (Firebug stb.) nem túl hasznosak. Ezért van az oka:

  1. nehezen olvasható
  2. könnyen törik
  3. nehezen hibakereshető

Amit inkább teszek, az az, hogy időt fordítok a HTML-re, és azonosítom azokat a lehetséges egyedi attribútumokat, amelyek nem dinamikusak, és saját kifejezéseimmel állnak elő. az attribútumok statiák c egy bizonyos elemhez használja az oldal bármely más elemét, amelynek statikus attribútumai vannak a szülő / gyermek / testvér kapcsolatokkal.

Gyakran használom a “tartalmaz” szót, de vannak ennél is több. Íme néhány példa:

  • több feltétel: //div[@class="bubble-title" and contains(text(), "Cover")]
  • részleges egyezés: //span[contains(text(), "Assign Rate")]
  • kezdődik: //input[starts-with(@id,"reportcombo")]
  • az érték szóközökkel rendelkezik: //div[./div/div[normalize-space(.)="More Actions..."]]
  • testvér: //td[.="LoadType"]/following-sibling::td[1]/select"
  • összetettebb: //td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]

További ötleteket nézzen meg a W3C XSL függvények oldalán.

Szerkesztés: A link frissítve. 2. szerkesztés: Az XPATH megváltozott

Megjegyzések

  • Nagyszerű példák! ‘ hasonló módszereket használok a sok dinamikus formát tartalmazó JSF-alkalmazás automatizálására. ‘ nagyon hasznosnak találtam a W3C specifikációt .
  • Milyen öröm ezt tudni valaki odakint ugyanazt az utat járt! Köszönjük!
  • Az előző W3C specifikációs link most nem működik. Kérjük, inkább ezen az oldalon olvassa el.

Válasz

Az egyértelműség kedvéért fel kell osztania az xpath-t az egyes táblák lekéréséhez.

A következőket javaslom:

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

Megjegyzések

  • ez nem ‘ nem igazán ad példát a contains használatára

Válasz

Használhatunk például

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

Válasz

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

Az XPath-ot drasztikusan le kell rövidíteni. Ez valószínűleg kudarcot vall, ha különböző böngészőkben tesztel, és ha bármi megváltozik az oldalon, akkor téves pozitív eredményt adhat, mert rossz elemet néz. Azt javaslom, hogy keresse meg a “Relatív XPath-ok” és az “XPath-tengelyek” elemeket, de jobb XPath-t tudnék bemutatni az Ön számára, ha közzétesz egy képernyőképet a HTML-ről és a weboldalról.

Az általad közzétett alapján olyasmit tehet, hogy: //table[@id ="something" vagy @class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row") vagy ./text() = "Exact Text Match"]//strong[2]

Általában táblasorokkal végül azonosítom a sort a soron belüli cellából származó szöveg alapján. //table[@id ="something" vagy @class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row") vagy ./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match") vagy ./text() = "Exact Text Match"]

Válasz

Kérjük, próbálja meg az alábbi kódot:

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

Nekem jól működik. Bármely szöveget megtalálhatok bármelyik xpath-on a fenti kód használatával.

Válasz

Az XPath 2-je tr[9]tr[10]. Úgy tűnik, hogy a 3. “tr” száma felhasználói számot jelent.

Gyakorlatom szerint ez a szám törölheti az összes felhasználó adatait a HTML-ből. (RSelenium + rvest tesztelte):

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

Válasz

Bár már sok válasz van, az alábbi linkekre is hivatkozhat:

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

XPath csalólap

Válasz

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük