Manipulando tabelas dinâmicas da Web usando Selenium webdriver

Tabela da Web em Selenium

Existem dois tipos de tabelas HTML publicadas na web-

  1. Tabelas estáticas: Os dados são estáticos, ou seja, o número de linhas e colunas é fixo.
  2. Tabelas dinâmicas: Os dados são dinâmicos, ou seja, o número de linhas e colunas NÃO é fixo.

Como lidar com tabela dinâmica em Selenium

Abaixo está um exemplo de uma tabela web dinâmica em Selenium à venda. Com base nos filtros de data de entrada, o número de linhas será alterado. Portanto, é de natureza dinâmica.

Lidar com tabela dinâmica em Selenium

Manipular tabelas estáticas é fácil, mas manipular tabelas dinâmicas em Selenium é um pouco difícil porque as linhas e colunas não são constantes.

Usando X-Path para localizar elementos de tabela da Web

Antes de localizarmos o elemento web, primeiro vamos entender-

O que é um elemento da web?

Os elementos da Web nada mais são do que elementos HTML, como caixa de texto, botões de opção suspensos, botões de envio, etc. Esses elementos HTML são escritos com começo tag e termina com um final tag.

Por exemplo,

Meu primeiro documento HTML.

Etapas para obter o caminho X do elemento da web que queremos localizar.

Passo 1) No Chrome, vá para https://demo.guru99.com/test/web-table-element.php

Usando X-Path para localizar elementos de tabela da Web

Passo 2) Clique com o botão direito no elemento da web cujo caminho x deve ser obtido. No nosso caso, clique com o botão direito em “Empresa” e selecione a opção Inspecionar. A seguinte tela será mostrada –

Usando X-Path para localizar elementos de tabela da Web

Passo 3) Clique com o botão direito no elemento da web destacado> Selecione Copiar -> Copiar opção x-path.

Usando X-Path para localizar elementos de tabela da Web

Passo 4) Use o caminho X copiado “//*[@id=”leftcontainer”]/table/thead/tr/th [1]” em Selenium WebDriver para localizar o elemento.

Exemplo: buscar o número de linhas e colunas do Dynamic WebTable

Embora o tratamento dinâmico de tabelas da web em Selenium, não podemos prever seu número de linhas e colunas.

utilização Selenium driver da web, podemos encontrar

  • Número de linhas e colunas da tabela da web em Selenium
  • Dados da linha X ou da coluna Y.

Abaixo está o programa para buscar o número total de linhas e colunas para lidar com a tabela da web em Selenium:

Buscar número de linhas e colunas

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ção do código:

  • Aqui, primeiro declaramos o objeto Web Driver “wd” e o inicializamos no driver chrome.
  • Usamos Lista ao número total de colunas em “col”.
  • Os comandos findElements retornam uma lista de TODOS os elementos que correspondem ao localizador especificado
  • usando findElements e X-path //*[@id=\”leftcontainer\”]/table/thead/tr/th obtemos todas as colunas
  • Da mesma forma, repetimos o processo para as linhas.

Saída:

Buscar número de linhas e colunas

Exemplo: buscar o valor da célula de uma determinada linha e coluna da tabela dinâmica

Vamos supor que precisamos de 3rd linha da tabela e os dados de sua segunda célula. Veja a tabela abaixo-

Buscar o valor da célula de uma linha e coluna específicas

Na tabela acima, os dados são atualizados regularmente após algum período de tempo. Os dados que você tentar recuperar serão diferentes da captura de tela acima. No entanto, o código permanece o mesmo. Aqui está um exemplo de programa para obter os 3rd linha e 2nd dados da coluna.

Buscar o valor da célula de uma linha e coluna específicas

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ção do código:

  • A tabela é localizada usando a propriedade do localizador “tagname”.
  • utilização XPath “//*[@id=\”leftcontainer\”]/table/tbody/tr[3]” encontre o 3rd linha e obtém seu texto usando a função getText()
  • Usando Xpath “//*[@id=\”leftcontainer\”]/table/tbody/tr[3]/td[2]” encontre a 2ª célula em 3rd linha e obtém seu texto usando a função getText()

saída:

Buscar o valor da célula de uma linha e coluna específicas da tabela dinâmica

Exemplo: Obtenha o máximo de todos os valores em uma coluna da tabela dinâmica

Neste exemplo, obteremos o máximo de todos os valores em uma coluna específica.

Consulte a seguinte tabela -

Obtenha o máximo de todos os valores em uma coluna da tabela dinâmica

Aqui está o código

Obtenha o máximo de todos os valores em uma coluna da tabela dinâmica

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ção do código:

  • Usando o driver chrome, localizamos a tabela da web e obtemos o número total de linhas usando XPath “.//*[@id='leftcontainer']/table/tbody/tr/td[1]”
  • Usando o loop for, iteramos o número total de linhas e buscamos os valores um por um. Para obter a próxima linha, usamos (i+1) em XPath
  • Comparamos o valor antigo com o novo valor e o valor máximo é impresso no final do loop for

Saída

Obtenha o máximo de todos os valores em uma coluna da tabela dinâmica

Exemplo: Obtenha todos os valores de uma Tabela Dinâmica

Considere a seguinte tabela: https://demo.guru99.com/test/table.html

Obtenha todos os valores de uma Tabela Dinâmica

O número de colunas para cada linha é diferente.

Aqui, as linhas 1, 2 e 4 têm 3 células, e a linha 3 tem 2 células e a linha 5 tem 1 célula.

Precisamos obter valores de todas as células

Aqui está o código:

Obtenha todos os valores de uma tabela dinâmica

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ção do código:

  • rows_count fornece o número total de linhas
  • para cada linha obtemos o número total de colunas usando rows_table.get(row).findElements(By.tagName("td"));
  • Iteramos em cada coluna e em cada linha e buscamos valores.

saída:

Obtenha todos os valores de uma tabela dinâmica

Resumo

  • By.xpath() é comumente usado para acessar elementos da tabela.
  • Tabelas da web estáticas em Selenium são de natureza consistente. ou seja, eles têm um número fixo de linhas, bem como dados de células.
  • As tabelas dinâmicas da web são inconsistentes, ou seja, não possuem um número fixo de linhas e dados de células.
  • Usando o driver da web Selenium, podemos lidar facilmente com tabelas dinâmicas da web.
  • Selenium Webdriver nos permite acessar tabelas dinâmicas da web por meio de seus Caminho X

Saiba Mais Leia mais