2016-11-17 35 views
0

因此,在Selenium中有一个WebElement,我试图通过包含文本节点的XPath获取它的所有直接子元素。我已经尝试了XPath“*”,它可以工作,但不会给我任何文本节点(如果有的话)。根据XPath的文档,我尝试了很多东西:Selenium:带XPath的InvalidSelectorException child :: node()

  • “child :: node()”给了我InvalidSelectorException。
  • 试图用“*”获取所有节点,然后尝试使用“text()”获取所有文本节点:在“text()”查询中给我InvalidSelectorException。

我在Chrome上使用XPathHelper扩展的方式尝试了这些XPath,它的工作原理与此相似,但它似乎不适用于Selenium(Chrome WebDriver和PhantomJS)。

这是我的循环,我认为应该工作:

for(WebElement child : node.findElements(new By.ByXPath("child::node()"))) { 
    //Do something with child 
} 

哪里可能是问题?

回答

0

这就是我使用的。

public String getHiddenText(WebDriver driver, WebElement aWebElement) { 
    return (String) ((JavascriptExecutor) driver).executeScript("return arguments[0].textContent;", aWebElement); 
} 

寻址crawljax评论,

public String getHiddenText(EmbeddedBrowser browser, WebElement aWebElement) { 
    WebDriver driver = browser.getDriver(); 
    return (String) ((JavascriptExecutor) driver).executeScript("return arguments[0].textContent;", aWebElement); 
} 

我发现,学习新的工具,最好的办法是去其github repository和搜索自动化测试了解如何使用它的例子。只是说。 :-)

+0

@Faterou文本节点可能会很痛苦。 Selenium的getText()方法试图屏蔽你,但它并不适用于所有情况。我的方法被称为getHiddenText,因为Selenium getText()方法在隐藏元素时不返回文本。但它会返回复杂的文本节点文本,无论是否隐藏。一个警告,它会返回非ASCII字符,如果存在,所以我经常添加.replaceAll(“[^ \\ x20 - \\ x7e]”,“”);来电。 – MikeJRamsey56

+0

这可能效果很好,谢谢!唯一的问题是我通过Crawljax使用Selenium,并且我没有直接访问驱动程序;我可以通过具有名为executeJavaScript(String)的函数的接口EmbeddedBrowser进行访问,所以我不能放置任何参数。我知道我没有在问题中指定这个,所以我猜这已经解决了...... – Faterou

+0

另外,textContent返回所有后代的文本值,我只是想要直接的孩子。 – Faterou