从节点获取文本

时间:2011-12-14 13:34:53

标签: selenium webdriver

我有一个像这样的HTML:

<a href="/something">
     Title
    <span>Author</span>
</a>

我有一个与此HTML匹配的WebElement。我怎样才能从中提取“标题”?方法.getText()返回“Title \ nAuthor”...

5 个答案:

答案 0 :(得分:7)

您无法在WebDriver API中执行此操作,您必须在代码中执行此操作。例如:

var textOfA = theAElement.getText();
var textOfSpan = theSpanElement.getText();
var text = textOfA.substr(0, textOfA.length - textOfSpan.length).trim('\n');

请注意,尾部换行实际上是<a>元素文本的一部分,因此如果您不想要它,则需要将其删除。

答案 1 :(得分:0)

验证元素是否存在“// a [normalize-space(text())= Title]”。如果'a'标签内的文字是'Title',它将返回true。

答案 2 :(得分:0)

这是用python开发的方法。

def get_text_exclude_children(element):
    return driver.execute_script(
        """
        var parent = arguments[0];
        var child = parent.firstChild;
        var textValue = "";
        while(child) {
            if (child.nodeType === Node.TEXT_NODE)
                textValue += child.textContent;
                child = child.nextSibling;
        }
        return textValue;""",
        element).strip()

如何使用:

liElement = driver.find_element_by_xpath("//a[@href='your_href_goes_here']")
liOnlyText = get_text_exclude_children(liElement)
print(liOnlyText)

请使用可能的策略获取元素,该方法需要一个元素,您需要从中获取文本(无子文本)。

答案 3 :(得分:0)

如果使用Python:

[x['textContent'].strip() for x in element.get_property('childNodes') if isinstance(x, dict)]

element是您的元素。

这将返回['Title', ''](因为span之后有空格)。

答案 4 :(得分:0)

您可以使用 jsexecutor 迭代子节点,捕获 textNode 'Title',然后返回其内容,如下所示

WebElement link = driver.findElement(By.xpath("//a[@href='something']"));
JavascriptExecutor js = ((JavascriptExecutor)driver);
String authorText = (String) js.executeScript("for(var i = 0; i < arguments[0].childNodes.length; i++) { 
 if(arguments[0].childNodes[i].nodeName == \"#text\") { return arguments[0].childNodes[i].textContent; } }", link);

上面的 javascript 代码块迭代 textNode ('Title') 和 SPAN ('Author'),但只返回 textNode 的文本内容。

注意:在此之前,我曾尝试在 xpath 中包含文本节点,如下所示,但 webdriver 抛出 invalidselector 异常,因为它需要元素而不是文本节点

WebElement link = driver.findElement(By.xpath("//a[@href='something']/text()"));