如何处理 Web 表 Selenium

⚡ 智能摘要

Selenium Web 表格处理允许 QA 工程师使用 XPath、CSS 和 Web 表格从 HTML 行和列中读取表格数据。 Selenium 4. 相对定位符。本文将介绍静态表、嵌套表、属性谓词以及用于动态网格的人工智能技术。

  • 🧱 XPath 结构: 每个表定位器都以 //table 开头,并使用谓词深入到 tbody、tr 和 td 中。
  • 🔁 动态行: findElements 返回 WebElements 列表,以便循环可以在运行时计算行数和读取单元格。
  • 🪄 Selenium 4: 上方、下方和附近相对定位符简化了对已知锚定元素周围细胞的定位。
  • 🧠 人工智能定位器: 自愈工具能够检测列偏移并恢复行标识,无需手动编辑 XPath。
  • 🛠️ 检查快捷方式: 浏览器开发者工具会复制完整的 XPath,为了保证可靠性,您可以将其简化为第一个表。

Selenium Web 表格 XPath 示例

什么是 Web 表 Selenium?

A 网络表 in Selenium 表格是一种用于以表格形式呈现数据或信息的 Web 元素。显示的数据可以是静态的,也可以是动态的。通过 Web 元素方法结合定位器来访问 Web 表格的单元格和行。一个典型的例子是电子商务产品页面上显示的产品规格表格。

读取 HTML 网页表格

测试人员经常需要访问位于 HTML 表格中的元素,通常是文本值。然而,网页设计师很少会为单个单元格提供 id 或 name 属性。因此,诸如 `By.id()`、`By.name()` 或 `By.cssSelector()` 之类的方法很少奏效。在这种情况下,最可靠的选择是 `By.xpath()`,因为它会遍历表格标签内的父子关系。

如何处理 Web 表 Selenium

考虑下面的 HTML 代码来处理 web 表格 Selenium.

如何编写 XPath 表格 Selenium

我们将使用 XPath的 获取包含文本“第四个单元格”的单元格内部文本。

如何编写 XPath 表格 Selenium

步骤 1 – 设置父元素(表格)

WebDriver 中的 XPath 定位器始终以双斜杠“//”开头,后跟父元素。。由于我们处理的是 Selenium,父元素应该始终是标签。我们的第一部分 Selenium 因此,XPath 表定位器必须以“//table”开头。

Selenium Web 表示例

步骤 2 – 添加子元素

正下方的元素是, 所以是……的孩子反之,是以下哪项的父级XPath 中的所有子元素都位于其父元素的右侧,并用一个正斜杠“/”分隔,如下所示。

Selenium Web 表示例

步骤 3 – 添加谓词

这元素包含两个标签。这两个标签是子元素, 所以是两者的父母。元素之间是兄弟姐妹。 兄弟姐妹是指拥有同一父母的子元素.

到达要访问包含“第四个单元格”的内容,我们必须首先访问 第二 不是第一个。只写“//table/tbody/tr”会定位到第一个。标签。

那么我们如何获取第二个信息呢?答案是使用 谓词. 谓词是用方括号“[ ]”括起来的数字或HTML属性,用于区分子元素与其同级元素。由于我们需要的是第二行,所以我们使用“[2]”作为谓词。

 Selenium Web 表示例

如果省略谓词,XPath 将返回第一个兄弟节点。因此,以下任一 XPath 代码都将到达第一个兄弟节点。 。

Selenium 使用 Xpath 的 Web 表

步骤 4 – 使用适当的谓词添加后续子元素

我们需要的下一个要素是第二个应用步骤 2 和 3 中的规则,我们得到如下所示的 XPath。

网页表格 Selenium 使用 Xpath

现在我们有了正确的 XPath 定位器,就可以使用以下代码访问单元格并读取其内部文本。这里假设您已将 HTML 页面保存为 C 盘中的“newhtml.html”文件。

网页表格 Selenium 使用 Xpath

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/write-xpath-table.html";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(
        By.xpath("//table/tbody/tr[2]/td[2]")).getText();
    System.out.println(innerText);
    driver.quit();
}

网页表格 Selenium 使用 Xpath

访问嵌套表

同样的原则也适用于嵌套表。 嵌套表是指放置在另一个表内的表。。 一个例子如下所示。

如何访问嵌套表 Selenium

要使用上一节中的父/子关系和谓词概念访问包含文本“4-5-6”的单元格,我们可以编写如下所示的 XPath。

如何访问嵌套表 Selenium

以下 WebDriver 代码检索目标单元格的内部文本。

访问嵌套表 Selenium

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/accessing-nested-table.html";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(
        By.xpath("//table/tbody/tr[2]/td[2]/table/tbody/tr/td[2]")).getText();
    System.out.println(innerText);
    driver.quit();
}

下面的输出确认内表已被成功访问。

访问嵌套表 Selenium

使用属性作为谓词

如果元素位于 HTML 的深处,计算兄弟元素的数量会变得很麻烦,我们可以改用该元素的唯一属性。

在下面的示例中,“纽约到芝加哥”单元格深埋在内部。 Mercury 旅游主页。

Selenium 使用属性作为谓词的 Web 表示例

Selenium 使用属性作为谓词的 Web 表示例

我们可以使用表格的唯一属性(宽度=”270″)作为谓词。 通过在属性前加上 @ 符号,可以将属性用作谓词在上面的例子中,“纽约到芝加哥”单元格位于第一个单元格中。第四因此,我们的 XPath 应该看起来像下面显示的那样。

Selenium 以属性作为谓词的 Web 表示例

记住,当你把 XPath 放进去的时候…… Java用反斜杠转义“270”周围的双引号,这样 By.xpath() 字符串就不会提前终止。

Selenium 以属性作为谓词的 Web 表示例

我们现在准备使用下面的代码访问该单元格。

Selenium 以属性作为谓词的 Web 表示例

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/newtours/";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(By
        .xpath("//table[@width=\"270\"]/tbody/tr[4]/td"))
        .getText();
    System.out.println(innerText);
    driver.quit();
}

Selenium 以属性作为谓词的 Web 表示例

快捷方式:使用检查元素访问表格 Selenium

如果难以获取元素的索引或属性,生成 XPath 的最快方法是使用现代浏览器开发者工具中的“检查元素”功能。

请看下面的例子 Mercury 旅游主页。

Selenium 以属性作为谓词的 Web 表示例

第四步

右键单击目标单元格,选择“检查”以查看 DOM 路径,然后复制完整的 XPath。

Selenium 以属性作为谓词的 Web 表示例

第四步

查找第一个“表格”父元素并删除其左侧的所有内容。

Selenium 以属性作为谓词的 Web 表示例

第四步

在剩余的 XPath 前面加上双斜杠“//”,然后将其复制到您的 WebDriver 代码中。

Selenium 带属性的 Web 表示例

以下 WebDriver 代码检索深层嵌套元素的内部文本。

Selenium 带属性的 Web 表示例

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/newtours/";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(By
        .xpath("//table/tbody/tr/td[2]"
        + "//table/tbody/tr[4]/td/"
        + "table/tbody/tr/td[2]/"
        + "table/tbody/tr[2]/td[1]/"
        + "table[2]/tbody/tr[3]/td[2]/font"))
        .getText();
    System.out.println(innerText);
    driver.quit();
}

如何统计动态 Web 表格中的行数和列数

动态 Web 表格(例如仪表板或搜索结果)每次加载时呈现的行数都不同。要处理它们,请使用 findElements 获取所有将数据放入列表中,然后循环遍历并读取每个单元格。以下代码片段统计行数,并读取表中 id 为“customers”的每个单元格。

List<WebElement> rows = driver.findElements(
    By.xpath("//table[@id='customers']//tr"));
System.out.println("Total rows: " + rows.size());

for (int i = 1; i <= rows.size(); i++) {
    List<WebElement> cells = driver.findElements(
        By.xpath("//table[@id='customers']//tr[" + i + "]/td"));
    for (WebElement cell : cells) {
        System.out.println(cell.getText());
    }
}

将定位器包裹起来 WebDriverWait - visibilityOfAllElementsLocatedBy 当表格通过 AJAX 加载时,这可以防止在渲染速度较慢的网格中出现过时的元素引用。

Selenium 4. Web 表格的相对定位符

Selenium 第 4 版引入了相对定位器,它通过视觉位置来定位元素。当行顺序改变导致 XPath 索引失效时,相对定位器非常有用。 above(), below(), toLeftOf(), toRightOf()和 near() 所有方式都接受锚点 WebElement。

import static org.openqa.selenium.support.locators.RelativeLocator.with;

WebElement emailHeader = driver.findElement(By.xpath("//th[text()='Email']"));
WebElement emailCell = driver.findElement(
    with(By.tagName("td")).below(emailHeader));
System.out.println(emailCell.getText());

即使列顺序发生变化,相对定位符仍然清晰可读。在数据驱动型页面上,应将其与显式等待机制结合使用,以获得最佳结果。

用于处理动态网页表格的人工智能工具

人工智能辅助测试平台可减少频繁变化的电网上的定位器维护工作。诸如此类的工具 Testim, 马布尔和 功能化 使用计算机视觉和 DOM 模型来检测列偏移和自愈定位器。它们通过标题文本和单元格相似性来识别行,而不是使用固定的 XPath 索引。

对于纯 Selenium 项目、库等 赫莱尼姆 封装 WebDriver 并在运行时重写损坏的定位器。将这些工具与 WebDriverWait 结合使用,可以保持动态表格脚本的稳定性,而无需在每次 UI 更改后都重写选择器。

结语

  • 使用 xpath() 是访问 Web 表格单元格最可靠的方法。 Selenium.
  • 如果计算兄弟姐妹数量有困难,可以使用唯一属性作为谓词,并在其前面加上 @ 符号。
  • findElements 返回一个列表支持动态表中的行计数。
  • Selenium 4 个相对定位器(上方、下方、附近)减少了对位置 XPath 的依赖。
  • 在 DevTools 中使用“检查元素”功能可以加快对深层单元格生成 XPath 的速度。
  • 人工智能工具,例如 TestimMabl 和 Healenium 是用于改变网格的自愈定位器。

常见问题

网络表格 Selenium 表格是一种以行和列形式显示表格数据的 WebElement。它可以是静态的,也可以是动态的。由于表格很少会暴露单个单元格的唯一 ID,测试人员通常通过 WebElement 方法结合 XPath 或 CSS 定位器来访问其单元格。

大多数表格单元格没有 id 或 name 属性,因此 By.id() 和 By.name() 无法正常工作。XPath 会遍历 table、tbody、tr 和 td 元素的父子结构,因此它是定位单元格最可靠的方法。

使用 `driver.findElements(By.xpath(“//table[@id='tbl']//tr”)).size()` 计算行数,使用 `//table[@id='tbl']//tr[1]/td` 计算列数。`findElements` 方法返回一个 `List` 对象。支持 size() 函数,可快速计算行总计。

Selenium XPath 4 引入了相对定位符,例如 above()、below()、toLeftOf()、toRightOf() 和 near()。它们有助于定位位于已知锚点单元格周围的单元格,这在动态表格的 XPath 索引发生变化时非常有用。

使用 findElements 遍历每一行,然后使用 getText() 读取每个单元格。使用字符串连接动态构建 XPath,例如 //tr[“+i+”]/td[“+j+”]。在读取值之前,使用 WebDriverWait 等待表格加载完成。

是的。人工智能驱动的工具,例如 TestimMabl 和 Functionize 使用计算机视觉和 DOM 模型来检测表格边界、推断表头,并在列偏移时自动修复定位器。这减少了动态仪表板的 XPath 维护工作。

AI 模型会从之前的运行中学习行模式,并使用文本相似度而非固定索引来匹配单元格。即使行位置发生变化或列顺序改变,AI 定位器仍然能够找到目标位置,而无需重写 XPath。

findElement 返回单个 WebElement,如果找不到该 WebElement,则抛出 NoSuchElementException 异常。findElements 返回一个 List。如果未找到匹配项,则返回空列表。查找时请使用 findElements 方法。ping 跨越表格的行或列。

总结一下这篇文章: