【问题标题】:How to get table data from a selenium webelement and check column value如何从 selenium webelement 获取表格数据并检查列值
【发布时间】:2022-02-03 21:07:36
【问题描述】:

在我的 selenium 脚本中,我想从下表中获取表格数据,并比较“电话”列下的所有值并检查所有值是否只是数字。 我尝试使用以下代码,如果不是打印每列的文本,而是显示行数。

WebElement table = driver.findElement(By.xpath(“//table[contains(@class, 'table table-style')]”));
        List<WebElement> rowsList = table.findElements(By.tagName("tr"));

        List<WebElement> columnsList = null;

       for (WebElement row : rowsList) {
               columnsList = row.findElements(By.tagName("td"));

                for (WebElement column : columnsList) {
                       System.out.println("column text" + column.getText()+ ", "); // here is is just printing number of rows, like 1, 2
               }

        }

<table class="table table-style" >
    
    <thead>
    <tr>
    <th class="text-center">
            Id
    </th>
    <th class="text-center">username</th>
    <th class="text-center">email</th>
    <th class="text-center">phone</th>
    <th class="text-center">address1</th>
    <th class="text-center">address2</th>
    <th class="text-center">City</th>
    </tr>
    </thead>
    
    <tbody>
    <tr>
    
    <td class="text-center">Here is user name</td>
    <td class="text-center">email@email.com</td>
    <td class="text-center">123456789</td>
    <td class="text-center">address 1</td>
    <td class="text-center">address 2</td>
    <td class="text-center">city name</td>
    </tr>
        <tr>
    
    <td class="text-center">Here is user name</td>
    <td class="text-center">email@email.com</td>
    <td class="text-center">99999999</td>
    <td class="text-center">address 1</td>
    <td class="text-center">address 2</td>
    <td class="text-center">city name</td>
    </tr>
    
     <tr>
    
    <td class="text-center">Here is user name</td>
    <td class="text-center">email@email.com</td>
    <td class="text-center">abcdef12</td>
    <td class="text-center">address 1</td>
    <td class="text-center">address 2</td>
    <td class="text-center">city name</td>
    </tr>
    
</table>

【问题讨论】:

  • 您要打印什么? “电话”列下的值每列的文本
  • 这很奇怪。如果您检查其中一行的innerHTML,会返回什么?
  • @undetetec selenium,我需要 phone 列下的值

标签: java selenium


【解决方案1】:

通过列名获取单元格值

在您的案例中没有任何额外的属性来检测某个单元格属于某个列。

我建议使用 XPATH count 方法通过文本检测列号,并使用它来按列获取所有单元格。

对于电话列:

List<WebElement> phoneNumbersList = table.findElements(By.xpath("//td[count(//th[text()='phone']/preceding-sibling::th)]"));

// the same can be dome for "email" and other columns.

检查所有值是否都只是数字

看看这个: Java String - See if a string contains only numbers and not letters


我尝试使用以下代码,如果不是打印每列的文本,而是显示行数。

我可以确认此代码:

@Test
public void printTable() {
    WebDriver driver = new ChromeDriver(new ChromeOptions());
    driver.manage().window().maximize();
    //local html file
    driver.get("file:///D:/projects/print-table/src/test/resources/test.html");

    WebElement table = driver.findElement(By.xpath("//table[contains(@class, 'table table-style')]"));
    List<WebElement> rowsList = table.findElements(By.tagName("tr"));

    List<WebElement> columnsList = null;

    for (WebElement row : rowsList) {
        columnsList = row.findElements(By.tagName("td"));

        for (WebElement column : columnsList) {
            System.out.println("column text" + column.getText()+ ", "); // here is is just printing number of rows, like 1, 2
        }

    }
    driver.quit();
}

打印:

column textHere is user name, 
column textemail@email.com, 
column text123456789, 
column textaddress 1, 
column textaddress 2, 
column textcity name, 
column textHere is user name, 
column textemail@email.com, 
column text99999999, 
column textaddress 1, 
column textaddress 2, 
column textcity name, 
column textHere is user name, 
column textemail@email.com, 
column textabcdef12, 
column textaddress 1, 
column textaddress 2, 
column textcity name, 

所以,您提供的 sn-p 可以正常工作。

【讨论】:

  • 你的方法效果很好!我注意到 PHONE 列 TH 被一些额外的 HTML 文本包围,如下所示,我如何在这里使用前置兄弟,我尝试了这个也不起作用。 By.xpath("//td[count(//a[text()='Phone']/preceding-sibling::a)]" 电话
  • @user1015388 对于这个新的页面源试试这个//td[count(//th[contains(., 'Phone')]/preceding-sibling::th)]contains 在这里,因为 Phone 被空格包围。而. 表示文本可能在某个子元素中。
猜你喜欢
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
相关资源
最近更新 更多