Cum să gestionați tabelele web dinamice în Selenium
Tabel Web în Selenium
Există două tipuri de tabele HTML publicate pe web-
- Tabele statice: Datele sunt statice, adică numărul de rânduri și coloane este fix.
- Tabelele dinamice: Datele sunt dinamice, adică numărul de rânduri și coloane NU este fix.
Cum să gestionați tabelul dinamic în Selenium
Mai jos este un exemplu de tabel web dinamic în Selenium pentru vanzari. Pe baza filtrelor de date introduse, numărul de rânduri va fi modificat. Deci, este de natură dinamică.
Manipularea tabelelor statice este ușoară, dar gestionarea tabelelor dinamice Selenium este puțin dificil, deoarece rândurile și coloanele nu sunt constante.
Utilizarea X-Path pentru a localiza elementele tabelului web
Înainte de a găsi elementul web, mai întâi să înțelegem-
Ce este un element web?
Elementele web nu sunt altceva decât elemente HTML, cum ar fi caseta de text, butoanele radio dropdown, butoanele de trimitere etc. Aceste elemente HTML sunt scrise cu Începe etichetă și se termină cu un capăt etichetă.
De exemplu,
Primul meu document HTML.
Pași pentru obținerea căii X a elementului web pe care dorim să-l găsim.
Pas 1) În Chrome, accesați https://demo.guru99.com/test/web-table-element.php
Pas 2) Faceți clic dreapta pe elementul web a cărui cale x urmează să fie preluată. În cazul nostru, faceți clic dreapta pe „Companie” Selectați opțiunea Inspectare. Va fi afișat următorul ecran -
Pas 3) Faceți clic dreapta pe elementul web evidențiat > Selectați Copiere -> Copiere opțiunea x-path.
Pas 4) Utilizați calea X copiată „//*[@id="leftcontainer”]/table/thead/tr/th [1]” în Selenium WebDriver pentru a localiza elementul.
Exemplu: Preluați numărul de rânduri și coloane din Dynamic WebTable
În timp ce tabelul web dinamic se manipulează Selenium, nu putem prezice numărul său de rânduri și coloane.
Utilizarea Selenium driver web, putem găsi
- Numărul de rânduri și coloane ale tabelului web în Selenium
- Datele rândului X sau ale coloanei Y.
Mai jos este programul pentru preluarea numărului total de rânduri și coloane pentru manipularea tabelului web 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(); } }
Explicația codului:
- Aici am declarat mai întâi obiectul Web Driver „wd” și l-am inițializat în driverul Chrome.
- Folosim Listă la numărul total de coloane din „col”.
- Comenzile findElements returnează o listă cu TOATE elementele care se potrivesc cu locatorul specificat
- folosind findElements și X-path //*[@id=\”leftcontainer\”]/table/thead/tr/th obținem toate coloanele
- În mod similar, repetăm procesul pentru rânduri.
ieșire:
Exemplu: Preluați valoarea celulei unui anumit rând și coloană din tabelul dinamic
Să presupunem că avem nevoie de 3rd rândul tabelului și datele celei de-a doua celule. Vezi tabelul de mai jos -
În tabelul de mai sus, datele sunt actualizate în mod regulat după o anumită perioadă de timp. Datele pe care încercați să le preluați vor fi diferite de captura de ecran de mai sus. Cu toate acestea, codul rămâne același. Iată un exemplu de program pentru a obține 3rd rând și 2nd datele coloanei.
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(); } }
Explicația codului:
- Tabelul este localizat folosind proprietatea de localizare „tagname”.
- Utilizarea XPath „//*[@id=\”leftcontainer\”]/table/tbody/tr[3]” găsiți cele 3rd rând și își primește textul folosind funcția getText ().
- Folosind Xpath „//*[@id=\”leftcontainer\”]/table/tbody/tr[3]/td[2]” găsiți a doua celulă în 2rd rând și își primește textul folosind funcția getText ().
producție:
Exemplu: Obțineți maximul tuturor valorilor dintr-o coloană a tabelului dinamic
În acest exemplu, vom obține maximul tuturor valorilor dintr-o anumită coloană.
Consultați următorul tabel -
Iată codul
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>
Explicația codului:
- Folosind driverul Chrome, găsim tabelul web și obținem numărul total de rând folosind XPath „.//*[@id='leftcontainer']/table/tbody/tr/td[1]”
- Folosind bucla for, repetăm numărul total de rânduri și obținem valori unul câte unul. Pentru a obține următorul rând, folosim (i+1) în XPath
- Comparăm valoarea veche cu valoarea nouă, iar valoarea maximă este tipărită la sfârșitul buclei for
Ieșire
Exemplu: Obțineți toate valorile unui tabel dinamic
Luați în considerare următorul tabel: https://demo.guru99.com/test/table.html
Numărul de coloane pentru fiecare rând este diferit.
Aici rândul numărul 1, 2 și 4 au 3 celule, iar rândul numărul 3 are 2 celule, iar rândul numărul 5 are 1 celulă.
Trebuie să obținem valorile tuturor celulelor
Iată codul:
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("-------------------------------------------------- "); } } }
Explicația codului:
- rows_count oferă numărul total de rânduri
- pentru fiecare rând obținem numărul total de coloane folosind
rows_table.get(row).findElements(By.tagName("td"));
- Repetăm fiecare coloană și fiecare rând și obținem valori.
producție:
Rezumat
- By.xpath() este folosit în mod obișnuit pentru a accesa elementele tabelului.
- Tabelele web statice în Selenium sunt consistente în natură. adică au un număr fix de rânduri, precum și date pentru celule.
- Tabelele web dinamice sunt inconsistente, adică nu au un număr fix de date de rânduri și celule.
- Folosind driverul web selenium, putem gestiona cu ușurință tabelele web dinamice.
- Selenium Webdriver ne permite să accesăm tabelele web dinamice în funcție de acestea Calea X. Înțelegerea modului de manipulare a tabelului web în seleniu este crucială pentru testarea eficientă a automatizării.