用于返回列索引的XPath

时间:2011-12-09 16:48:24

标签: xml xpath selenium

我有以下html:

<html>
  <head>
    <body>
      <table>
       <tr>
      <td>Something Else</td>
      <td>Something</td>
    </tr>
    <tr></tr>
  </table>
</body>

第一行第二列的xpath表达式为:

/html/body/table/tbody/tr/td[2]

我想使用selenium来获取值'2'。

换句话说,第一次出现文本“Something”的值是多少。我能够让selenium识别该元素但不返回值。

编辑:到目前为止一些很棒的答案。但让我澄清一下,这更像是一个硒问题,而不是一个xpath问题。我需要弄清楚如何让selenium返回这个值。

5 个答案:

答案 0 :(得分:5)

以下表达式返回包含所需文本的第一个单元格的位置(列索引):

count(/html/body/table/tr/td[.='Something'][1]/preceding-sibling::td) + 1

答案 1 :(得分:2)

您可以使用selenium.getXpathCount('/html/body/table/tbody/tr/td')获取列索引,然后使用selenium.getText('xpath=(/html/body/table/tbody/tr/td)[' + i + ']')迭代该范围,直到它返回“Something”。记住从1到n计数,而不是0到n-1 - XPath从1开始计数,而不是像许多编程语言一样从0开始。

答案 2 :(得分:0)

使用:

/html/body/table/tr/td[text() = 'Something']

对于XML:

<html>
    <body>
      <table>
       <tr>
      <td>Something Else</td>
      <td>Something</td>
    </tr>
    <tr></tr>
  </table>
</body>
</html>

它选择第二个td元素。

答案 3 :(得分:0)

我认为你要做的是动态获取索引的值。如果我正确理解你的问题。如果是这种情况,为什么不简单地将对象存储在列表中并获取所需元素的文本。这样可以对数据进行更加可扩展的解析,并使您的测试不那么脆弱。

WebElement thisElement = driver.findElement(By.xPath("//table/tr/"));
List<WebElement> columns = thisElement.findElement(By.tagName("td"));

foreach(WebElement col in columns)
{
  col.Text();
}

答案 4 :(得分:-1)

希望下面的代码对你有帮助

public static int getColumnIndex(WebDriver driver,String columnName)
{

int columns=driver.findElements(By.xpath("//body/table/tr/td")).size();

int indexOfQuanity = 0;

for(int i=1;i<=columns;i++)
{           

if(driver.findElement(By.xpath("//body/table/tr/td["+i+"]/b")).getText().equalsIgnoreCase(columnName))
{

indexOfQuanity=i;

break;

}

}

return indexOfQuanity;

}