当表格呈指数下降时,如何仅迭代每行的最后一列数据

时间:2017-01-31 10:39:41

标签: java selenium selenium-webdriver

我有一个带有tr和td的HTML表。根据给定的日期选择更改值。我需要迭代每一行,最后一列数据并添加它们。每行的值减1。 请帮帮我,如何只获取每一行的最后一列数据。图像附在下方并突出显示。

ClickHere

HTML code
<div class="row">
<div id="installCohort" class="col-md-12">
<div class="cornelius-container">
<table class="cornelius-table">
<tr>
<th class="cornelius-time">Time</th>
<th class="cornelius-people">Installs</th>
<th class="cornelius-people">1</th>
<th class="cornelius-people">2</th>
<th class="cornelius-people">3</th>
<th class="cornelius-people">4</th>
<th class="cornelius-people">5</th>
</tr>
<tr>
<td class="cornelius-label">October 2016</td>
<td class="cornelius-people">3</td>
<td class="cornelius-absolute cornelius-extra-hot" title="3">3</td>
<td class="cornelius-absolute cornelius-medium-high" title="1">1</td>
<td class="cornelius-absolute cornelius-low">0</td>
<td class="cornelius-absolute cornelius-low">0</td>
**<td class="cornelius-absolute cornelius-low">0</td>**
</tr>
<tr>
<td class="cornelius-label">November 2016</td>
<td class="cornelius-people">16056</td>
<td class="cornelius-absolute cornelius-hot" title="10790">10790</td>
<td class="cornelius-absolute cornelius-high" title="7861">7861</td>
<td class="cornelius-absolute cornelius-high" title="7186">7186</td>
**<td class="cornelius-absolute cornelius-high" title="7186">7186</td>**
<td class="cornelius-empty">-</td>
</tr>
<tr>
<td class="cornelius-label">December 2016</td>
<td class="cornelius-people">85254</td>
<td class="cornelius-absolute cornelius-high" title="38098">38098</td>
<td class="cornelius-absolute cornelius-medium-high" title="33857">33857</td>
**<td class="cornelius-absolute cornelius-medium-high" title="33790">33790</td>**
<td class="cornelius-empty">-</td>
<td class="cornelius-empty">-</td>
</tr>
<tr>
<td class="cornelius-label">January 2017</td>
<td class="cornelius-people">24814</td>
<td class="cornelius-absolute cornelius-high" title="14883">14883</td>
**<td class="cornelius-absolute cornelius-high" title="14839">14839</td>**
<td class="cornelius-empty">-</td>
<td class="cornelius-empty">-</td>
<td class="cornelius-empty">-</td>
</tr>
<tr>
<td class="cornelius-label">February 2017</td>
<td class="cornelius-people">227</td>
**<td class="cornelius-absolute cornelius-extra-hot" title="226">226</td>**
<td class="cornelius-empty">-</td>
<td class="cornelius-empty">-</td>
<td class="cornelius-empty">-</td>
<td class="cornelius-empty">-</td>
</tr>
<tr>
<td class="cornelius-label">March 2017</td>
**<td class="cornelius-people">0</td>**
<td class="cornelius-empty">-</td>
<td class="cornelius-empty">-</td>
<td class="cornelius-empty">-</td>
<td class="cornelius-empty">-</td>
<td class="cornelius-empty">-</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

如果您看到上面的图像,则值会逐渐减少,甚至元素标签也会变为cornelius-low,cornelius-high,cornelius-medium等等。

我尝试使用下面的代码来保持循环。由于元素标签正在变化,无法仅获取0,7186,33790,14839,226

2 个答案:

答案 0 :(得分:1)

尝试使用以下代码获取每个td的最后tr

List<WebElement> rows = driver.findelements(By.xpath('//table[@class="cornelius-table"]//tr[not(th)]'));
Iterator<WebElement> iter = rows.iterator();
while(iter.hasNext()) {
    WebElement tr = iter.next();
    td = tr.findelement(By.xpath('./td[not(@class="cornelius-empty")][last()]'));
    System.out.println(td.getText());
    }
}

答案 1 :(得分:0)

@Andersson 代码应该适合您。如果没有,那么根据他的建议,在页面加载时可能会弹出tbody。所以,你可以将他的代码替换为下面的代码(我还添加了WebElement缺少的td接口引用:

List<WebElement> rows = driver.findElements(By.xpath("//table[@class='cornelius-table']//tr"));
Iterator<WebElement> iter = rows.iterator();
while(iter.hasNext()) {
    WebElement tr = iter.next();
    WebElement td = tr.findElement(By.xpath("./td[not(@class='cornelius-empty') and last()]"));
    System.out.println(td.getText());
    }
}

如果以上仍然不起作用,您可以尝试下面的一个,这是使用xpath的更优化的版本:

List<WebElement> tabledata = driver.findElements(By.xpath("//table[@class='cornelius-table']//tr/td[not(@class='cornelius-empty') and last()]"));
for(WebElement td: tabledata)
 System.out.println(td.getText());

上面的代码会在tdclass的每一行表中找到所有最后cornelius-table个元素,并将其放在列表tabledata中。然后使用for-each循环,遍历列表tabledata,获取并打印innerText。

编辑我已根据OP提供的HTML代码段修改了上述代码段。