Hvordan finner du element ved hjelp av inneholder i xpath

Kan noen vennligst hjelpe meg hvordan jeg bruker inneholder i xpath? Min xpath endres hele tiden når brukere blir lagt til, så jeg kan ikke finne element ved hjelp av xpath.

Dette er min 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] 

Endringer når ny bruker ble lagt til:

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

Hjelp meg hvordan jeg kan få det til.

Kommentarer

  • Del HTML og element du prøver å finne.

Svar

Jeg har testet et ExtJS-program. De fleste av sidelementattributtene er dynamiske. De endres ikke bare når du legger til en ny bruker eller noe, de endres hver gang du åpner applikasjonen.

Jeg har funnet xpath-uttrykkene jeg får fra verktøyene (Firebug etc.) er ikke veldig nyttige. Her er hvorfor:

  1. vanskelig å lese
  2. bryter lett
  3. vanskelig å feilsøke

Det jeg gjør i stedet, er heller å bruke tid på å se på HTML og identifisere mulige unike attributter som ikke er dynamiske og kommer med mine egne uttrykk. attributter er stati c for et bestemt element, bruk et hvilket som helst annet element på siden som har statiske attributter med foreldre / barn / søskenforhold å finne.

Jeg bruker ofte «inneholder», men det er flere. Her er noen eksempler:

  • multiple condition: //div[@class="bubble-title" and contains(text(), "Cover")]
  • delvis samsvar: //span[contains(text(), "Assign Rate")]
  • starter med: //input[starts-with(@id,"reportcombo")]
  • verdi har mellomrom: //div[./div/div[normalize-space(.)="More Actions..."]]
  • søsken: //td[.="LoadType"]/following-sibling::td[1]/select"
  • mer kompleks: //td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]

Ta en titt på siden W3C XSL Funksjoner for å få flere ideer.

Rediger: Link oppdatert. Rediger 2: XPATH endret

Kommentarer

  • Flotte eksempler! Jeg ‘ bruker lignende metoder for å automatisere en JSF-app med mange dynamiske former. Jeg ‘ har funnet W3C-spesifikasjonen veldig nyttig .
  • For en glede å vite at noen der ute har gått den samme stien! Takk!
  • Den forrige W3C-spesifikasjonskoblingen fungerer ikke nå. Se i stedet for denne siden .

Svar

Du bør dele xpath for å hente individuelle tabeller for klarhets skyld.

Jeg foreslår følgende:

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

Kommentarer

  • dette betyr ikke ‘ t gir virkelig noe eksempel på hvordan du bruker contains

Svar

Vi kan bruke noe sånt som

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

Svar

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

At XPath bør forkortes drastisk. Det vil sannsynligvis mislykkes hvis du tester i forskjellige nettlesere, og hvis noe endres på siden, kan det føre til en falsk positiv fordi den ser på feil element. Jeg anbefaler å slå opp «Relative XPaths» og også «XPath Axes», men jeg kunne demonstrere en bedre XPath for deg hvis du la ut et skjermbilde av HTML og websiden.

Basert på det du la ut, du kan gjøre noe sånt som: //table[@id ="something" eller @class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row") eller ./text() = "Exact Text Match"]//strong[2]

Vanligvis med tabellrader ender jeg opp med å identifisere raden basert på teksten fra en celle i raden. //table[@id ="something" eller @class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row") eller ./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match") eller ./text() = "Exact Text Match"]

Svar

Prøv nedenfor koden:

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

Det fungerer bra for meg. Jeg kan finne hvilken som helst tekst på hvilken som helst xpath ved hjelp av koden ovenfor.

Svar

2 av XPath-en din endres fra tr[9] til tr[10]. Det ser ut til at nummeret på 3. «tr» betyr brukernummer.

I min praksis kan sletting av dette antallet trekke ut alle brukernes «data fra HTML. (testet av 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] 

Svar

Selv om mange svar allerede er til stede, kan du også henvise til linkene nedenfor:

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

XPath CheatSheet

Svar

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *