Это второй наиболее часто задаваемый вопрос в XPath (первое - это имена без префиксов и пространство имен по умолчанию .
В вашем коде:
options = selenium.GetSelectOptions("//select["+i+"]");
Вычисляется выражение типа:
//select[position() =$someIndex]
который является синонимом для:
//select[$someIndex]
когда известно, что $someIndex
имеет целочисленное значение.
Однако по определению псевдооператора //
XPath,
//select[$k]
, когда $k
является целым числом, означает:
" Выбрать все select
элементы в документе, которые являются $k
-ым select
дочерним элементом их родителя ."
Когда i == 1
это работает, но когда i > 1
, метод возвращает null
("ОШИБКА:
Элемент // select [2] not found "). Работает только при i == 1.
Это просто означает, что в документе XML нет элемента, который имеет более одного select
дочернего элемента.
Это правило, которое нужно помнить : оператор []
XPath имеет более высокий приоритет (приоритет), чем псевдо-оператор //
.
Решение : Как всегда, когда нам нужно переопределить приоритет операторов по умолчанию, мы должны использовать скобки.
Изменение
options = selenium.GetSelectOptions("//select["+i+"]");
до
options = selenium.GetSelectOptions("(//select)["+i+"]");