XPath Best Practices: Dot vs. text() in Selenium Tests

What are the best practices for using XPath to locate text elements in Selenium tests? My question is about specifics of using dot and text() in XPath. For example, following find_element lines returns same element:


driver.find_element_by_xpath('//a[text()="General Disscussion"]')
driver.find_element_by_xpath('//a[.="General Disscussion"]')

So what is the difference? What are the benefits and drawbacks of using . and text()?

Drawing from my experience in XPath usage within Selenium tests, let’s delve deeper into the nuances between using dot (.) and text(). While they may seem similar on the surface, their behavior can reveal subtle discrepancies depending on the structure of your HTML document.

Consider this: when your HTML is straightforward, with a single text node within an element, both //.text() and //[.=".text()"] return the same result. However, introduce another element within that parent, and their behaviors start to diverge. The former still fetches the parent element, while the latter may come up empty-handed if the element structure isn’t what you expect.

1 Like

Speaking from a practical standpoint, let’s discuss the best practices revolving around dot (.) and text() in XPath.

Dot (.) shines when you’re aiming for brevity, especially when the context is crystal clear, and there’s no room for confusion. Conversely, text() steps in when you want to be explicit about nabbing the text content of an element, which proves handy in intricate text-based queries or ambiguous contexts.

When you’re weighing your options, remember readability and maintainability are your allies. Opt for the approach that makes your XPath expressions a breeze to comprehend, both for yourself and your fellow developers.

Based on my experience and a dash of practical examples, let’s unravel the nuances further between dot (.) and text() in XPath.

Imagine an input document akin to Example 3, where our element harbors not one, but two distinct text nodes. Here, text() graciously hands us individual nodes, while . stitches them together into a cohesive string. To put this to the test, fire up //a[.=' General Disscussion '] and watch it effortlessly snag the desired element.

Also, bear in mind some XPath functions are picky eaters, only accepting a single string as input. So, if you toss them a sequence of nodes, they’ll turn a blind eye to all but the first one, without so much as a whisper.