67

I used this Xpath expression "//span[@class='Big']" and got all elements in that page that are under <span> tag and class='Big'.

My question is what if I want just the first occurrence on the page, not all occurrences, what would be the correct Xpath expression?

Thanks, Narin

laxonline
  • 2,657
  • 1
  • 20
  • 37
Narin
  • 773
  • 1
  • 5
  • 5

2 Answers2

158

The correct answer (note the brackets):

(//span[@class='Big'])[1]

The following expression is wrong in the general case:

//span[@class='Big'][1]

because it selects every span element in the document, that satisfies the condition in the first predicate, and that is the first such child of its parent -- there can be many such elements in an XML document and all of them will be selected.

For more detailed explanation see: https://stackoverflow.com/a/5818966/36305

Community
  • 1
  • 1
Dimitre Novatchev
  • 240,661
  • 26
  • 293
  • 431
  • This method is not working for Appium. //android.view.View[contains(@text,'Sapiens A Brief History of Humankind Paperback English')] matches with 2 elements, but (//android.view.View[contains(@text,'Sapiens A Brief History of Humankind Paperback English')])[0] does locate any element.. – anandhu Feb 05 '21 at 05:01
  • 1
    Actualy i made a mistake, it works, My index value was wrong (index starts from 1 and not 0) – anandhu Feb 05 '21 at 15:51
  • Thanks, I actually needed the second method for my situation. I appreciate you pointing out the difference! – NekoKikoushi May 18 '21 at 18:04
6

Dimitre Novatchev's answer is correct if you are expecting the class attribute to be equal to Big (without any other classes attached to the element):

(//span[@class="Big"])[1]

... which is similar to the following JavaScript expression:

document.querySelectorAll('span[class="Big"]')[0]

On the other hand, if you are expecting Big to be one of any number of classes in the class attribute (rather than the only class), you can use the following expression:

(//span[contains(concat(" ", normalize-space(@class), " "), " Big ")])[1]

... which is similar to the following JavaScript expression:

document.querySelectorAll('span.Big')[0]
Grant Miller
  • 27,532
  • 16
  • 147
  • 165