Reputation: 3272
Is it possible to get the text only from a parent element and not its children in Selenium?
Example: Suppose I have the following code:
<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>
In C# (or whatever language), I will have:
string linktext = driver.FindElement(By.CssSelector(".linksSection > a#google")).Text;
Assert.AreEqual(linkText, "Google Link", "Google Link fails text test.");
However, the linktext will have "Google LinkThis link will take you to Google's home page."
Without doing a bunch of string manipulation (such as getting the text of all the children and subtracting that from resultant text of the parent), is there a way to get just the text from a parent element?
Upvotes: 19
Views: 20588
Reputation: 13
there is three ways to do the job.
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;
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();
Upvotes: 0
Reputation: 473763
This is a common problem in selenium
since you cannot directly access text nodes - in other words, your XPath expressions and CSS selectors have to point to an actual element.
Here is the list of possible solutions for your problem:
Google Link
in your case.Google Link
just to make an assertion, it could be that you would be okay with checking if the parent's text starts with Google Link
. See StringAssert.StartsWith()
.get the outerHTML
of the parent's text and feed to an HTML Parser, like Html Agility Pack
. Something along these lines:
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());
Upvotes: 16