【问题标题】:Find CURRENTLY selected <option> with XPath使用 XPath 查找当前选择的 <option>
【发布时间】:2013-03-24 01:15:46
【问题描述】:

检查 option 元素是否当前被选中,或者只是从 select 元素中获取选中的 option 元素的正确 XPath 语法是什么,在用户和 JavaScript 可能与之交互的打开页面上?这甚至可以通过 XPath 实现,还是它缺乏查看 DOM 属性的能力?

我找不到任何关于此的文档,并且(推测性地)尝试过:

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

但这些都不起作用;它们根本不匹配任何元素。

(以防万一,我已经尝试过在 Chrome 开发者控制台中使用 $x 函数,并在 Selenium for Python 中使用 find_elements_by_xpath 方法。)

【问题讨论】:

    标签: dom xpath


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      简答:不可能。

      更长的答案:XPath 可以查看 HTML 属性,但不能查看 DOM 属性。在&lt;select&gt; 中选择&lt;option&gt; 元素会将&lt;option&gt;selected 属性 更改为true,并且还会更改其父元素&lt;select&gt;value 属性,但它不影响两者的属性,因此对 XPath 是不可见的。

      要查找具有selected 属性集的&lt;option&gt; 元素(通常是页面作者可能确定最初选择哪个选项的方式),您可以使用//option[@selected]。但这没有找到当前选择的&lt;option&gt;;用户对选择所做的更改对 XPath 是不可见的。不能保证它甚至会找到 initially 选定的选项,因为页面作者可能没有将 selected 属性放在 any 元素上,或者让浏览器默认选择第一个选项,或者让一些 JavaScript 通过selected property 选择初始选项。

      多个otheranswershereclaiming,像//option[@selected]这样的选择器可以检测到用户在页面加载后所做的选择更改是完全错误的。

      当然,如果您能够使用 CSS 选择器而不是 XPath 选择器,那么 option:checked 就可以完成这项工作。

      【讨论】:

      • 似乎//option[@selected] 开始工作就像我使用&lt;option value="0" selected&gt;Select Something&lt;/option&gt; 一样,但我注意到如果我使用相同的 XPath 在同一页面中搜索第二个下拉列表,则第一个下拉列表是总是被选中.. option:checked 拯救了这一天!
      【解决方案3】:

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

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

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

      如果您仍然遇到问题,则可能是完全不同的问题,可能没有选项节点。我希望这会有所帮助。

      【讨论】:

      • 除了这个答案是错误的主要方式之外,第二个错误是建议在我的 XPath 中用单引号而不是双引号引用字符串表达式可能会改变它的行为。这是错误的,即使在最旧版本的 XPath 中也是如此。根据the original spec“在表达式中,文字字符串由单引号或双引号分隔”.
      • 这个答案错误的主要方式是什么?
      • 它根本不起作用。 //select/option[@selected='selected'] 将不匹配当前选择的选项;它将匹配任何将selected 属性设置为字符串"selected" 的选项。这甚至不能保证是 initially 选择的选项(因为仅仅 presenceselected 属性将 option 标记为最初选择的;不管什么它的值是),更不用说当前选择的一个(因为当前选择了哪个选项完全独立于selected属性的存在或值)。
      • 它对我有用,当然该选项必须具有“已选择”属性和“已选择”值。点赞!
      【解决方案4】:

      我认为我们可以使用@Mark 回答中的知识并加以说明。让我们找到一个具有所需属性的节点:

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

      【讨论】:

        【解决方案5】:

        我尝试了 "//option[@selected=''],它对我有用。 它能够突出显示页面对象模型中的选定选项。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-23
          • 2021-04-07
          • 1970-01-01
          • 1970-01-01
          • 2011-06-02
          • 2012-02-10
          • 2014-05-26
          • 1970-01-01
          相关资源
          最近更新 更多