Kuinka löytää elementti käyttäen xpath-tiedostoa

Voiko joku auttaa minua käyttämään sisältöä xpathissani? Xpathini muuttuu koko ajan, kun käyttäjiä lisätään, joten en löydä elementtiä xpathilla.

Tämä on minun 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] 

Muutokset, kun uusi käyttäjä lisätään:

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

Auta minua tekemään se.

Kommentit

  • Jaa HTML-koodi ja elementti, jota yrität löytää.

Vastaa

Olen testannut ExtJS-sovellusta. Suurin osa sivuelementtimääritteistä on dynaamisia. Ne muuttuvat paitsi kun lisäät uuden käyttäjän tai jotain, ne muuttuvat aina, kun avaat sovelluksen.

Löysin työkaluista (Firebug jne.) saadut xpath-lausekkeet eivät ole kovin hyödyllisiä. Siksi:

  1. vaikea lukea
  2. hajoaa helposti
  3. vaikea virheenkorjaus

Sen sijaan teen enemmän aikaa viettää aikaa HTML: n katselemiseen ja tunnistaa mahdolliset ainutlaatuiset määritteet, jotka eivät ole dynaamisia ja keksivät omia lausekkeita. Jos mikään määritteet ovat stati c etsi tietyn elementin kohdalla mitä tahansa sivun muuta elementtiä, jolla on staattisia määritteitä vanhemman / lapsen / sisaruksen suhteiden kanssa.

Käytän usein ”sisältää”, mutta niitä on enemmän. Tässä on joitain esimerkkejä:

  • useita ehtoja: //div[@class="bubble-title" and contains(text(), "Cover")]
  • osittainen osuma: //span[contains(text(), "Assign Rate")]
  • alkaa: //input[starts-with(@id,"reportcombo")]
  • arvossa on välilyöntejä: //div[./div/div[normalize-space(.)="More Actions..."]]
  • sisarus: //td[.="LoadType"]/following-sibling::td[1]/select"
  • monimutkaisempi: //td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]

Katso lisää ideoita W3C XSL -toiminnot -sivulta.

Muokkaa: Linkki päivitetty. Muokkaa 2: XPATH muuttui

kommentit

  • Hyviä esimerkkejä! ’ m käytän samanlaisia menetelmiä JSF-sovelluksen automatisoimiseksi, jossa on paljon dynaamisia muotoja. Olen ’ löytänyt W3C-määrityksen erittäin hyödyllisenä .
  • Mikä ilo tietää siitä joku siellä on kävellyt samaa polkua! Kiitos!
  • Edellinen W3C-määrityslinkki ei toimi nyt. Katso sen sijaan tältä sivulta .

Vastaa

Sinun tulisi jakaa xpath, jotta voit hakea yksittäisiä taulukoita selkeyden vuoksi.

Ehdotan seuraavaa:

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

Kommentit

  • tämä ei ole ’ t oikeastaan mitään esimerkkiä contains käytöstä

vastaus

Voimme käyttää jotain seuraavista:

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

Vastaa

.//*[@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-polkua tulisi lyhentää huomattavasti. Se todennäköisesti epäonnistuu, jos testaat eri selaimissa ja jos jokin muuttuu sivulla, se voi heittää väärän positiivisen johtuen väärästä elementistä. Suosittelen etsimään ”Suhteelliset XPath-reitit” ja myös ”XPath-akselit”, mutta voisin osoittaa sinulle paremman XPath-version, jos lähetät kuvakaappauksen HTML-koodista ja verkkosivusta.

Lähettämiesi tietojen perusteella voit tehdä jotain esimerkiksi: //table[@id ="something" tai @class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row") tai ./text() = "Exact Text Match"]//strong[2]

Yleensä taulukkoriveillä tunnistan rivin rivin solun tekstin perusteella. //table[@id ="something" tai @class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row") tai ./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match") tai ./text() = "Exact Text Match"]

Vastaa

Yritä alla olevaa koodia:

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

Se toimii hyvin minulle. Löydän minkä tahansa xpath-tekstin käyttämällä yllä olevaa koodia.

Vastaa

XPath-tietokoneesi 2 vaihtuu arvosta tr[9]tr[10]. Näyttää siltä, että kolmannen ”tr”: n numero tarkoittaa käyttäjän numeroa.

Käytännössä tämän numeron poistaminen voi poimia kaikkien käyttäjien tiedot HTML-koodista. (RSelenium + rvestin testaama):

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

Vastaus

Vaikka vastauksia on jo olemassa, voit viitata myös seuraaviin linkkeihin:

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

XPath-huijauslehti

Vastaus

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *