Как работать с динамическими веб-таблицами в Selenium

Веб-таблица в Selenium

В Интернете опубликовано два типа HTML-таблиц:

  1. Статические таблицы: данные статичны, т.е. количество строк и столбцов фиксировано.
  2. Динамические таблицы: Данные являются динамическими, т.е. количество строк и столбцов НЕ фиксировано.

Как обрабатывать динамическую таблицу в Selenium

Ниже приведен пример динамической веб-таблицы в Selenium для продаж. В зависимости от фильтров даты ввода количество строк будет изменено. Итак, оно носит динамичный характер.

Обработка динамической таблицы в Selenium

Обрабатывать статические таблицы легко, но обрабатывать динамические таблицы в Selenium немного сложно, поскольку строки и столбцы не являются постоянными.

Использование X-Path для поиска элементов веб-таблицы

Прежде чем мы найдем веб-элемент, давайте сначала разберемся:

Что такое веб-элемент?

Веб-элементы — это не что иное, как элементы HTML, такие как текстовое поле, переключатели раскрывающихся списков, кнопки отправки и т. д. Эти элементы HTML написаны с помощью Начало и заканчивается тегом конец тег.

Например,

Мой первый HTML-документ.

Шаги по получению X-пути веб-элемента, который мы хотим найти.

Шаг 1) В Chrome перейдите к https://demo.guru99.com/test/web-table-element.php

Использование X-Path для поиска элементов веб-таблицы

Шаг 2) Щелкните правой кнопкой мыши веб-элемент, x-путь которого необходимо получить. В нашем случае щелкните правой кнопкой мыши «Компания» и выберите опцию «Проверить». Появится следующий экран –

Использование X-Path для поиска элементов веб-таблицы

Шаг 3) Щелкните правой кнопкой мыши выделенный веб-элемент > выберите «Копировать» -> «Копировать x-путь».

Использование X-Path для поиска элементов веб-таблицы

Шаг 4) Используйте скопированный X-путь «//*[@id="leftcontainer"]/table/thead/tr/th [1]» в Selenium WebDriver, чтобы найти элемент.

Пример. Получение количества строк и столбцов из динамической веб-таблицы.

Хотя обработка динамических веб-таблиц в Selenium, мы не можем предсказать количество строк и столбцов.

. Selenium веб-драйвер, мы можем найти

  • Количество строк и столбцов веб-таблицы в Selenium
  • Данные строки X или столбца Y.

Ниже приведена программа для получения общего количества строк и столбцов для обработки веб-таблицы в 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();
    }
}

Пояснение к коду:

  • Здесь мы сначала объявили объект веб-драйвера «wd» и инициализировали его в драйвере Chrome.
  • Мы используем список к общему количеству столбцов в «col».
  • Команды findElements возвращают список ВСЕХ элементов, соответствующих указанному локатору
  • используя findElements и X-path //*[@id=\”leftcontainer\”]/table/thead/tr/th мы получаем все столбцы
  • Аналогично повторяем процесс для строк.

Вывод:

Получить количество строк и столбцов

Пример. Получение значения ячейки определенной строки и столбца динамической таблицы.

Предположим, нам нужно 3rd строку таблицы и данные ее второй ячейки. Смотрите таблицу ниже-

Получить значение ячейки определенной строки и столбца

В приведенной выше таблице данные регулярно обновляются через определенный промежуток времени. Данные, которые вы пытаетесь получить, будут отличаться от показанных на снимке экрана выше. Однако код остается прежним. Вот пример программы для получения 3rd ряд и 2nd данные столбца.

Получить значение ячейки определенной строки и столбца

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

Пояснение к коду:

  • Таблица находится с использованием свойства локатора «tagname».
  • . XPath «//*[@id=\»leftcontainer\»]/table/tbody/tr[3]» найдите 3rd строку и получает ее текст с помощью функции getText()
  • Используя Xpath «//*[@id=\»leftcontainer\»]/table/tbody/tr[3]/td[2]» найдите вторую ячейку в 2rd строку и получает ее текст с помощью функции getText()

Результат:

Получить значение ячейки определенной строки и столбца динамической таблицы

Пример. Получить максимальное значение из всех значений в столбце динамической таблицы.

В этом примере мы получим максимальное из всех значений в определенном столбце.

См. следующую таблицу –

Получить максимум всех значений в столбце динамической таблицы

Вот код

Получить максимум всех значений в столбце динамической таблицы

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>

Пояснение к коду:

  • Используя драйвер Chrome, мы находим веб-таблицу и получаем общее количество строк, используя XPath «.//*[@id='leftcontainer']/table/tbody/tr/td[1]»
  • Используя цикл for, мы перебираем общее количество строк и извлекаем значения одно за другим. Чтобы получить следующую строку, мы используем (i+1) в XPath.
  • Мы сравниваем старое значение с новым значением, и максимальное значение печатается в конце цикла for.

Вывод

Получить максимум всех значений в столбце динамической таблицы

Пример. Получение всех значений динамической таблицы.

Рассмотрим следующую таблицу: https://demo.guru99.com/test/table.html

Получить все значения динамической таблицы

Количество столбцов для каждой строки разное.

Здесь строка № 1, 2 и 4 имеет по 3 ячейки, строка № 3 – 2 ячейки, а строка № 5 – 1 ячейку.

Нам нужно получить значения всех ячеек

Вот код:

Получить все значения динамической таблицы

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

Пояснение к коду:

  • rows_count дает общее количество строк
  • для каждой строки мы получаем общее количество столбцов, используя rows_table.get(row).findElements(By.tagName("td"));
  • Мы перебираем каждый столбец и каждую строку и извлекаем значения.

Результат:

Получить все значения динамической таблицы

Резюме

  • By.xpath() обычно используется для доступа к элементам таблицы.
  • Статические веб-таблицы в Selenium носят последовательный характер. т. е. у них есть фиксированное количество строк, а также данных ячеек.
  • Динамические веб-таблицы непоследовательны, т. е. не имеют фиксированного количества строк и ячеек данных.
  • Используя веб-драйвер Selenium, мы можем легко обрабатывать динамические веб-таблицы.
  • Selenium Webdriver позволяет нам получать доступ к динамическим веб-таблицам по их X-путь. Понимание того, как работать с веб-таблицами в Selenium, имеет решающее значение для эффективного автоматизированного тестирования.

Читать прочитайте больше