9V WebDriver – 以两种方式处理表

原文: https://javabeginnerstutorial.com/selenium/9v-webdriver-handling-tables-two-ways/

嗨呀冠军! 欢迎回到关于使用 Selenium WebDriver 处理 Web 元素的另一篇文章。 您每天都会学到一些新知识,而这就是我们今天将要学习的内容:使用和不使用 XPath 处理表! 让我们回到我们的演示站点以更好地理解这个概念。

餐桌就像到处都是名人。 好吧,是时候该去见我们的明星了! 在整个这篇文章中,我们将使用演示站点中的“实践表”表。 在很多情况下,您可能需要检查表的特定单元格中是否存在特定数据。 因此,让我们继续前进,击中头部的粗体!

方法 1:不使用 XPath 处理表

在“练习表”中,我们有一个具有两行两列的表。 我们在第一行第二列中嵌套了另一个表。

例如

让我们尝试访问嵌套表的第一行,并将文本“Inner Row 1”打印到控制台。 由于我们不在这里使用 XPath,因此它将变得有些复杂。 但是一旦您掌握了如何以一个嵌套级别定位一个单元,然后访问更深层次的单元就轻松了! 第一步是使用标签名称“table”查找主表。 可以使用任何定位策略,但通常表的行和列没有 ID 或名称。 因此,访问它们的最佳方法是使用它们相应的标签名称。 第二步是使用获得的 Web 元素(表),找到嵌套表。 最后一步是,使用嵌套表 web 元素,找到第一行并获取其文本!

右键单击所需元素,然后选择检查元素,将给出相应的 HTML 代码段,如下所示,

  1. <table class="table table-bordered">
  2. <tr>
  3. <td>Row 1</td>
  4. <td>
  5. <table class="table table-bordered">
  6. <tr>
  7. <td>Inner Row 1</td>
  8. </tr>
  9. <tr>
  10. <td>Inner Row 2</td>
  11. </tr>
  12. </table>

代码:

  1. // Locate 'Table For Practice' using tagName
  2. WebElement practiceTable = driver.findElement(By.tagName("table"));
  3. // Locate Inner table using tagName
  4. WebElement innerTable = practiceTable.findElement(By.tagName("table"));
  5. // Locate 'Inner Row 1' using tagName
  6. WebElement innerRow1 = innerTable.findElement(By.tagName("td"));
  7. // Print the first row text to console
  8. System.out.println("Inner table first row text = " + innerRow1.getText());

方法 2:使用 XPath 处理表

第一种方法需要使用三个 Web 元素来访问所需的单元格。 如果涉及许多嵌套级别,则用于定位元素的命令数量将增加。 为了减轻这种情况,我们有 XPath 可以拯救我们! “XPath”一词会响起吗? 如果不是这样,请参考 XPath 的定位元素以简单的方式构造它

例如

让我们找到嵌套表的第二行,并将其内容打印到控制台。 相对路径是 XPath 的一部分,用于定位嵌套表的所需单元格。

代码:

  1. // Locate 'Inner Row 2' using xPath
  2. WebElement innerRow2 = driver.findElement(By.xpath("//table/tbody/tr[1]/td[2]/table/tbody/tr[2]/td[1]"));

概览

让我们一步一步地查看上面讨论的方法的代码!

场景

  1. 打开 Firefox 浏览器
  2. 导航到演示站点( https://chandanachaitanya.github.io/selenium-practice-site/
  3. 使用标签名称找到“练习表格”
  4. 使用标签名称找到嵌套表
  5. 使用标签名称找到嵌套表的第一行
  6. 打印文本“Inner Row 1”进行控制台
  7. 使用 XPath 找到嵌套表的第二行
  8. 打印文本“Inner Row 2”进行控制台

此方案的 JUnit 代码是,

  1. package com.blog.junitTests;
  2. import java.util.concurrent.TimeUnit;
  3. import org.junit.After;
  4. import org.junit.Before;
  5. import org.junit.Test;
  6. import org.openqa.selenium.By;
  7. import org.openqa.selenium.WebDriver;
  8. import org.openqa.selenium.WebElement;
  9. import org.openqa.selenium.firefox.FirefoxDriver;
  10. public class HandlingTables {
  11. // Declaring variables
  12. private WebDriver driver;
  13. private String baseUrl;
  14. @Before
  15. public void setUp() throws Exception {
  16. // Selenium version 3 beta releases require system property set up
  17. System.setProperty("webdriver.gecko.driver", "E:\\Softwares\\Selenium\\geckodriver-v0.10.0-win64\\geckodriver.exe");
  18. // Create a new instance for the class FirefoxDriver
  19. // that implements WebDriver interface
  20. driver = new FirefoxDriver();
  21. // Implicit wait for 5 seconds
  22. driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  23. // Assign the URL to be invoked to a String variable
  24. baseUrl = "https://chandanachaitanya.github.io/selenium-practice-site/";
  25. }
  26. @Test
  27. public void testPageTitle() throws Exception {
  28. // Open baseUrl in Firefox browser window
  29. driver.get(baseUrl);
  30. // Locate 'Table For Practice' using tagName
  31. WebElement practiceTable = driver.findElement(By.tagName("table"));
  32. // Locate Inner table using tagName
  33. WebElement innerTable = practiceTable.findElement(By.tagName("table"));
  34. // Locate 'Inner Row 1' using tagName
  35. WebElement innerRow1 = innerTable.findElement(By.tagName("td"));
  36. // Print the first row text to console
  37. System.out.println("Inner table first row text = " + innerRow1.getText());
  38. // Locate 'Inner Row 2' using xPath
  39. WebElement innerRow2 = driver.findElement(By.xpath("//table/tbody/tr[1]/td[2]/table/tbody/tr[2]/td[1]"));
  40. System.out.println("Inner table second row text = " + innerRow2.getText());
  41. } //End of @Test
  42. @After
  43. public void tearDown() throws Exception {
  44. // Close the Firefox browser
  45. driver.close();
  46. }
  47. }

执行结果:

每行代码都带有不言自明的注释,并且作为到目前为止涵盖的概念的一部分,代码得到了很好的解释。

注意到 Eclipse IDE 的 JUnit 视图后,绿色条显示测试用例已成功执行。 控制台窗口显示没有任何错误。 它还按预期显示了两个嵌套表行的文本。

Handling tables eclipse output

任何问题? 在评论部分开火!

稍后再见。 祝你今天愉快!