Selenium Chrome WebDriver - 无法获取单元格列表

时间:2017-05-14 13:21:02

标签: selenium selenium-webdriver selenium-chromedriver

我有以下代码:

        WebElement table = a_chromeWebDriver.findElement(By.className("stats-table"));
        List<WebElement> allRows = table.findElements(By.tagName("tr"));

        system.out.println(allRows.size());

        for (WebElement row : allRows) {


            ArrayList<WebElement> cells = (ArrayList<WebElement>) row.findElements(By.tagName("td"));
    ...

我正在类似这样的html上执行此代码:

<table id="table-type-1" class="stats-table stats-main table-1">
    <thead>
        <tr class="main">
            <th class="aaaa" data-type="rank" title="Rank">

            </th>
            A number of headers here...
        </tr>
    </thead>
    <tbody title="">
        <tr bla bla bla>
            <td class="bla bla bla" title="bla bla bla>1.</td>
            <td class="bla bla bla"></td>
            <td class="bla bla bla">36</td>
            <td class="bla bla bla">28</td>
            <td class="bla bla bla">3</td>
        </tr>
            <td class="bla bla bla" title="bla bla bla>1.</td>
            <td class="bla bla bla"></td>
            <td class="bla bla bla">45</td>
            <td class="bla bla bla">fnf</td>
            <td class="bla bla bla">kfkfk</td>
        </tr>
        .
        .
        .

allRows大小为我提供了正确的行数。 出于某种原因,我得到 cells = null 。 我也试过By.xpath(“td”),但没有用。

你能告诉我吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

使用此代码循环时:

 for (WebElement row : allRows) {


        ArrayList<WebElement> cells = (ArrayList<WebElement>) row.findElements(By.tagName("td"));

        System.out.println("CellCount " + cells.size());
    }

您会看到输出为:

CellCount 0
CellCount 4
CellCount 4

这是因为您的代码选择的第一行来自<thead>部分,其中没有<td>个元素,其工作正常;所以你必须为第一个<tr>

制作例外

您可以将allRows元素更改为以下内容:

List<WebElement> allRows = table.findElements(By.xpath("tbody//tr"));

答案 1 :(得分:2)

首先,查找所有行,然后迭代它们:

  List<WebElement> allRows = driver.findElements(By.cssSelector("#table-type-1 > tbody > tr"));

  for(WebElement row : allRows){
        List<WebElement> cells = row.findElements(By.tagName("td"));
        System.out.println("Cell count: " + cells.size());//cell count for a row
  }

答案 2 :(得分:2)

HTML <table>包含3个部分:<thead><tbody><tfoot>

通常,您只会看到<thead><tbody>

正确的方法是首先确定每个部分,然后逐步完成子元素。

// Get the table
WebElement table = a_chromeWebDriver.findElement(By.id("table-type-1"));

// Get the thead in table
WebElement thead = table.findElement(By.tagName("thead"));

// Get the tbody in table
WebElement tbody = table.findElement(By.tagName("tbody"));

// Get all headers in thead
List<WebElement> allHeaders = thead.findElements(By.tagName("th"));

// Get all rows in tbody
List<WebElement> allRows = tbody.findElements(By.tagName("tr"));

// Get all cells for each row in allRows
for(WebElement row : allRows) {
    List<WebElement> allCells = row.findElements(By.tagName("td"));
    int rowNum = allRows.indexOf(row) + 1;
    System.out.println("Row no. " + rowNum + " has " + allCells.size() +" cells.");
}