如何从父元素获取文本并从子元素中排除文本 (C# Selenium)
本文关键字:元素 文本 排除 Selenium 获取 取文本 | 更新日期: 2024-11-07 22:06:20
是否可以仅从父元素获取文本,而不是从Selenium中的子元素获取文本?
例:假设我有以下代码:
<div class="linksSection>
<a href="https://www.google.com/" id="google">Google Link
<span class="helpText">This link will take you to Google's home page.</span>
</a>
...
</div>
在 C#(或任何语言)中,我将拥有:
string linktext = driver.FindElement(By.CssSelector(".linksSection > a#google")).Text;
Assert.AreEqual(linkText, "Google Link", "Google Link fails text test.");
但是,链接文本将具有"Google Link此链接将带您进入Google的主页"。
在不进行一堆字符串操作(例如获取所有子元素的文本并从父元素的结果文本中减去该文本)的情况下,有没有办法仅从父元素获取文本?
这是
selenium
中的一个常见问题,因为您无法直接访问文本节点 - 换句话说,XPath表达式和CSS选择器必须指向实际元素。
以下是针对您的问题的可能解决方案的列表:
- 获取父元素的文本,
- 对于每个子元素,获取文本并将其从父元素的文本中删除。您剩下的是所需的文本 -
Google Link
在您的情况下。 - 如果您想获得
Google Link
只是为了做出断言,那么您可以检查父母的文本是否带有Google Link
。请参阅StringAssert.StartsWith()
。 获取父文本的
outerHTML
,并馈送到 HTML 解析器,如Html Agility Pack
.大致如下:string outerHTML = driver.FindElement(By.CssSelector(".linksSection > a#google")).GetAttribute("outerHTML"); HtmlDocument html = new HtmlDocument(); html.LoadHtml(outerHTML); HtmlAgilityPack.HtmlNode a = html.DocumentNode.SelectNodes("//a[@id='google']"); HtmlNode text = strong.SelectSingleNode("following-sibling::text()"); Console.WriteLine(text.InnerText.Trim());
有
三种方法可以完成这项工作。
- 将子节点中不需要的文本替换为",逻辑就像其他答案一样。
- 使用 js :
private static String OWN_TEXT_JS = "arr=[];content=document.querySelector(arguments[0]);for(i=0,len=content.childNodes.length;i<len;i++){if(content.childNodes[i].nodeType===3){arr.push(content.childNodes[i].nodeValue);}}str=arr.join('"'"); return str;";
Object result = ((JavascriptExecutor) WebDriver).executeScript(OWN_TEXT_JS, path);
if (!(result instanceof String))
return null;
else
return (String) result;
- 使用HTML解析器,在Java中是jsoup。
element= webDriver.findElement...
String result = Jsoup.parse(element.getAttribute("outerHTML")).selectFirst(element.getTagName()).ownText();
WebElement webElement = webDriver.findElement(By.xpath("/html"));
Jsoup.parse(webElement.getAttribute("outerHTML")).selectFirst(csspath).ownText();