我有一个像这样的HTML:
<a href="/something">
Title
<span>Author</span>
</a>
我有一个与此HTML匹配的WebElement。我怎样才能从中提取“标题”?方法.getText()返回“Title \ nAuthor”...
答案 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()"));