Найти ТЕКУЩИЙ выбранный <option> с XPath

Каков правильный синтаксис XPath для проверки того, выбран ли элемент option в настоящее время, или просто для того, чтобы получить выбранный элемент option из элемента select на открытой странице, с которой пользователь и JavaScript, возможно, взаимодействовали? Возможно ли это с помощью XPath, или у него нет возможности просматривать свойства DOM?

Я не могу найти документацию по этому поводу и попробовал (спекулятивно):

  • //option[@selected=true]
  • //option[@selected="selected"]
  • //option[@selected]

но ни одна из этих работ не работает; они просто не соответствуют никаким элементам.

(В случае, если это имеет значение, я пробовал это как с помощью функции $x в консоли разработчика Chrome, так и с помощью метода find_elements_by_xpath в Selenium for Python.)

Ответ 1

Короткий ответ: это невозможно.

Более длинный ответ: XPath может просматривать атрибуты HTML, но он не может смотреть на свойства DOM. Выбор элемента <option> в <select> изменяет свойство selected от <option> до true, а также изменяет свойство value его родительского элемента <select>, но это не влияет на атрибуты обоих, поэтому он невидим для XPath.

Чтобы найти элементы <option>, у которых есть атрибут selected, который часто определяется тем, как автор страницы может определить, какой вариант изначально выбран, вы можете использовать //option[@selected]. Но это не находит выбранный <option>; изменения, которые пользователь делает для выбора, невидимы для XPath. Там нет гарантии, что он даже найдет первоначально выбранную опцию, так как возможно, что автор страницы не поместил атрибут selected на какие-либо элементы и также разрешил браузеру выбрать первый вариант по умолчанию или если бы какой-то JavaScript выбрал начальную опцию через свойство selected.

Несколько других ответов здесь утверждая, что селектор типа //option[@selected] может обнаруживать изменения выбора, сделанные пользователем после загрузки страницы, просто совершенно неправильно.

Конечно, если вы можете использовать селекторы CSS вместо селекторов XPath, то option:checked выполнит эту работу.

Ответ 2

Проблема может заключаться в " (двойные кавычки).

//select/option[@selected='selected'] - Будет соответствовать выбранному параметру, я использую это успешно.

//select/option[@selected='selected' and @value='specific value'] - будет соответствовать только выбранному параметру, если он имеет "конкретное значение", я также использую это.

Если у вас все еще есть проблемы, это может быть совершенно другая проблема, возможно, нет опции node. Надеюсь, это поможет.

Ответ 3

Я думаю, мы можем использовать знания из ответа @Mark и учетной записи. Позвольте просто найти node, который имеет желаемый атрибут:

tree.xpath('//select/option[@selected]/text()')[0].strip()

Ответ 4

Я бы попробовал //option[@selected='true']

то есть. driver.findElements(By.xpath("//option[@selected='true']")).getText();