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

⚡ Умное резюме

Обработка динамических веб-таблиц в Selenium WebDriver обучает итерации, чтению и проверке таблиц, строки или столбцы которых изменяются во время выполнения, охватывая идентификацию, XPath и поиск.pingи примеры.

  • 📋 Динамические таблицы: Таблицы, которые загружают количество строк и содержимое во время выполнения.
  • 🧭 Стратегия поиска: Создайте XPath с использованием заполнителей для строк и столбцов.
  • 🔁 Перебор строк: Цикл findElements без жестко заданного количества строк.
  • 📊 Читайте о ценностях: Используйте getText() для примераtracи подтвердить данные ячейки.
  • ⏳ «Умное ожидание»: Функция WebDriverWait приостанавливает выполнение до завершения отрисовки строк.
  • 🤖 Помощь ИИ: Инструменты искусственного интеллекта автоматически определяют структуру и самовосстанавливают локаторы.

Как работать с динамическими веб-таблицами в 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();
    }
}

Code Объяснение:

  • Здесь мы сначала объявили объект веб-драйвера «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();
    }
}

Code Объяснение:

  • Таблица находится с использованием свойства локатора «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>

Code Объяснение:

  • Используя драйвер 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("-------------------------------------------------- ");
    	}
   	}
}

Code Объяснение:

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

Результат:

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

Часто задаваемые вопросы (FAQ)

Таблица, строки или столбцы которой изменяются во время выполнения с помощью AJAX или фильтров.

Искусственный интеллект автоматически определяет структуру, генерирует XPath и самостоятельно восстанавливает селекторы при смещении столбцов.

Да. Copilot генерирует XPath для циклов по строкам, например, getText.tracутверждения и заявления.

//table[@id]//tr[ROW]/td[COL] с заменой заполнителей внутри циклов.

Используйте WebDriverWait с visibilityOfElementLocated для таблицы.

Пройтись по каждой ячейке столбца, проанализировать текст. track — наивысшее значение.

Таблица перерисовалась. Переместите элементы внутри цикла.

Используйте driver.findElements(By.xpath(“//table//tr”)).size().

Подведем итог этой публикации следующим образом: