2017-05-14 41 views
1

我有以下代码:硒铬的webdriver - 轮不到细胞列出

 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”)但没用。

你能提醒一下吗?

谢谢!

回答

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")); 
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

A 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."); 
}