问题 使用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中的方法。) 


4013
2018-04-02 16:26


起源



答案:


简短的回答:这是不可能的。

更长的答案:XPath可以查看HTML属性,但它无法查看DOM属性。选择一个 <option> 中的元素 <select> 改变了 selected  属性 的 <option> 至 true,也改变了 value 其母公司的财产 <select> element,但它不影响任何一个的属性,因此它对XPath是不可见的。

找到 <option> 有元素的元素 selected 属性集,通常是页面作者如何确定最初选择哪个选项,您可以使用 //option[@selected]。但是这个 才不是 找出 目前 选 <option>;用户对选择所做的更改对XPath是不可见的。不能保证它甚至会找到 原来 选择的选项,因为页面作者可能没有放入 selected 属性 任何 元素,或者让浏览器默认选择第一个选项,或者让一些JavaScript通过选择初始选项 selected  属性

多重 其他  答案  这里  自称 那个选择器就像 //option[@selected] 可以在页面加载完全错误后检测用户所做的选择更改。

当然,如果你能够使用 CSS 那么选择器而不是XPath选择器 option:checked 会做的。


16
2017-08-01 08:10





问题可能是 " (双引号)。

//select/option[@selected='selected']  - 将匹配所选的选项,我正在成功使用它。

//select/option[@selected='selected' and @value='specific value']  - 如果它具有“特定值”,则仅匹配所选选项,我也使用此选项。

如果你仍然遇到麻烦,那可能是一个完全不同的问题,也许没有选项节点。我希望这有帮助。


2
2017-08-01 11:13



除了这个答案错误的主要方式之外,第二个错误的建议是在我的XPath中使用单引号而不是双引号引用字符串表达式可能会改变其行为。即使在最旧版本的XPath中,这也是错误的。每 原始规格, “在表达式中,文字字符串由单引号或双引号分隔”。 - Mark Amery
这个答案错误的主要方式是什么? - 23inhouse
它根本不起作用。 //select/option[@selected='selected'] 与当前选择的选项不匹配;它将匹配任何具有该选项的选项 selected 属性设置为字符串 "selected"。这甚至不能保证是 原来 选择的选项(因为仅仅 存在 的 selected 属性标记 option 最初选择;它的价值是什么并不重要),更不用说当前选择的那个(从哪个选项开始) 目前 选择完全独立于的存在或价值 selected 属性)。 - Mark Amery
它适用于我,当然该选项必须具有“已选择”属性值“已选中”。给予好评! - JavierFromMadrid


答案:


简短的回答:这是不可能的。

更长的答案:XPath可以查看HTML属性,但它无法查看DOM属性。选择一个 <option> 中的元素 <select> 改变了 selected  属性 的 <option> 至 true,也改变了 value 其母公司的财产 <select> element,但它不影响任何一个的属性,因此它对XPath是不可见的。

找到 <option> 有元素的元素 selected 属性集,通常是页面作者如何确定最初选择哪个选项,您可以使用 //option[@selected]。但是这个 才不是 找出 目前 选 <option>;用户对选择所做的更改对XPath是不可见的。不能保证它甚至会找到 原来 选择的选项,因为页面作者可能没有放入 selected 属性 任何 元素,或者让浏览器默认选择第一个选项,或者让一些JavaScript通过选择初始选项 selected  属性

多重 其他  答案  这里  自称 那个选择器就像 //option[@selected] 可以在页面加载完全错误后检测用户所做的选择更改。

当然,如果你能够使用 CSS 那么选择器而不是XPath选择器 option:checked 会做的。


16
2017-08-01 08:10





问题可能是 " (双引号)。

//select/option[@selected='selected']  - 将匹配所选的选项,我正在成功使用它。

//select/option[@selected='selected' and @value='specific value']  - 如果它具有“特定值”,则仅匹配所选选项,我也使用此选项。

如果你仍然遇到麻烦,那可能是一个完全不同的问题,也许没有选项节点。我希望这有帮助。


2
2017-08-01 11:13



除了这个答案错误的主要方式之外,第二个错误的建议是在我的XPath中使用单引号而不是双引号引用字符串表达式可能会改变其行为。即使在最旧版本的XPath中,这也是错误的。每 原始规格, “在表达式中,文字字符串由单引号或双引号分隔”。 - Mark Amery
这个答案错误的主要方式是什么? - 23inhouse
它根本不起作用。 //select/option[@selected='selected'] 与当前选择的选项不匹配;它将匹配任何具有该选项的选项 selected 属性设置为字符串 "selected"。这甚至不能保证是 原来 选择的选项(因为仅仅 存在 的 selected 属性标记 option 最初选择;它的价值是什么并不重要),更不用说当前选择的那个(从哪个选项开始) 目前 选择完全独立于的存在或价值 selected 属性)。 - Mark Amery
它适用于我,当然该选项必须具有“已选择”属性值“已选中”。给予好评! - JavierFromMadrid


我想我们可以使用来自@Mark的答案和帐户的知识。让我们找到一个HAS所需属性的节点:

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

0
2017-12-24 20:57





我会尝试 //option[@selected='true']

driver.findElements(By.xpath("//option[@selected='true']")).getText();


-2
2018-04-02 16:29