如何从父元素获取文本并从子元素中排除文本 (C# Selenium)



是否可以仅从父元素获取文本,而不是从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());
    

三种方法可以完成这项工作。

  1. 将子节点中不需要的文本替换为",逻辑就像其他答案一样。
  2. 使用 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;
  1. 使用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();

最新更新