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