如何处理动态 Web 表 Selenium
网页表格 Selenium
网络上发布的 HTML 表格有两种类型:
- 静态表:数据是静态的,即行数和列数是固定的。
- 动态表:数据是动态的,即行数和列数不是固定的。
如何处理动态表 Selenium
下面是一个动态网页表格的例子 Selenium 针对销售。根据输入日期过滤器,行数将发生改变。因此,它本质上是动态的。
处理静态表很容易,但处理动态表 Selenium 有点困难,因为行和列不是恒定的。
使用 X-Path 定位 Web 表元素
在定位 Web 元素之前,我们首先要了解-
什么是网络元素?
Web 元素不过是 HTML 元素,例如文本框、下拉单选按钮、提交按钮等。这些 HTML 元素是用 开始 标签并以 end 标签。
例如,
我的第一个 HTML 文档。
获取我们想要定位的 Web 元素的 X-path 的步骤。
步骤1) 在 Chrome 中,转到 https://demo.guru99.com/test/web-table-element.php
步骤2) 右键单击要获取其 x-path 的 Web 元素。在我们的例子中,右键单击“公司”选择检查选项。将显示以下屏幕 -
步骤3) 右键单击突出显示的 Web 元素 > 选择复制 -> 复制 x-path 选项。
步骤4) 使用复制的 X-path “//*[@id=”leftcontainer”]/table/thead/tr/th [1]” Selenium WebDriver 来定位元素。
示例:从动态 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(); } }
代码说明:
- 这里我们首先声明 Web Driver 对象“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]” 找到第 3 个rd 行并使用 getText () 函数获取其文本
- 使用 Xpath “//*[@id=\”leftcontainer\”]/table/tbody/tr[3]/td[2]” 找到 2 中的第 3 个单元格rd 行并使用 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 循环,我们遍历总行数并逐一获取值。要获取下一行,我们在 XPath 中使用 (i+1)
- 我们将旧值与新值进行比较,并在 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 web 驱动程序,我们可以轻松处理动态网络表。
- Selenium Webdriver 允许我们通过其访问动态网页表 X-路径。了解如何在 Selenium 中处理 Web 表对于有效的自动化测试至关重要。