Hur man hanterar dynamiska webbtabeller i Selenium

Webbtabell in Selenium

Det finns två typer av HTML-tabeller publicerade på webben-

  1. Statiska tabeller: Data är statisk dvs antalet rader och kolumner är fasta.
  2. Dynamiska tabeller: Data är dynamisk, dvs. Antal rader och kolumner är INTE fasta.

Hur man hanterar dynamisk tabell i Selenium

Nedan är ett exempel på en dynamisk webbtabell i Selenium till salu. Baserat på inmatade datumfilter kommer antalet rader att ändras. Så det är dynamiskt till sin natur.

Hantera Dynamic Table in Selenium

Att hantera statiska tabeller är enkelt, men att hantera dynamiska tabeller i Selenium är lite svårt eftersom rader och kolumner inte är konstanta.

Använda X-Path för att hitta webbtabellelement

Innan vi hittar webbelement, låt oss först förstå-

Vad är ett webbelement?

Webbelement är inget annat än HTML-element som textruta, alternativknappar för rullgardinsmenyn, skicka knappar, etc. Dessa HTML-element är skrivna med starta tagg och slutar med en änden märka.

Till exempel,

Mitt första HTML-dokument.

Steg för att få X-väg för webbelement som vi vill hitta.

Steg 1) Gå till i Chrome https://demo.guru99.com/test/web-table-element.php

Använda X-Path för att hitta webbtabellelement

Steg 2) Högerklicka på webbelement vars x-sökväg ska hämtas. I vårt fall, högerklicka på "Företag" Välj alternativet Inspektera. Följande skärm kommer att visas -

Använda X-Path för att hitta webbtabellelement

Steg 3) Högerklicka på det markerade webbelementet > Välj Kopiera -> Kopiera x-sökväg.

Använda X-Path för att hitta webbtabellelement

Steg 4) Använd den kopierade X-sökvägen “//*[@id=”leftcontainer”]/table/thead/tr/th [1]” i Selenium WebDriver för att hitta elementet.

Exempel: Hämta antal rader och kolumner från Dynamic WebTable

Medan dynamisk webbtabellshantering in Selenium, kan vi inte förutsäga antalet rader och kolumner.

Använda Selenium webbdrivrutin kan vi hitta

  • Antal rader och kolumner i webbtabellen Selenium
  • X rad eller Y kolumns data.

Nedan finns ett program för att hämta totalt antal rader och kolumner för att hantera webbtabeller i Selenium:

Hämta antal rader och kolumner

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

Kodförklaring:

  • Här har vi först deklarerat Web Driver-objektet "wd" & initierat det till chrome-drivrutinen.
  • Vi använder List till totalt antal kolumner i "kol".
  • findElements-kommandon returnerar en lista över ALLA element som matchar den angivna lokaliseringen
  • med findElements och X-path //*[@id=\”leftcontainer\”]/table/thead/tr/th får vi alla kolumner
  • På samma sätt upprepar vi processen för rader.

Produktion:

Hämta antal rader och kolumner

Exempel: Hämta cellvärde för en viss rad och kolumn i den dynamiska tabellen

Låt oss anta att vi behöver 3rd rad i tabellen och dess andra cells data. Se tabellen nedan-

Hämta cellvärde för en viss rad och kolumn

I ovanstående tabell uppdateras data regelbundet efter en viss tid. Datan du försöker hämta kommer att skilja sig från skärmdumpen ovan. Koden förblir dock densamma. Här är exempel på program för att få 3rd rad och 2nd kolumns data.

Hämta cellvärde för en viss rad och kolumn

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

Kodförklaring:

  • Tabellen är lokaliserad med hjälp av lokaliseringsegenskapen "tagnamn".
  • Använda XPath “//*[@id=\”leftcontainer\”]/table/tbody/tr[3]” hitta 3:anrd rad och hämtar sin text med funktionen getText ().
  • Använd Xpath “//*[@id=\”leftcontainer\”]/table/tbody/tr[3]/td[2]” hitta den andra cellen i 2rd rad och hämtar sin text med funktionen getText ().

Produktion:

Hämta cellvärde för en viss rad och kolumn i den dynamiska tabellen

Exempel: Få maximalt av alla värden i en kolumn med dynamisk tabell

I det här exemplet kommer vi att få maximalt av alla värden i en viss kolumn.

Se följande tabell –

Få maximalt av alla värden i en kolumn med dynamisk tabell

Här är koden

Få maximalt av alla värden i en kolumn med dynamisk tabell

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>

Kodförklaring:

  • Med hjälp av chrome-drivrutinen hittar vi webbtabellen och får det totala antalet rader med XPath ".//*[@id='leftcontainer']/table/tbody/tr/td[1]"
  • Med hjälp av for loop, itererar vi genom totalt antal rader och hämtar värden en efter en. För att få nästa rad använder vi (i+1) i XPath
  • Vi jämför gammalt värde med nytt värde och maximalt värde skrivs ut i slutet av for loop

Produktion

Få maximalt av alla värden i en kolumn med dynamisk tabell

Exempel: Hämta alla värden för en dynamisk tabell

Tänk på följande tabell: https://demo.guru99.com/test/table.html

Få alla värden för en dynamisk tabell

Antalet kolumner för varje rad är olika.

Här har rad nummer 1, 2 och 4 3 celler, och rad nummer 3 har 2 celler och rad nummer 5 har 1 cell.

Vi måste få värden på alla celler

Här är koden:

Få alla värden för en dynamisk tabell

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

Kodförklaring:

  • rows_count ger det totala antalet rader
  • för varje rad får vi det totala antalet kolumner som använder rows_table.get(row).findElements(By.tagName("td"));
  • Vi itererar genom varje kolumn och av varje rad och hämtar värden.

Produktion:

Få alla värden för en dynamisk tabell

Sammanfattning

  • By.xpath() används ofta för att komma åt tabellelement.
  • Statiska webbtabeller in Selenium är konsekventa till sin natur. dvs de har fast antal rader samt celldata.
  • Dynamiska webbtabeller är inkonsekventa, dvs de har inte ett fast antal rader och celldata.
  • Genom att använda selenwebbdrivrutin kan vi enkelt hantera dynamiska webbtabeller.
  • Selenium Webdriver låter oss komma åt dynamiska webbtabeller av deras X-väg. Att förstå hur man hanterar webbbord i selen är avgörande för effektiv automationstestning.

Läs mer Readmore