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:
- nehezen olvasható
- könnyen törik
- 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:
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")]