Hvordan håndtere dynamiske netttabeller i Selenium
Webtabell i Selenium
Det er to typer HTML-tabeller publisert på nettet-
- Statiske tabeller: Data er statisk dvs. Antall rader og kolonner er faste.
- Dynamiske tabeller: Data er dynamisk dvs. Antall rader og kolonner er IKKE faste.
Hvordan håndtere dynamisk tabell i Selenium
Nedenfor er et eksempel på en dynamisk netttabell i Selenium for salg. Basert på inndatafiltre vil antall rader bli endret. Så det er dynamisk i naturen.
Det er enkelt å håndtere statiske tabeller, men å håndtere dynamiske tabeller i Selenium er litt vanskelig da rader og kolonner ikke er konstante.
Bruke X-Path for å finne webtabellelementer
Før vi finner webelement, la oss først forstå-
Hva er et webelement?
Nettelementer er ikke annet enn HTML-elementer som tekstboks, alternativknapper for rullegardinmenyene, send inn-knapper osv. Disse HTML-elementene er skrevet med Begynn tag og slutter med en slutt tag.
For eksempel,
Mitt første HTML-dokument.
Trinn for å få X-banen til webelementet som vi ønsker å finne.
Trinn 1) Gå til i Chrome https://demo.guru99.com/test/web-table-element.php
Trinn 2) Høyreklikk på webelementet hvis x-bane skal hentes. I vårt tilfelle, høyreklikk på "Selskap" Velg alternativet Inspiser. Følgende skjerm vil vises -
Trinn 3) Høyreklikk på uthevet webelement > Velg Kopier -> Kopier x-banealternativ.
Trinn 4) Bruk den kopierte X-banen "//*[@id="leftcontainer"]/table/thead/tr/th [1]" i Selenium WebDriver for å finne elementet.
Eksempel: Hent antall rader og kolonner fra Dynamic WebTable
Mens dynamisk netttabellhåndtering i Selenium, kan vi ikke forutsi antall rader og kolonner.
Ved hjelp av Selenium nettdriver, kan vi finne
- Antall rader og kolonner i netttabellen Selenium
- X rad eller Y kolonnes data.
Nedenfor er program for å hente totalt antall rader og kolonner for håndtering av webtabell i 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(); } }
Kodeforklaring:
- Her har vi først erklært Web Driver-objektet "wd" og initialisert det til chrome-driver.
- Vi bruker List til totalt antall kolonner i "col".
- findElements-kommandoer returnerer en liste over ALLE elementene som samsvarer med den spesifiserte lokatoren
- ved å bruke findElements og X-path //*[@id=\”leftcontainer\”]/table/thead/tr/th får vi alle kolonnene
- På samme måte gjentar vi prosessen for rader.
Utgang:
Eksempel: Hent celleverdi for en bestemt rad og kolonne i den dynamiske tabellen
La oss anta at vi trenger 3rd rad i tabellen og dens andre celles data. Se tabellen nedenfor-
I tabellen ovenfor oppdateres data regelmessig etter en viss tid. Dataene du prøver å hente vil være forskjellig fra skjermbildet ovenfor. Imidlertid forblir koden den samme. Her er eksempelprogram for å få 3rd rad og 2nd kolonnens data.
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(); } }
Kodeforklaring:
- Tabellen er lokalisert ved å bruke locator-egenskapen "tagname".
- Ved hjelp av XPath “//*[@id=\”leftcontainer\”]/table/tbody/tr[3]” finn 3rd rad og henter teksten ved hjelp av getText ()-funksjonen
- Bruk Xpath “//*[@id=\”leftcontainer\”]/table/tbody/tr[3]/td[2]” finn den andre cellen i 2rd rad og henter teksten ved hjelp av getText ()-funksjonen
Produksjon:
Eksempel: Få maksimalt av alle verdiene i en kolonne med dynamisk tabell
I dette eksemplet vil vi få maksimum av alle verdier i en bestemt kolonne.
Se følgende tabell –
Her er koden
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>
Kodeforklaring:
- Ved å bruke Chrome-driveren finner vi netttabellen og får totalt antall rader ved å bruke XPath “.//*[@id='leftcontainer']/table/tbody/tr/td[1]”
- Ved å bruke for loop, itererer vi gjennom totalt antall rader og henter verdier én etter én. For å få neste rad bruker vi (i+1) i XPath
- Vi sammenligner gammel verdi med ny verdi og maksimal verdi skrives ut på slutten av for loop
Produksjon
Eksempel: Få alle verdiene til en dynamisk tabell
Tenk på følgende tabell: https://demo.guru99.com/test/table.html
Antall kolonner for hver rad er forskjellig.
Her har rad nummer 1, 2 og 4 3 celler, og rad nummer 3 har 2 celler, og rad nummer 5 har 1 celle.
Vi må få verdier av alle cellene
Her er koden:
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("-------------------------------------------------- "); } } }
Kodeforklaring:
- rows_count gir det totale antallet rader
- for hver rad får vi totalt antall kolonner ved hjelp av
rows_table.get(row).findElements(By.tagName("td"));
- Vi itererer gjennom hver kolonne og av hver rad og henter verdier.
Produksjon:
Sammendrag
- By.xpath() brukes ofte for å få tilgang til tabellelementer.
- Statiske netttabeller inn Selenium er konsistente i naturen. dvs. de har fast antall rader samt celledata.
- Dynamiske webtabeller er inkonsekvente, dvs. at de ikke har fast antall rader og celledata.
- Ved å bruke selenwebdriver kan vi enkelt håndtere dynamiske webtabeller.
- Selenium Webdriver lar oss få tilgang til dynamiske netttabeller etter deres X-bane. Å forstå hvordan man håndterer netttabeller i selen er avgjørende for effektiv automatiseringstesting.