Jak zacházet s dynamickými webovými tabulkami v Selenium

Webová tabulka v Selenium

Na webu jsou publikovány dva typy HTML tabulek -

  1. Statické tabulky: Data jsou statická, tj. počet řádků a sloupců je pevný.
  2. Dynamické tabulky: Data jsou dynamická, tj. počet řádků a sloupců NENÍ pevný.

Jak zacházet s dynamickým stolem v Selenium

Níže je uveden příklad dynamické webové tabulky v Selenium pro Prodej. Na základě vstupních datových filtrů se počet řádků změní. Má tedy dynamický charakter.

Manipulujte s dynamickým stolem Selenium

Manipulace se statickou tabulkou je snadná, ale manipulace s dynamickými tabulkami v Selenium je trochu obtížné, protože řádky a sloupce nejsou konstantní.

Použití X-Path k vyhledání prvků webové tabulky

Než najdeme webový prvek, nejprve si ujasněme-

Co je webový prvek?

Webové prvky nejsou nic jiného než prvky HTML, jako je textové pole, přepínače rozevírací nabídky, tlačítka pro odeslání atd. Tyto prvky HTML jsou napsány pomocí Začít tag a končí na konec štítek.

Například,

Můj první HTML dokument.

Kroky pro získání X-path webového prvku, který chceme najít.

Krok 1) V Chrome přejděte na https://demo.guru99.com/test/web-table-element.php

Použití X-Path k vyhledání prvků webové tabulky

Krok 2) Klikněte pravým tlačítkem na webový prvek, jehož x-cesta má být načtena. V našem případě klikněte pravým tlačítkem na „Společnost“ Vyberte možnost Inspect. Zobrazí se následující obrazovka –

Použití X-Path k vyhledání prvků webové tabulky

Krok 3) Klikněte pravým tlačítkem na zvýrazněný webový prvek > vyberte možnost Kopírovat -> Kopírovat cestu x.

Použití X-Path k vyhledání prvků webové tabulky

Krok 4) Použijte zkopírovanou cestu X „//*[@id=”leftcontainer”]/table/thead/tr/th [1]” v Selenium WebDriver k nalezení prvku.

Příklad: Načtení počtu řádků a sloupců z dynamické webové tabulky

Při zpracování dynamických webových tabulek v Selenium, nemůžeme předpovědět jeho počet řádků a sloupců.

Použití Selenium webový ovladač, najdeme

  • Počet řádků a sloupců webové tabulky v Selenium
  • Data řádku X nebo sloupce Y.

Níže je uveden program pro načtení celkového počtu řádků a sloupců pro manipulaci s webovou tabulkou Selenium:

Načíst počet řádků a sloupců

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

Vysvětlení kódu:

  • Zde jsme nejprve deklarovali objekt webového ovladače „wd“ &inicializovali jsme jej na ovladač chrome.
  • Používáme Seznam na celkový počet sloupců ve „sloupec“.
  • Příkazy findElements vrátí seznam VŠECH prvků odpovídajících zadanému lokátoru
  • pomocí findElements a X-path //*[@id=\”leftcontainer\”]/table/thead/tr/th získáme všechny sloupce
  • Podobně postup opakujeme pro řádky.

Výstup:

Načíst počet řádků a sloupců

Příklad: Načtení hodnoty buňky konkrétního řádku a sloupce dynamické tabulky

Předpokládejme, že potřebujeme 3rd řádek tabulky a data jeho druhé buňky. Viz tabulka níže -

Načíst hodnotu buňky konkrétního řádku a sloupce

Ve výše uvedené tabulce jsou data pravidelně aktualizována po určité době. Data, která se pokusíte načíst, se budou lišit od výše uvedeného snímku obrazovky. Kód však zůstává stejný. Zde je ukázkový program pro získání 3rd řádek a 2nd údaje sloupce.

Načíst hodnotu buňky konkrétního řádku a sloupce

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

Vysvětlení kódu:

  • Tabulka je umístěna pomocí vlastnosti lokátoru „tagname“.
  • Použití XPath „//*[@id=\”leftcontainer\”]/table/tbody/tr[3]“ najděte 3rd řádek a získá svůj text pomocí funkce getText ().
  • Pomocí Xpath „//*[@id=\”leftcontainer\”]/table/tbody/tr[3]/td[2]“ najděte 2. buňku ve 3rd řádek a získá svůj text pomocí funkce getText ().

Výstup:

Načíst hodnotu buňky konkrétního řádku a sloupce dynamické tabulky

Příklad: Získejte maximum ze všech hodnot ve sloupci dynamické tabulky

V tomto příkladu získáme maximum ze všech hodnot v konkrétním sloupci.

Podívejte se na následující tabulku –

Získejte maximum ze všech hodnot ve sloupci dynamické tabulky

Zde je kód

Získejte maximum ze všech hodnot ve sloupci dynamické tabulky

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>

Vysvětlení kódu:

  • Pomocí ovladače chrome najdeme webovou tabulku a získáme celkový počet řádků pomocí XPath „.//*[@id='leftcontainer']/table/tbody/tr/td[1]“
  • Pomocí cyklu for iterujeme celkovým počtem řádků a načítáme hodnoty jednu po druhé. K získání dalšího řádku použijeme (i+1) v XPath
  • Porovnáváme starou hodnotu s novou hodnotou a maximální hodnota je vytištěna na konci cyklu for

Výstup

Získejte maximum ze všech hodnot ve sloupci dynamické tabulky

Příklad: Získejte všechny hodnoty dynamické tabulky

Zvažte následující tabulku: https://demo.guru99.com/test/table.html

Získejte všechny hodnoty dynamické tabulky

Počet sloupců pro každý řádek je jiný.

Zde má řádek číslo 1, 2 a 4 3 buňky a řádek číslo 3 má 2 buňky a řádek číslo 5 má 1 buňku.

Potřebujeme získat hodnoty všech buněk

Zde je kód:

Získejte všechny hodnoty dynamické tabulky

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

Vysvětlení kódu:

  • rows_count udává celkový počet řádků
  • pro každý řádek dostaneme celkový počet sloupců pomocí rows_table.get(row).findElements(By.tagName("td"));
  • Iterujeme každý sloupec a každý řádek a načítáme hodnoty.

Výstup:

Získejte všechny hodnoty dynamické tabulky

Shrnutí

  • By.xpath() se běžně používá pro přístup k prvkům tabulky.
  • Statické webové tabulky v Selenium jsou svou povahou konzistentní. tj. mají pevný počet řádků i data buňky.
  • Dynamické webové tabulky jsou nekonzistentní, tj. nemají pevný počet dat řádků a buněk.
  • Pomocí webového ovladače selenium snadno zvládneme dynamické webové tabulky.
  • Selenium Webdriver nám umožňuje přistupovat k dynamickým webovým tabulkám jejich prostřednictvím X-cesta. Pochopení toho, jak zacházet s webovým stolem v selenu, je klíčové pro efektivní testování automatizace.

Více Přečtěte si více