我有一个包含以下代码的HTML页面:
<table class="report" style="width:100%">
<tbody>
<tr>
<th/>
<th>Position Open
<br>
<span class="timestamp">27/7/2016 16:12:12</span>
</br>
</th>
<th>Position closed
<br>
<span class="timestamp">27/7/2016 16:12:42</span>
</br>
</th>
</tr>
<tr>
<td>
<span dir="ltr">EURJPY</span>
</td>
<td>116.098</td>
<td>116.156</td>
</tr>
</tbody>
</table>
在这个页面上,我有另一个具有相同类属性“report”的表,但只有这个表包含文本“Position Open”和“Position Closed”。 我需要选择包含“EURJPY”,“116.098”和“116.156”数据的元素。 这些元素内容正在发生变化,而不是“EURJPY”可能会出现“EURUSD”或“GBPCAD”等。 我尝试了以下代码:
driver.findElement(By.xpath("//span[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span")).getAttribute("textContent");
获取第一个必填字段文本,但出现Invalid selector
错误。
答案 0 :(得分:3)
你的XPath很接近,但有几个问题。
//span[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span
您正在搜索包含文字&#39; Position Open&#39;的SPAN
。实际上它是一个包含文本的TH
。
//th[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span
(//tr)
应更正为//tr
//th[text()='Position Open']/ancestor::table[@class='report']//tr[2]/td/span
您想要的是TD
中包含的文字,而不是SPAN
。如果您从TD
中提取文本,则可以从所有三个元素中获取所需的文本。如果你拉SPAN
,那么你还需要拉出最后两个TD
。这种方式更简单。
...最后,TH
不仅包含您要查找的文字。使用.contains()
获得匹配。
//th[text()='Position Open']/ancestor::table[@class='report']//tr[2]/td
所以我们把XPath放到Java代码中,我们得到以下内容。
List<WebElement> tds = driver.findElements(By.xpath("//th[contains(text(),'Position Open')]/ancestor::table[@class='report']//tr[2]/td"));
for (WebElement td : tds)
{
System.out.println(td.getText());
}
答案 1 :(得分:3)
有时会出现与文本匹配的问题,请改用use contains,尝试使用此选择器
//th[contains(.,'Position')]/ancestor::table[@class='report']//tr[2]/td/span
答案 2 :(得分:2)
您可以使用此xpath
找到您感兴趣的3个<td>
代码
//th[contains(text(),'Position Open')]/ancestor::table//tr[2]/td
使用它将为您提供三个元素的列表,您可以从中提取文本
List<WebElement> tds = driver.findElement(By.xpath"//th[contains(text(),'Position Open')]/ancestor::table//tr[2]/td");
String currency = tds.get(1).getText(); // this will be EURJPY
tds.get(2).getText(); // 116.098
tds.get(3).getText(); // 116.156