Selenium WebDriver - 用于选择范围和排除子节点的Xpath

时间:2015-07-03 19:24:44

标签: selenium xpath selenium-webdriver webdriver

今天我问过this个问题,但是我没有指出它的范围,这是在Selenium Webdriver中使用的。

所以我有这个td:

<td>
<span id="PartComment">
REMAN WATER PUMP
<i>w/2.05" DIAMETER THERMOSTAT OUTLET - SUPPLIED w/PULLEY
</i>
</span>
</td>

我想要一个xpath只能找到文本REMAN WATER PUMP,以便稍后将其转换为字符串。

 driver.findElement(By.xpath("//span[@id='lblPartComment']/text()"));

但问题是,由于我只查找文本而不是DOM对象,因此WebDriver无法将其视为:

Exception in thread "main" org.openqa.selenium.InvalidSelectorException: The given selector //span[@id='lblPartComment']/text() is either invalid or does not result in a WebElement. The following error occurred: InvalidSelectorError: The result of the xpath expression "//span[@id='lblPartComment']/text()" is: [object Text]. It should be an element.

请您提供该xpath的替代方案吗?一个找到我上面提到的文本,并排除i中的文本?

另外,related

由于

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码:

var firstText = this.Driver.FindElement(By.XPath("//span[@id='lblPartComment']")).Text;
var firstChildText = this.Driver.FindElement(By.XPath("//span[@id='lblPartComment']/i")).Text;
firstText = firstText.Replace(firstChildText, string.Empty);

找到父元素和子元素,获取文本并用空字符串替换子文本。 :)

答案 1 :(得分:0)

你可以这样做。从this

引用
    JavascriptExecutor js = (JavascriptExecutor) driver;
    String text = (String) js.executeScript("var parent = arguments[0];"
            + "var child = parent.firstChild;"
            + "var ret = \"\";"
            + "while(child) {"
            + "    if (child.nodeType === Node.TEXT_NODE)"
            + "        ret += child.textContent;"
            + "    child = child.nextSibling;"
            + "}"
            + "return ret;", driver.findElement(By.id("PartComment")));