Как да боравим с динамични уеб таблици в Selenium
Уеб таблица в Selenium
Има два типа HTML таблици, публикувани в мрежата-
- Статични маси: Данните са статични, т.е. броят на редовете и колоните е фиксиран.
- Динамични таблици: Данните са динамични, т.е. броят на редовете и колоните НЕ е фиксиран.
Как да работите с динамична таблица в Selenium
По-долу е даден пример за динамична уеб таблица в Selenium за продажби. Въз основа на филтрите за въведена дата броят на редовете ще бъде променен. Така че той е динамичен по природа.
Работата със статични таблици е лесна, но работата с динамични таблици в Selenium е малко трудно, тъй като редовете и колоните не са постоянни.
Използване на X-Path за намиране на елементи на уеб таблица
Преди да намерим уеб елемент, първо нека разберем -
Какво е уеб елемент?
Уеб елементите не са нищо друго освен HTML елементи като текстово поле, падащи радио бутони, бутони за изпращане и т.н. Тези HTML елементи са написани с Начало етикет и завършва с an край маркер.
Например,
Моят първи HTML документ.
Стъпки за получаване на X-path на уеб елемент, който искаме да намерим.
Стъпка 1) В Chrome отидете на https://demo.guru99.com/test/web-table-element.php
Стъпка 2) Щракнете с десния бутон върху уеб елемент, чийто x-path трябва да бъде извлечен. В нашия случай щракнете с десния бутон върху „Компания“ Изберете опцията Проверка. Ще се покаже следният екран –
Стъпка 3) Щракнете с десния бутон върху маркирания уеб елемент > Изберете Копиране -> Опция Копиране на x-path.
Стъпка 4) Използвайте копирания X-път „//*[@id=”leftcontainer”]/table/thead/tr/th [1]” в Selenium WebDriver за намиране на елемента.
Пример: Извличане на брой редове и колони от Dynamic WebTable
Докато се обработва динамична уеб таблица 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.
- Ние използваме List към общия брой колони в „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]” намерете 3-теrd ред и получава неговия текст с помощта на функцията getText ().
- Използвайки Xpath “//*[@id=\”leftcontainer\”]/table/tbody/tr[3]/td[2]” намерете 2-ра клетка в 3rd ред и получава неговия текст с помощта на функцията 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 цикъла
Output
Пример: Вземете всички стойности на динамична таблица
Разгледайте следната таблица: 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"));
- Преминаваме през всяка колона и всеки ред и извличаме стойности.
Продукция:
Oбобщение
- By.xpath() обикновено се използва за достъп до елементи на таблица.
- Статични уеб таблици в Selenium са последователни по природа. т.е. те имат фиксиран брой редове, както и клетъчни данни.
- Динамичните уеб таблици са непоследователни, т.е. те нямат фиксиран брой редове и данни за клетки.
- Използвайки селен уеб драйвер, можем лесно да обработваме динамични уеб таблици.
- Selenium Webdriver ни позволява достъп до динамични уеб таблици чрез техните X-път. Разбирането как да се работи с уеб таблица в селен е от решаващо значение за ефективно автоматизирано тестване.