0 votes
1 view
in Devops and Agile by (16.4k points)

I try to write XPath expressions so that my tests won't be broken by small design changes. So instead of the expressions that Selenium IDE generates, I write my own.

Here's an issue:

//input[@name='question'][7]

This expression doesn't work at all. Input nodes named 'question' are spread across the page. They're not siblings.

I've tried using the intermediate expression, but it also fails.

(//input[@name='question'])[2]

error = Error: Element (//input[@name='question'])[2] not found

That's why I suppose Selenium has a wrong implementation of XPath.

According to XPath docs, the position predicate must filter by the position in the nodeset, so it must find the seventh input with the name 'question'. In Selenium this doesn't work. CSS selectors (:nth-of-kind) neither.

I had to write an expression that filters their common parents:

//*[contains(@class, 'question_section')][7]//input[@name='question']

Is this a Selenium specific issue, or I'm reading the specs wrong way? What can I do to make a shorter-expression?

1 Answer

0 votes
by (45.5k points)

Here's an issue:

//input[@name='question'][7]

This expression doesn't work at all.

This is a FAQ.

[] has a higher priority than //

The above expression selects every input element with @name = 'question', which is the 7th child of its parent -- and apparently the parents of input elements in the document that is not shown do not have such a large amount of input children.

Use (note the brackets):

(//input[@name='question'])[7]

This selects the 7th element input in the document that satisfies the conditions in the predicate.

Edit:

People who understand selenium (Dave Hunt) recommend that the above expression is written in selenium as:

xpath=(//input[@name='question'])[7]

...