Finding xpath of a link using link text?
Some of the answers that were already given work, others don't. And I think the OP would benefit from more explanations.
Your original expression:
//a[text()='Add New Button']
Does not work because the text node that contains "Add New Button" also has a newline character at the end.
The next one:
//a[contains(text(),'Add New Button']
Does not work (leaving aside the missing parenthesis) because text()
returns a sequence of nodes and a function like contains()
will only evaluate the first node in the sequence. In this case, the first text node inside a
only contains whitespace and is not the one that contains "Add New Button".
You can validate this claim with:
//a[contains(text()[2],'Add New Button')]
which will test whether the second text node of a
contains "Add New Button" - and this expression will return the a
element. But the best solution in this case is:
//a[contains(.,'Add New Button')]
.
will evaluate to the so-called "string value" of an element, a concatenation of all its text nodes which will include "Add New Button".
A solution with normalize-space()
is also possible, but has nested predicates:
//a[text()[normalize-space(.) = "Add New Button"]]
Link text contains unnecessary spaces from the right side of main text, so you need following to get rid of them:
'//a[normalize-space(.)="Add New Button"]'
with xpath you can check if the element contains a text with below statement
//a[contains(., 'Button')]
Use following xpath
//*[contains(text(),'Add New Button')]
or
//a/i[contains(text(),'Add New Button')]
or
//a[@href='SOME URL']/i
or Using cssSelector
-
a[href='SOME URL']>i