Wie finde ich Elemente mit enthält in xpath

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:

  1. schwer zu lesen
  2. leicht zu brechen
  3. 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:

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

XPath CheatSheet

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.