Jak znaleźć element za pomocą zawiera w xpath

Czy ktoś może mi pomóc, jak używać zawiera w mojej xpath? Moja ścieżka xpath zmienia się cały czas po dodaniu użytkowników, więc nie mogę znaleźć elementu przy użyciu ścieżki xpath.

To jest moja ścieżka 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] 

Zmiany po dodaniu nowego użytkownika:

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

Proszę, pomóż mi, jak to zrobić.

Komentarze

  • Udostępnij swój kod HTML i element, który próbujesz znaleźć.

Odpowiedź

Przetestowałem aplikację ExtJS. Większość atrybutów elementów strony jest dynamiczna. Zmieniają się nie tylko, gdy dodajesz nowego użytkownika, czy coś, zmieniają się za każdym razem, gdy otwierasz aplikację.

Znalazłem wyrażenia xpath, które otrzymuję z narzędzi (Firebug itp.) nie są zbyt przydatne. Oto dlaczego:

  1. Trudne do odczytania
  2. łatwo się psują
  3. trudne do debugowania

Zamiast tego zajmuję się raczej przeglądaniem kodu HTML i identyfikowaniem możliwych unikalnych atrybutów, które nie są dynamiczne, i wymyślam własne wyrażenia. atrybuty to stati c dla określonego elementu użyj dowolnego innego elementu na stronie, który ma statyczne atrybuty z relacjami rodzic / dziecko / rodzeństwo do zlokalizowania.

Często używam „zawiera”, ale jest ich więcej. Oto kilka przykładów:

  • warunek wielokrotny: //div[@class="bubble-title" and contains(text(), "Cover")]
  • częściowe dopasowanie: //span[contains(text(), "Assign Rate")]
  • zaczyna się od: //input[starts-with(@id,"reportcombo")]
  • wartość zawiera spacje: //div[./div/div[normalize-space(.)="More Actions..."]]
  • rodzeństwo: //td[.="LoadType"]/following-sibling::td[1]/select"
  • bardziej złożone: //td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]

Spójrz na stronę Funkcje XSL W3C, aby uzyskać więcej pomysłów.

Edycja: zaktualizowano łącze. Edycja 2: zmieniono XPATH

Komentarze

  • Świetne przykłady! ' Korzystam z podobnych metod automatyzacji aplikacji JSF z wieloma dynamicznymi formularzami. ' uważam, że specyfikacja W3C jest bardzo przydatna .
  • Miło to wiedzieć ktoś tam poszedł tą samą ścieżką! Dziękuję!
  • Poprzedni link do specyfikacji W3C teraz nie działa. Zamiast tego zapoznaj się z tą stroną .

Odpowiedź

Powinieneś podzielić ścieżkę xpath, aby pobrać poszczególne tabele ze względu na przejrzystość.

Proponuję co następuje:

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

Komentarze

  • to nie ' nie dostarcza żadnego przykładu użycia contains

Odpowiedź

Możemy użyć czegoś takiego jak

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

Odpowiedź

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

Ten XPath powinien zostać drastycznie skrócony. To może się nie powieść, jeśli testujesz w różnych przeglądarkach, a jeśli cokolwiek zmieni się na stronie, może to spowodować fałszywie pozytywny wynik, ponieważ patrzy na niewłaściwy element. Zalecam wyszukanie „Względnych XPath”, a także „Osi XPath”, ale mógłbym zademonstrować lepszą XPath, gdybyś opublikował zrzut ekranu HTML i strony internetowej.

Na podstawie tego, co opublikowałeś, możesz zrobić coś takiego: //table[@id ="something" lub @class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row") lub ./text() = "Exact Text Match"]//strong[2]

Zwykle w przypadku wierszy tabeli identyfikuję wiersz na podstawie tekstu z komórki w wierszu. //table[@id ="something" lub @class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row") lub ./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match") lub ./text() = "Exact Text Match"]

Odpowiedź

Wypróbuj poniższy kod:

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

U mnie działa dobrze. Mogę znaleźć dowolny tekst na dowolnej ścieżce xpath przy użyciu powyższego kodu.

Odpowiedź

Dwie ścieżki XPath zmieniają się z tr[9] do tr[10]. Wydaje się, że liczba 3. tr oznacza numer użytkownika.

W mojej praktyce usunięcie tego numeru może wyodrębnić dane wszystkich użytkowników z HTML. (testowane przez 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] 

Odpowiedź

Chociaż wiele odpowiedzi jest już obecnych, możesz również skorzystać z poniższych linków:

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

XPath CheatSheet

Odpowiedź

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *