Kan nogen venligst hjælpe mig, hvordan jeg bruger indeholder i min xpath? Min xpath ændres hele tiden, når brugerne tilføjes, så jeg kan ikke finde element ved hjælp af 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]
Ændringer, når ny bruger blev tilføjet:
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]
Hjælp mig, hvordan jeg får det gjort.
Kommentarer
- Del din HTML og det element, du prøver at finde.
Svar
Jeg har testet et ExtJS-program. De fleste af sideelementattributterne er dynamiske. De ændres ikke kun, når du tilføjer en ny bruger eller noget, de ændres hver gang du åbner applikationen.
Jeg har fundet xpath-udtryk, jeg får fra værktøjerne (Firebug osv.), er ikke særlig nyttige. Her er hvorfor:
- svært at læse
- let bryde
- svært at debugge
Hvad jeg gør i stedet, er snarere at bruge tid på at kigge på HTML og identificere mulige unikke attributter, der ikke er dynamiske og komme med mine egne udtryk. attributter er stati c for et bestemt element, brug ethvert andet element på siden, der har statiske attributter med forholdet mellem forældre / barn / søskende at finde.
Jeg bruger ofte “indeholder”, men der er flere. Her er nogle eksempler:
- multiple condition:
//div[@class="bubble-title" and contains(text(), "Cover")]
- delvis match:
//span[contains(text(), "Assign Rate")]
- starter med:
//input[starts-with(@id,"reportcombo")]
- værdi har mellemrum:
//div[./div/div[normalize-space(.)="More Actions..."]]
- søskende:
//td[.="LoadType"]/following-sibling::td[1]/select"
- mere kompleks:
//td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]
Se på W3C XSL-funktionssiden for at få flere ideer.
Rediger: Link opdateret. Rediger 2: XPATH ændret
Kommentarer
- Gode eksempler! Jeg ‘ bruger lignende metoder til automatisering af en JSF-app med mange dynamiske former. Jeg ‘ har fundet W3C-specifikationen meget nyttig .
- Hvilken fornøjelse at vide, at nogen derude har gået den samme sti! Tak!
- Det forrige W3C-specifikationslink fungerer ikke nu. Se i stedet denne side .
Svar
Du skal opdele xpath for at hente individuelle tabeller for klarhedens 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 ‘ t giver virkelig et eksempel på, hvordan man bruger
contains
Svar
Vi kan bruge noget 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 skal afkortes drastisk. Det vil sandsynligvis mislykkes, hvis du tester i forskellige browsere, og hvis der nogensinde ændres på siden, kan det kaste en falsk positiv, fordi den ser på det forkerte element. Jeg anbefaler at kigge på “Relative XPaths” og også “XPath Axes”, men jeg kunne demonstrere en bedre XPath til dig, hvis du sendte et screenshot af HTML og websiden.
Baseret på hvad du sendte, du kunne gøre noget 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]
Normalt ender jeg med tabelrækker med at identificere rækken baseret på teksten fra en celle i rækken. //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 nedenstående kode:
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 fint for mig. Jeg kan finde en hvilken som helst tekst på enhver xpath ved hjælp af ovenstående kode.
Svar
De 2 af dine XPath skifter fra tr[9]
til tr[10]
. Det ser ud til, at nummeret på 3. “tr” betyder brugernummer.
I min praksis kan sletning af dette nummer udtrække alle brugeres “data fra HTML. (testet af 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
Selvom mange svar allerede er til stede, kan du også henvise til nedenstående links:
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")]