我有以下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返回这个值。
答案 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;
}