selenium - 按标题选择列

时间:2016-02-29 08:47:33

标签: selenium indexing html-table

在我的脚本(selenium& Java)中,我需要通过它的标题选择一个表列。 基本上,我将标头作为参数发送,然后只需获取该列。

但是,问题是我无法获得标题列的索引。 有什么想法或建议吗?

 <table class="table table-hover tablesorter ib-table" data-reactid=".0.0.0.1.2.0">
<thead data-reactid=".0.0.0.1.2.0.0">
<tr data-reactid=".0.0.0.1.2.0.0.0">
<th data-reactid=".0.0.0.1.2.0.0.0.0">ID</th>
<th data-reactid=".0.0.0.1.2.0.0.0.1">To</th>
<th data-reactid=".0.0.0.1.2.0.0.0.2">From</th>
<th data-reactid=".0.0.0.1.2.0.0.0.3">Text</th>
</tr>
</thead>
<tbody data-reactid=".0.0.0.1.2.0.1" style="height: auto;">
<tr data-reactid=".0.0.0.1.2.0.1.$0">
<td data-reactid=".0.0.0.1.2.0.1.$0.0">123456</td>
<td data-reactid=".0.0.0.1.2.0.1.$0.1">+0156477889785</td>
<td data-reactid=".0.0.0.1.2.0.1.$0.2">+0156477889784</td>
<td data-reactid=".0.0.0.1.2.0.1.$0.3">sample textM</td>
</tr>
<tr data-reactid=".0.0.0.1.2.0.1.$1">
<tr data-reactid=".0.0.0.1.2.0.1.$2">

2 个答案:

答案 0 :(得分:0)

首先,您需要通过

执行包含所有标题的List
List<WebElement> headersList = driver.findElement(By.xpath("//table[@class='table-hover tablesorter ib-table']")).findElements(By.tagName("th"));

之后你将把所有tr放在循环中

List<WebElement> trList = driver.findElement(By.xpath("//table[@class='table-hover tablesorter ib-table']")).findElements(By.tagName("tr"));

List<WebElement> tdList;

for(int = i ; i < trList.Count ; i++)
{
tdList = trList[i].findElements(By.tagName("td"));

//tdList[0] its header in index[0]... and so on...
}

答案 1 :(得分:0)

这在奇怪的情况下不起作用,例如使用colspan时。它适用于任何&#34;正常&#34;数据表。修剪用于避免出现在许多WebElements周围出现的不可避免的空白。

public static List<WebElement> getColumnByHeaderText(WebDriver driver, By by, String header) {
    WebElement table = driver.findElement(by);
    Function<WebElement, String> elementToString = (WebElement w) -> w.getText().trim();
    List<WebElement> list = table.findElements(By.tagName("th"));
    int index = Lists.transform(list, elementToString).indexOf(header);
    if (index == -1) {
        throw new RuntimeException("Unable to locate header");
    } else {
        return table.findElements(By.cssSelector("td:nth-child(" + (index + 1 ) + ")"));
    }
}