Kan iemand me alsjeblieft helpen met het gebruik van bevat in mijn xpath? Mijn xpath verandert voortdurend wanneer gebruikers worden toegevoegd, dus ik kan “geen element vinden met xpath.
Dit is mijn 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]
Veranderingen wanneer een nieuwe gebruiker wordt toegevoegd:
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]
Help me alstublieft hoe ik het voor elkaar kan krijgen.
Opmerkingen
- Deel je HTML en het element dat je probeert te vinden.
Antwoord
Ik heb een ExtJS-applicatie getest. De meeste pagina-elementattributen zijn dynamisch. Ze veranderen niet alleen wanneer je een nieuwe gebruiker toevoegt of zoiets, ze veranderen ook elke keer dat je de applicatie opent.
Ik heb ontdekt de xpath-expressies die ik krijg van de tools (Firebug etc.) zijn niet erg nuttig. Dit is waarom:
- moeilijk te lezen
- gemakkelijk breken
- moeilijk te debuggen
Wat ik in plaats daarvan doe, is tijd besteden aan het kijken naar de HTML en mogelijke unieke attributen identificeren die niet dynamisch zijn en met mijn eigen uitdrukkingen komen. attributen zijn stati c voor een bepaald element, gebruik een ander element op de pagina dat statische attributen heeft met de parent / child / sibling relaties om te lokaliseren.
Ik gebruik vaak “contains”, maar er zijn er meer. Hier zijn enkele voorbeelden:
- meervoudige voorwaarde:
//div[@class="bubble-title" and contains(text(), "Cover")]
- gedeeltelijke overeenkomst:
//span[contains(text(), "Assign Rate")]
- begint met:
//input[starts-with(@id,"reportcombo")]
- waarde bevat spaties:
//div[./div/div[normalize-space(.)="More Actions..."]]
- broer of zus:
//td[.="LoadType"]/following-sibling::td[1]/select"
- complexer:
//td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]
Kijk eens naar de W3C XSL Functions-pagina voor meer ideeën.
Bewerken: link bijgewerkt. Bewerken 2: XPATH gewijzigd
Reacties
- Geweldige voorbeelden! Ik ‘ gebruik vergelijkbare methoden voor het automatiseren van een JSF-app met veel dynamische formulieren. Ik ‘ heb de W3C-specificatie erg nuttig gevonden .
- Wat een plezier om te weten dat iemand daarbuiten heeft hetzelfde pad bewandeld! Bedankt!
- De vorige W3C-specificatielink werkt nu niet. Raadpleeg in plaats daarvan deze pagina .
Answer
U zou voor de duidelijkheid het xpath moeten splitsen om afzonderlijke tabellen op te halen.
Ik stel het volgende voor:
// 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()); }
Opmerkingen
- dit geeft ‘ niet echt een voorbeeld van hoe
contains
Antwoord
We kunnen zoiets gebruiken
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
Antwoord
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]
Dat XPath moet drastisch worden ingekort. Dat zal waarschijnlijk mislukken als u in verschillende browsers test en als er ooit iets op de pagina verandert, kan dit een vals positief resultaat opleveren doordat naar het verkeerde element wordt gekeken. Ik raad aan om “Relative XPaths” en ook “XPath Axes” op te zoeken, maar ik zou een betere XPath voor je kunnen demonstreren als je een screenshot van de HTML en de webpagina hebt gepost.
Gebaseerd op wat je hebt gepost, je zou iets kunnen doen als: //table[@id ="something"
of @class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row")
of ./text() = "Exact Text Match"]//strong[2]
Meestal identificeer ik met tabelrijen de rij op basis van de tekst uit een cel in de rij. //table[@id ="something"
of @class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row")
of ./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match")
of ./text() = "Exact Text Match"]
Antwoord
Probeer onderstaande code:
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"); }
Het werkt prima voor mij. Ik kan elke tekst op elk xpath vinden met behulp van bovenstaande code.
Answer
De 2 van je XPath verandert van tr[9]
naar tr[10]
. Het lijkt erop dat het nummer van de 3e “tr” gebruikersnummer betekent.
In mijn praktijk verwijder dat nummer kan alle gebruikersgegevens uit HTML halen. (getest door 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]
Antwoord
Hoewel er al veel antwoorden aanwezig zijn, kunt u ook de onderstaande links raadplegen:
Antwoord
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")]