Obsługa dynamicznych tabel internetowych przy użyciu Selenium Sterownik sieciowy
Tabela internetowa w Selenium
W Internecie dostępne są dwa typy tabel HTML:
- Tabele statyczne: Dane są statyczne, tj. liczba wierszy i kolumn jest stała.
- Tabele dynamiczne: Dane są dynamiczne, tj. liczba wierszy i kolumn NIE jest stała.
Jak obsługiwać tabelę dynamiczną w Selenium
Poniżej znajduje się przykład dynamicznej tabeli internetowej w formacie Selenium na sprzedaż. W oparciu o filtry dat wejściowych liczba wierszy zostanie zmieniona. Ma więc charakter dynamiczny.
Obsługa tabeli statycznej jest łatwa, ale obsługa tabel dynamicznych Selenium jest trochę trudne, ponieważ wiersze i kolumny nie są stałe.
Używanie X-Path do lokalizowania elementów tabeli internetowej
Zanim zlokalizujemy element sieciowy, najpierw zrozummy-
Co to jest element sieciowy?
Elementy sieci Web to nic innego jak elementy HTML, takie jak pola tekstowe, przyciski opcji rozwijanych menu, przyciski przesyłania itp. Te elementy HTML są pisane za pomocą początek tag i kończy się na zakończenia etykietka.
Na przykład,
Mój pierwszy dokument HTML.
Kroki uzyskania ścieżki X elementu sieciowego, który chcemy zlokalizować.
Krok 1) W przeglądarce Chrome przejdź do https://demo.guru99.com/test/web-table-element.php
Krok 2) Kliknij prawym przyciskiem myszy na elemencie sieci web, którego ścieżka x ma zostać pobrana. W naszym przypadku kliknij prawym przyciskiem myszy na „Company” Wybierz opcję Inspect. Zostanie wyświetlony następujący ekran –
Krok 3) Kliknij prawym przyciskiem myszy podświetlony element sieciowy > Wybierz opcję Kopiuj -> Kopiuj opcję x-path.
Krok 4) Użyj skopiowanej ścieżki X „//*[@id=”leftcontainer”]/table/thead/tr/th [1]” w Selenium WebDriver, aby zlokalizować element.
Przykład: pobierz liczbę wierszy i kolumn z Dynamic WebTable
Podczas dynamicznej obsługi tabeli internetowej w Selenium, nie możemy przewidzieć liczby jego wierszy i kolumn.
Korzystanie z Selenium sterownik sieciowy, możemy znaleźć
- Liczba wierszy i kolumn tabeli internetowej w Selenium
- Dane wiersza X lub kolumny Y.
Poniżej znajduje się program do pobierania całkowitej liczby wierszy i kolumn do obsługi tabeli internetowej Selenium:
import java.text.ParseException; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class Noofrowsandcols { public static void main(String[] args) throws ParseException { WebDriver wd; System.setProperty("webdriver.chrome.driver","G://chromedriver.exe"); wd= new ChromeDriver(); wd.get("https://demo.guru99.com/test/web-table-element.php"); //No.of Columns List <webelement> col = wd.findElements(By.xpath(".//*[@id=\"leftcontainer\"]/table/thead/tr/th")); System.out.println("No of cols are : " +col.size()); //No.of rows List <webelement> rows = wd.findElements(By.xpath(".//*[@id='leftcontainer']/table/tbody/tr/td[1]")); System.out.println("No of rows are : " + rows.size()); wd.close(); } }
Wyjaśnienie kodu:
- Tutaj najpierw zadeklarowaliśmy obiekt sterownika sieciowego „wd” i zainicjowaliśmy go w sterowniku Chrome.
- Używamy Listy do całkowitej liczby kolumn w „col”.
- Komendy findElements zwracają listę WSZYSTKICH elementów pasujących do określonego lokalizatora
- używając findElements i X-path //*[@id=\”leftcontainer\”]/table/thead/tr/th otrzymujemy wszystkie kolumny
- Podobnie powtarzamy proces dla wierszy.
Wyjście:
Przykład: Pobierz wartość komórki z określonego wiersza i kolumny tabeli dynamicznej
Załóżmy, że potrzebujemy 3rd wiersz tabeli i dane jej drugiej komórki. Zobacz tabelę poniżej-
W powyższej tabeli dane są regularnie aktualizowane po pewnym czasie. Dane, które spróbujesz odzyskać, będą się różnić od powyższego zrzutu ekranu. Jednak kod pozostaje ten sam. Oto przykładowy program do uzyskania 3rd wiersz i 2nd dane kolumny.
import java.text.ParseException; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import java.util.concurrent.TimeUnit; public class RowandCell { public static void main(String[] args) throws ParseException { WebDriver wd; System.setProperty("webdriver.chrome.driver","G://chromedriver.exe"); wd= new ChromeDriver(); wd.get("https://demo.guru99.com/test/web-table-element.php"); wd.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); WebElement baseTable = wd.findElement(By.tagName("table")); //To find third row of table WebElement tableRow = baseTable.findElement(By.xpath("//*[@id=\"leftcontainer\"]/table/tbody/tr[3]")); String rowtext = tableRow.getText(); System.out.println("Third row of table : "+rowtext); //to get 3rd row's 2nd column data WebElement cellIneed = tableRow.findElement(By.xpath("//*[@id=\"leftcontainer\"]/table/tbody/tr[3]/td[2]")); String valueIneed = cellIneed.getText(); System.out.println("Cell value is : " + valueIneed); wd.close(); } }
Wyjaśnienie kodu:
- Tabela jest zlokalizowana przy użyciu właściwości lokalizatora „tagname”.
- Korzystanie z XPath „//*[@id=\”leftcontainer\”]/table/tbody/tr[3]” znajdź 3rd row i pobiera jego tekst za pomocą funkcji getText ().
- Używając Xpath „//*[@id=\”leftcontainer\”]/table/tbody/tr[3]/td[2]” znajdź drugą komórkę w 2rd row i pobiera jego tekst za pomocą funkcji getText ().
Wydajność:
Przykład: Uzyskaj maksimum wszystkich wartości z kolumny tabeli dynamicznej
W tym przykładzie otrzymamy maksimum wszystkich wartości w danej kolumnie.
Zapoznaj się z poniższą tabelą –
Oto kod
import java.text.ParseException; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import java.text.NumberFormat; public class MaxFromTable { public static void main(String[] args) throws ParseException { WebDriver wd; System.setProperty("webdriver.chrome.driver","G://chromedriver.exe"); wd= new ChromeDriver(); wd.get("https://demo.guru99.com/test/web-table-element.php"); String max; double m=0,r=0; //No. of Columns List <webelement> col = wd.findElements(By.xpath(".//*[@id='leftcontainer']/table/thead/tr/th")); System.out.println("Total No of columns are : " +col.size()); //No.of rows List <webelement> rows = wd.findElements(By.xpath (".//*[@id='leftcontainer']/table/tbody/tr/td[1]")); System.out.println("Total No of rows are : " + rows.size()); for (int i =1;i<rows.size();i++) { max= wd.findElement(By.xpath("html/body/div[1]/div[5]/table/tbody/tr[" + (i+1)+ "]/td[4]")).getText(); NumberFormat f =NumberFormat.getNumberInstance(); Number num = f.parse(max); max = num.toString(); m = Double.parseDouble(max); if(m>r) { r=m; } } System.out.println("Maximum current price is : "+ r); } } </webelement></webelement>
Wyjaśnienie kodu:
- Używając sterownika Chrome, lokalizujemy tabelę internetową i uzyskujemy całkowitą liczbę wierszy za pomocą XPath „.//*[@id='leftcontainer']/table/tbody/tr/td[1]”
- Używając pętli for, iterujemy po całkowitej liczbie wierszy i pobieramy wartości jeden po drugim. Aby uzyskać następny wiersz, używamy (i+1) w XPath
- Porównujemy starą wartość z nową wartością i na końcu pętli for wydawana jest wartość maksymalna
Wydajność
Przykład: Uzyskaj wszystkie wartości tabeli dynamicznej
Rozważ następującą tabelę: https://demo.guru99.com/test/table.html
Liczba kolumn w każdym wierszu jest inna.
Tutaj wiersze nr 1, 2 i 4 mają 3 komórki, wiersz nr 3 ma 2 komórki, a wiersz nr 5 ma 1 komórkę.
Musimy uzyskać wartości wszystkich komórek
Oto kod:
import java.text.ParseException; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import java.util.concurrent.TimeUnit; import org.openqa.selenium.chrome.ChromeDriver; public class NofRowsColmns { public static void main(String[] args) throws ParseException { WebDriver wd; System.setProperty("webdriver.chrome.driver","G://chromedriver.exe"); wd = new ChromeDriver(); wd.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); wd.get("https://demo.guru99.com/test/table.html"); //To locate table. WebElement mytable = wd.findElement(By.xpath("/html/body/table/tbody")); //To locate rows of table. List < WebElement > rows_table = mytable.findElements(By.tagName("tr")); //To calculate no of rows In table. int rows_count = rows_table.size(); //Loop will execute till the last row of table. for (int row = 0; row < rows_count; row++) { //To locate columns(cells) of that specific row. List < WebElement > Columns_row = rows_table.get(row).findElements(By.tagName("td")); //To calculate no of columns (cells). In that specific row. int columns_count = Columns_row.size(); System.out.println("Number of cells In Row " + row + " are " + columns_count); //Loop will execute till the last cell of that specific row. for (int column = 0; column < columns_count; column++) { // To retrieve text from that specific cell. String celtext = Columns_row.get(column).getText(); System.out.println("Cell Value of row number " + row + " and column number " + column + " Is " + celtext); } System.out.println("-------------------------------------------------- "); } } }
Wyjaśnienie kodu:
- rows_count podaje całkowitą liczbę wierszy
- dla każdego wiersza otrzymujemy całkowitą liczbę kolumn za pomocą
rows_table.get(row).findElements(By.tagName("td"));
- Wykonujemy iterację po każdej kolumnie i każdym wierszu i pobieramy wartości.
Wydajność:
Podsumowanie
- By.xpath() jest powszechnie używana do uzyskiwania dostępu do elementów tabeli.
- Statyczne tabele internetowe w Selenium mają charakter spójny. tj. mają stałą liczbę wierszy i dane komórek.
- Dynamiczne tabele internetowe są niespójne, tzn. nie mają ustalonej liczby wierszy i komórek danych.
- Wykorzystując sterownik sieciowy Selenium możemy łatwo obsługiwać dynamiczne tabele sieciowe.
- Selenium Webdriver umożliwia nam dostęp do dynamicznych tabel internetowych poprzez ich Ścieżka X