Kann mir bitte jemand helfen, wie man enthält in xpath verwendet? Mein xpath ändert sich ständig, wenn Benutzer hinzugefügt werden, sodass ich mit xpath kein Element finden kann.
Dies ist mein 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]
Änderungen beim Hinzufügen eines neuen Benutzers:
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]
Bitte helfen Sie mir dabei.
Kommentare
- Teilen Sie HTML und Element, das Sie suchen, mit.
Antwort
Ich habe eine ExtJS-Anwendung getestet. Die meisten Seitenelementattribute sind dynamisch. Sie ändern sich nicht nur, wenn Sie einen neuen Benutzer oder etwas hinzufügen, sondern jedes Mal, wenn Sie die Anwendung öffnen.
Ich habe festgestellt Die xpath-Ausdrücke, die ich von den Tools (Firebug usw.) erhalte, sind nicht sehr nützlich. Hier ist der Grund:
- schwer zu lesen
- leicht zu brechen
- schwer zu debuggen
Stattdessen verbringe ich viel Zeit damit, mir den HTML-Code anzusehen und mögliche eindeutige Attribute zu identifizieren, die nicht dynamisch sind und meine eigenen Ausdrücke entwickeln Attribute sind stati c Verwenden Sie für ein bestimmtes Element ein anderes Element auf der Seite, das statische Attribute mit den Eltern / Kind / Geschwister-Beziehungen zum Suchen enthält.
Ich verwende häufig „enthält“, aber es gibt noch mehr. Hier einige Beispiele:
- Mehrfachbedingung:
//div[@class="bubble-title" and contains(text(), "Cover")]
- Teilübereinstimmung:
//span[contains(text(), "Assign Rate")]
- beginnt mit:
//input[starts-with(@id,"reportcombo")]
- Wert hat Leerzeichen:
//div[./div/div[normalize-space(.)="More Actions..."]]
- Geschwister:
//td[.="LoadType"]/following-sibling::td[1]/select"
- komplexer:
//td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]
Weitere Ideen finden Sie auf der Seite W3C XSL-Funktionen.
Bearbeiten: Link aktualisiert. Bearbeiten 2: XPATH geändert
Kommentare
- Tolle Beispiele! Ich ‚ verwende ähnliche Methoden zur Automatisierung einer JSF-App mit vielen dynamischen Formularen. Ich ‚ fand die W3C-Spezifikation sehr nützlich .
- Was für eine Freude, das zu wissen Jemand da draußen ist den gleichen Weg gegangen! Vielen Dank!
- Der vorherige Link zur W3C-Spezifikation funktioniert jetzt nicht. Weitere Informationen finden Sie stattdessen auf dieser Seite .
Antwort
Sie sollten den xpath teilen, um aus Gründen der Übersichtlichkeit einzelne Tabellen abzurufen.
Ich schlage Folgendes vor:
// 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()); }
Kommentare
- Dies ‚ bietet kein Beispiel für die Verwendung von
contains
Antwort
Wir können so etwas wie
By.xpath("//td[contains(lower-case(text()),"youruser")]") //to handle case sensitivity. Here user is not case sensitive
Antwort
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]
Dieser XPath sollte drastisch verkürzt werden. Dies schlägt wahrscheinlich fehl, wenn Sie in verschiedenen Browsern testen und wenn sich jemals etwas auf der Seite ändert, kann dies zu einem falschen Positiv führen, da das falsche Element angezeigt wird. Ich empfehle, nach „Relative XPaths“ und auch nach „XPath Axes“ zu suchen, aber ich könnte Ihnen einen besseren XPath demonstrieren, wenn Sie einen Screenshot des HTML-Codes und der Webseite veröffentlichen.
Basierend auf dem, was Sie gepostet haben, Sie könnten Folgendes tun: //table[@id ="something"
oder @class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row")
oder ./text() = "Exact Text Match"]//strong[2]
Normalerweise identifiziere ich bei Tabellenzeilen die Zeile anhand des Textes aus einer Zelle in der Zeile. //table[@id ="something"
oder @class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row")
oder ./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match")
oder ./text() = "Exact Text Match"]
Antwort
Bitte versuchen Sie den folgenden 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"); }
Es funktioniert gut für mich. Ich kann jeden Text auf jedem xpath mit dem obigen Code finden.
Antwort
Die 2 Ihres XPaths ändert sich von tr[9]
bis tr[10]
. Es scheint, dass die Nummer des 3. „tr“ die Benutzernummer bedeutet.
In meiner Praxis kann das Löschen dieser Nummer alle Benutzerdaten aus HTML extrahieren (getestet von 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]
Antwort
Obwohl bereits viele Antworten vorhanden sind, können Sie auch auf die folgenden Links verweisen:
Antwort
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")]