多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 如何在 Selenium WebDriver 中处理 Web 表 > 原文: [https://www.guru99.com/selenium-webtable.html](https://www.guru99.com/selenium-webtable.html) ## 读取 HTML Web 表 有时我们需要访问 HTML 表中的元素(通常是文本)。 但是,对于 Web 设计人员来说,很少向表中的某个单元格提供 id 或 name 属性。 因此,我们不能使用“ By.id()”,“ By.name()”或“ By.cssSelector()”之类的常用方法。 在这种情况下,最可靠的选择是使用“ By.xpath()”方法访问它们。 在本教程中,您将学习- * [如何为表](#10)编写 XPath * [访问嵌套表](#11) * [使用属性作为谓词](#12) * [快捷方式:使用检查元素访问硒](#13)中的表 ## 如何为表编写 XPath 考虑下面的 HTML 代码。 ![](https://img.kancloud.cn/7a/11/7a115085a55c49c36b1db1306665a063_349x348.png).png) 我们将使用 [XPath](/xpath-selenium.html) 获取包含文本“第四个单元格”的单元格的内部文本。 ![](https://img.kancloud.cn/37/cd/37cd3f2a8dacd359d2ecfe77fcb8912f_213x224.png).png) **步骤 1-设置父元素(表格)** **WebDriver 中的 XPath 定位符始终以双斜杠“ //”开头,然后是父元素**。 由于我们正在处理表,因此父元素应始终为<表>标签。 因此,我们的 XPath 定位器的第一部分应以“ // table”开头。 ![](https://img.kancloud.cn/48/a1/48a106bae59aadb8e44a6fbc31126b45_146x37.png).png) **步骤 2-添加子元素** <表>紧邻的元素是< tbody >,因此我们可以说< tbody >是<表>的“子”。 而且,<表>是< tbody >的“父”。 XPath 中的所有子元素都放置在其父元素的右边,并用一个正斜杠“ /”分隔,如下所示。 ![](https://img.kancloud.cn/73/0a/730a823ed9eb94604f8744787d01ce23_195x208.png) ](/images/image022(1).png) [ ![](https://img.kancloud.cn/e0/43/e04356bfd5513eb63e6fda0e6b084c43_205x145.png) **步骤 3-添加谓词** <正文>元素包含两个< tr >标签。 现在我们可以说这两个< tr >标签是< tbody >的“子代”。 因此,可以说< tbody >是< tr >元素的父代。 我们可以得出的另一结论是,两个< tr >元素是同级元素。 **兄弟姐妹是指具有相同父项**的子元素。 要访问我们要访问的< td >(文本为“第四单元格”的那个),我们必须首先访问**第二个** < tr >,而不是第一个 。 如果我们只写“ // table / tbody / tr”,那么我们将访问第一个< tr >标签。 那么,我们如何访问第二个< tr >呢? 答案是使用**谓词**。 **谓词是用方括号“ []”括起来的数字或 HTML 属性,用于将子元素与其同级元素**区别开。 由于我们需要访问的< tr >是第二个,因此我们将使用“ [2]”作为谓词。 ![](https://img.kancloud.cn/66/15/66151c07719780bac710d778df4276c4_242x189.png) 如果我们不使用任何谓词,那么 XPath 将访问第一个兄弟。 因此,我们可以使用这两个 XPath 代码之一访问第一个< tr >。 ![](https://img.kancloud.cn/17/89/1789fb88c0e2bcfd9c09d5433fb9c302_535x218.png) **步骤 4-使用适当的谓词**添加成功的子元素 我们需要访问的下一个元素是第二个< td >。 运用从第 2 步和第 3 步中学到的原理,我们将最终确定 XPath 代码,如下所示。 ![](https://img.kancloud.cn/a3/2e/a32e555b1946e89d4eeb30bf8ea32703_227x42.png) 现在我们有了正确的 XPath 定位器,我们已经可以使用下面的代码访问所需的单元格并获取其内部文本。 假定您已将上述 HTML 代码保存为 C 驱动器中的“ newhtml.html”。 ![](https://img.kancloud.cn/79/46/7946345b0ea5e014f00c8a8d305ec186_466x176.png) ``` public static void main(String[] args) { String baseUrl = "http://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(); } } ``` ![](https://img.kancloud.cn/c1/8f/c18f645e25cb265d73504784310a5204_258x220.png) ## 访问嵌套表 上面讨论的相同原理适用于嵌套表。 **嵌套表是位于另一个表**中的表。 一个例子如下所示。 ![](https://img.kancloud.cn/cb/d8/cbd8a15a3973cd83a3e18577bdd5ea87_403x563.png) ](/images/image029.png) [ ![](https://img.kancloud.cn/a2/88/a288e9299dce6d0ac3079f8440d3fd11_245x190.png) 要使用上一节中的“ // parent / child”和谓词概念访问带有文本“ 4-5-6”的单元格,我们应该能够在下面提出 XPath 代码。 ![](https://img.kancloud.cn/32/6f/326f4ddd3f1f30b00758af5cd7449e77_394x143.png) 下面的 WebDriver 代码应该能够检索我们正在访问的单元格的内部文本。 ![](https://img.kancloud.cn/12/77/12779d2576584b214836e059f752dfdc_491x181.png) ``` public static void main(String[] args) { String baseUrl = "http://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(); } ``` 以下输出确认内部表已成功访问。 ![](https://img.kancloud.cn/29/d2/29d26b9c26410bbd827ec2bd9198050c_239x172.png) ## 使用属性作为谓词 如果该元素是用 HTML 代码深层编写的,则谓词所用的数字很难确定,那么我们可以改用该元素的唯一属性。 在下面的示例中,“纽约到芝加哥”单元格位于 Mercury Tours 主页的 HTML 代码的深处。 ![](https://img.kancloud.cn/8e/f6/8ef6c39d0c63930f8adfec8ef7619f6d_282x159.png) ![](https://img.kancloud.cn/c8/fa/c8fa25b73a6acc3a035dd31b273df702_779x639.png) 在这种情况下,我们可以使用表的唯一属性(width =“ 270”)作为谓词。 **通过在属性前面加上@符号**来用作谓词。 在上面的示例中,“纽约到芝加哥”单元格位于第四< tr >的第一< td >中,因此我们的 XPath 应该如下所示。 ![](https://img.kancloud.cn/6d/84/6d8413efe08050733245fdf962217201_319x37.png) 请记住,当我们将 XPath 代码放入 Java 中时,应在“ 270”的两边使用转义字符反斜杠“ \”作为双引号,以便 By.xpath()的字符串参数不会过早终止。 。 ![](https://img.kancloud.cn/c2/54/c254fac4e698a34a36813eca70d31386_416x117.png) 现在,我们准备使用下面的代码访问该单元格。 ![](https://img.kancloud.cn/03/57/0357bd4684ae30a3c08e8b35a1ec4604_467x191.png) ``` public static void main(String[] args) { String baseUrl = "http://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(); } ``` ![](https://img.kancloud.cn/80/27/802722fa220fa90ce256022efd3db361_259x176.png) ## 快捷方式:使用检查元素访问硒中的表 如果元素的编号或属性非常困难或无法获得,则生成 XPath 代码的最快方法是使用 Inspect Element。 请考虑以下 Mercury Tours 主页上的示例。 ![](https://img.kancloud.cn/33/8b/338b8aa756f6682375936c925e735531_297x232.png) **步骤 1** 使用 Firebug 获取 XPath 代码。 ![](https://img.kancloud.cn/c8/7f/c87f097ce93a1bc609ada4b222629224_578x533.png) **步骤 2** 查找第一个“表”父元素,然后删除其左侧的所有内容。 ![](https://img.kancloud.cn/85/42/8542e95d0c5161668e9fff1580abf3c8_392x139.png) **步骤 3** 在代码的其余部分前面加上双斜杠“ //”,并将其复制到 WebDriver 代码中。 ![](https://img.kancloud.cn/f1/94/f194b0a72e2ab5ffd364649f9474f9c1_406x329.png) 下面的 WebDriver 代码将能够成功检索我们正在访问的元素的内部文本。 ![](https://img.kancloud.cn/10/b8/10b8d145b3748d01bab8429d790b1c65_395x441.png) ``` public static void main(String[] args) { String baseUrl = "http://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(); } ``` **摘要** * By.xpath()通常用于访问表元素。 * 如果该元素是用 HTML 代码深层编写的,则谓词所用的数字很难确定,那么我们可以改用该元素的唯一属性。 * 通过在属性前面加上@符号来将其用作谓词。 * 使用 Inspect 元素访问 Selenium 中的表