Selenium Locators
Selenium Locators
By ID
Locate elements using the 'id' attribute of the HTML element. This is usually unique and preferred.
By Name
Locate elements using the 'name' attribute. Not always unique, but useful for forms.
By Link-Text
Locate anchor tags (`<a>`) using the exact link text. Use when you know the full link text.
. By Partial Link
Text
Locate anchor tags using a partial match of the link text. Good for dynamic text.
By Tag Name
. By Class Name
Locate elements using the class attribute. Use when elements share common styles.
By CSS Selector
Locate elements using CSS selectors (e.g., `.class Name`, `#id`). Preferred for performance.
Locators in Selenium
Locators are used in selenium WebDriver to find an element on a DOM. Locating elements in Selenium
WebDriver is performed with the help of findElement() and findElements() methods provided by
WebDriver and WebElement class.
findElement() returns a WebElement object based on a specified search criteria or ends up
throwing an exception if it does not find any element matching the search criteria.
findElements() returns a list of WebElements matching the search criteria. If no elements are
found, it returns an empty list.
Example
<form name="loginForm">Login
Using id –
Each id is supposed to be unique couldn’t be duplicated. Which makes ids a very faster and reliable
way to locate elements. With id attribute value matching the location will be returned. If no element has a
matching idattribute, a “NoSuchElementException” will be raised.
WebElement elementUsername = driver.findElement(By.id("username"));
All objects on a page are not having id attribute, it’s not realistic. In some cases developers
make it havingnon-unique ids on a page or auto-generate the ids, in both cases it should be avoided.
Using Name –
By using name attribute we can find element on DOM, name attributes are not unique in a
page all time. With the Name attribute value matching the location will be returned. If no element has a
WebElement elementUsername = driver.findElement(By.name("username"));
Using Link –
With this you can find elements of “a” tags(Link) with the link names. Use this when you
know link text used within an anchor tag.
Using xPath –
While DOM is the recognized standard for navigation through an HTML element tree, XPath
is the standard navigation tool for XML and an HTML document is also an XML document (xHTML). XPath
is used everywhere where there is XML. Xpath has a fixed structure (syntax). See below –
Xpath = //**@id=’username’+
Xpath = //input*@id=’username’+
Xpath = //form*@name=’loginForm’+/input*1+
Xpath = //**@name=’loginForm’+/input*1+
Xpath Axes –
XPath Axes are the methods used to find dynamic elements. XPath axes search different nodes in
XML document from current context node. XPath expression select nodes or list of nodes on the basis of
attributes likeID , Name, Classname, etc. from the XML document .
Following:
Selects all elements in the document of the current node( ) in following image, input box
is thecurrent node.
These are
3Nodes Shown
in red box XPath
using
Following
There are 3 "input" nodes matching by using "following" axis- password, login and reset button.
Ifyou want to focus on any particular element then you can use the below XPath method:
The ancestor axis selects all ancestors element (parent, grandparent,…etc.) of the current
node as shown in the below screen. In the below expression, we are finding ancestors element of
the current node("ENTERPRISE TESTING" node).
There are 13 "div" nodes matching by using "ancestor" axis. If you want to focus on any particular element
then you can use the below XPath, where you change the number 1, 2,3,…13 as per your requirement:
Child:
Selects all children elements of the current node (Java) as shown in the below screen.
Xpath = //*[@id=‟java_technologies‟]/child::li
There are 71 "li" nodes matching by using "child" axis. If you want to focus on any particular
element then You can change the xpath according to the requirement by putting [1],[2] and so on.
Xpath = //*[@id=‟java_technologies‟]/child::li[1]
Prece
Select all nodes that come before the current node as shown in the below screen. In the below
expression,
itidentifies all the input elements come before "LOGIN" button that is Userid and password input element.
Select the following siblings of the context node. Siblings are at the same level of the current node as
shownin the below screen. It will find the element after the current Login node . One input nodes
matching by using "following-sibling" axis
Xpath = //*[@id=‟rt-feature‟]//parent::div
Parent: Selects the parent of the current node as shown in the below screen.
There are 65 "div" nodes matching by using "parent" axis. If you want to focus on any particular
element thenYou can change the XPath according to the requirement by putting [1],[2]and so on.
Xpath = //*[@id =‟rt-feature‟]//parent::div[1]
Self:
Selects the current node or 'self' means it indicates the node itself as shown in the below screen.
One node matching by using "self " axis. It always finds only one node as it represents self-element.
Descendant:
Selects the descendants of the current node as shown in the below screen. In the below expression, it
identifies all the element descendants to current element ( 'Main body surround' frame element) which
means down under the node (child node , grandchild node, etc.).
There are 12 "link" nodes matching by using "descendant" axis. If you want to focus on any particular
elementthen You can change the XPath according to the requirement by putting [1],[2]. and so on.
There is a debate on the performance of CSS Locator and XPath locator. Most of the automation testers
believe that using CSS selectors makes the execution of script faster compared to XPath locator. CSS
Selector locator isalways the best way to locate elements on the page. CSS is always same irrespective of
browsers.
In dynamic elements, there is always a part of locator which is fixed. We need to generate the locator
using this fixed part
<div>
<label class=”hidden-label” for=”Email”> Enter your email</label>
<input id=”Email” type=”email” autofocus=”” placeholder=”Enter your email” name=”Email”
spellcheck=”false” value=””> <input id=”Passwd-hidden” class=”hidden” type=”password”
spellcheck=”false”>
</div>
Css = input#Email
If multiple elements have the same HTML tag and class, then the first one will be recognized.
Syntax: css=tag.class
<td>
<input id=”email“ class=”inputtext“ type=”email“ tabindex=”1“ value=”” name=”email“>
</td>
css=input.inputtext
If multiple elements have the same HTML tag and attribute, then the first one will be recognized. It acts in the
same way of locating elements using CSS selectors with the same tag and class.
Syntax: css=tag[attribute=value]
<div>
<label class=”hidden-label“ for=”Email“> Enter your email</label>
<input id=”Email“ type=”email“ autofocus=”” placeholder=”Enter your email“ name=”Email“
spellcheck=”false“ value=””> <input id=”Passwd-hidden“ class=”hidden“ type=”password“
spellcheck=”false“>
</div>
css = input[name=Email]
Syntax: css=tag.class[attribute=value]
<td>
<input id="email" class="inputtext" type="email" tabindex="1" value="" name="email">
</td>
css=input.inputtext[name=email]
SUB-STRING MATCHES:
CSS in Selenium has an interesting feature of allowing partial string matches using ^, $, and *.
Suppose
<input="Employee_ID_001">
Starts with (^): To select the element, we would use ^ which means ‘starts with’
css=input[id^='Em']
Ends with ($): To select the element, we would use $ which means ‘ends with’.
css=input*id^=’001’+
Contains (*): To select the element, we would use * which means ‘sub-string’
css=input[id*='id']
Css = "input:contains('id')"
Explanation: „div#buttonDiv>button‟ will first go to div element with id „buttonDiv‟ and then select its child
element – „button‟
Explanation: „div#buttonDiv button‟ will first go to div element with id „buttonDiv‟ and then select „button‟
element inside it (which may be its child or sub child)
<li>Selenium</li>
<li>QTP</li>
<li>Sikuli</li>
</ul>
css="ul#automation li:nth-of-type(2)"
Similarly, To select the last child element, i.e. ‘Sikuli’, we can use
css="ul#automation li:last-child"