Poate cineva să mă ajute să folosesc conținutul în xpath? Xpath-ul meu se schimbă tot timpul când sunt adăugați utilizatorii, așa că nu pot găsi element folosind xpath.
Acesta este xpath-ul meu:
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[9]/td/table/tbody/tr/td[1]/strong[2]
Modificări la adăugarea unui utilizator nou:
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]
Vă rog să mă ajutați cum să o fac.
Comentarii
- Distribuiți-vă codul HTML și elementul pe care încercați să îl localizați.
Răspundeți
Am testat o aplicație ExtJS. Majoritatea atributelor elementului de pagină sunt dinamice. Acestea se schimbă nu numai atunci când adăugați un utilizator nou sau ceva, ci se schimbă de fiecare dată când deschideți aplicația. expresiile xpath pe care le obțin din instrumente (Firebug etc.) nu sunt foarte utile. Iată de ce:
- greu de citit
- rupe ușor
- greu de depanat
Ceea ce fac în schimb, este mai degrabă să petrec timp uitându-mă la HTML și să identific posibile atribute unice care nu sunt dinamice și să vină cu propriile mele expresii. Dacă niciuna dintre atributele sunt stati c pentru un anumit element, utilizați orice alt element de pe pagină care are atribute statice cu relațiile părinte / copil / frate pentru a localiza.
De multe ori folosesc „conține”, dar există mai multe. Iată câteva exemple:
- condiție multiplă:
//div[@class="bubble-title" and contains(text(), "Cover")]
- potrivire parțială:
//span[contains(text(), "Assign Rate")]
- începe-cu:
//input[starts-with(@id,"reportcombo")]
- valoarea are spații:
//div[./div/div[normalize-space(.)="More Actions..."]]
- frate:
//td[.="LoadType"]/following-sibling::td[1]/select"
- mai complex:
//td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]
Aruncați o privire la pagina Funcții W3C XSL pentru mai multe idei.
Editare: Link actualizat. Ediția 2: XPATH s-a schimbat
Comentarii
- Exemple grozave! Eu ‘ folosesc metode similare pentru automatizarea unei aplicații JSF cu o mulțime de forme dinamice. ‘ am găsit specificația W3C foarte utilă .
- Ce plăcere să știi că cineva de acolo a mers pe aceeași cale! Vă mulțumim!
- Legătura anterioară cu specificații W3C nu funcționează acum. Vă rugăm să consultați această pagină .
Răspuns
Ar trebui să împărțiți xpath pentru a prelua tabele individuale din motive de claritate.
Vă sugerez următoarele:
// 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()); }
Comentarii
- acest lucru nu oferă ‘ într-adevăr niciun exemplu despre modul de utilizare a
contains
Răspuns
Putem folosi ceva de genul
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ăspuns
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]
Acel XPath ar trebui scurtat drastic. Este posibil să nu reușească dacă testați în diferite browsere și dacă se schimbă vreodată ceva pe pagină, ar putea genera un fals pozitiv datorită faptului că privește elementul greșit. Vă recomand să căutați „XPath-uri relative” și, de asemenea, „XPath Axes”, dar aș putea demonstra un XPath mai bun dacă ați postat o captură de ecran a HTML și a paginii web.
Pe baza a ceea ce ați postat, ai putea face ceva de genul: //table[@id ="something"
sau @class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row")
sau ./text() = "Exact Text Match"]//strong[2]
De obicei, cu rânduri de tabel ajung să identific rândul pe baza textului dintr-o celulă din rând. //table[@id ="something"
sau @class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row")
sau ./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match")
sau ./text() = "Exact Text Match"]
Răspuns
Vă rugăm să încercați codul de mai jos:
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"); }
Funcționează bine pentru mine. Pot găsi orice text pe orice xpath folosind codul de mai sus.
Răspuns
Cele 2 din XPath se schimbă din tr[9]
la tr[10]
. Se pare că numărul celui de-al treilea „tr” înseamnă numărul de utilizator.
În practica mea, ștergeți numărul care poate extrage toate datele utilizatorilor din HTML. (testat de 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ăspuns
Deși multe răspunsuri sunt deja prezente, puteți consulta și linkurile de mai jos:
Răspuns
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")]