27

consider both types:

<select name="garden">
    <option>Flowers</option>
    <option selected="selected">Shrubs</option>
    <option>Trees</option>
    <option selected="selected">Bushes</option>
    <option>Grass</option>
    <option>Dirt</option>
</select>

Is @val for actually indicating the value="" attribute ?

Is @value for indicating the innerText value ?

for example what happens if <option> doesn't contain any value="" property. how would you select it then ?

select/option[@value = "Grass"] 

Does Xpath automatically ignore white spaces for the case above? Should it be trimmed?

EDIT:

for selecting multiple options would this suffice ?

select/option[normalize-space(text())="Grass" or normalize-space(text())="Trees"]
budi
  • 6,351
  • 10
  • 55
  • 80
h34y
  • 489
  • 1
  • 6
  • 11

2 Answers2

35

To select by text value you can use text() function. And normalize spaces is required, because they are not removed by default. Here is an example:

select/option[normalize-space(text())="Grass"]

@value - value of "value" attribute

@val - value of "val" attribute

normalize-space() - function returns the argument string with whitespace normalized by stripping leading and trailing whitespace and replacing sequences of whitespace characters by a single space

Ivan Nevostruev
  • 28,143
  • 8
  • 66
  • 82
12

Well, if whitespace isn't an issue:

/select/option[.='Grass']

I'd need to check re whitespace, though. You could always normalize:

/select/option[normalize-space(.)='Grass']
Marc Gravell
  • 1,026,079
  • 266
  • 2,566
  • 2,900