Найти ТЕКУЩИЙ выбранный <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();