【问题标题】:Get select value of dropdown for capybara testing获取水豚测试下拉列表的选择值
【发布时间】:2012-07-16 05:33:53
【问题描述】:

我必须为网站编写测试。我正在尝试获取下拉框的选定值。到目前为止,我可以通过做得到下拉列表的内容

find_field('restrictions__rating_movies').text

返回 - 不允许电影 G PG 米 R13 R15 R16 R18 R RP16 允许所有电影

我可以得到选中对象的值。

find_field('restrictions__rating_movies').value

返回 - 1000

这对我没有多大帮助,因为我试图从下拉框中获取所选项目的文本。

<select class="" id="restrictions__rating_movies" name="restrictions[][rating_movies]">            
<option value="0">Don't Allow Movies</option>
<option value="100">G</option>
<option value="200">PG</option>
<option value="300">M</option>
<option value="325">R13</option>
<option value="350">R15</option>
<option value="375">R16</option>
<option value="400">R18</option>
<option value="500">R</option>
<option value="600">RP16</option>
<option value="1000" selected="selected">Allow All Movies</option></select>

在这种情况下,我需要获取值“允许所有电影”我已经尝试了上述两个示例的许多不同组合。

【问题讨论】:

    标签: ruby-on-rails rspec capybara


    【解决方案1】:

    如果您将 Capybara 与 Rspec 一起使用,则会有一个 have_select 匹配器:

    expect(page).to have_select(
      'my-select',         # locator
      selected: 'Option 2' # option
    ) 
    
    参数:

    Locator (String) (默认为: nil) — 选择框的标签、名称或 id Options (Hash) using :selected (String, Array) — 应该选择的选项

    【讨论】:

    • 这个答案对我不起作用。我得到“ArgumentError Exception: invalid keys :selected”(也许它已被弃用?)。 @brandon 接受的答案确实如此。
    • 也许您使用的是旧版本的 gem? capybara 的源代码显示了它的用法:github.com/jnicklas/capybara/blob/…
    • 给未来探索者的小提示:在这个例子中,'my-select' 是选择的name。可能很清楚,但我一直在尝试使用类标签:P
    • assert page.has_select?('my-select', selected: 'Option 2') 如果是 minitest 而不是 rspec
    • 当列表上有很多选项时,这个have_select真的很慢。我必须使用find_field(name).value 才能更快地完成断言。
    【解决方案2】:
    find_field('restrictions__rating_movies').find('option[selected]').text
    

    【讨论】:

    • 我更喜欢的细微变化 find_field('restrictions__rating_movies').should have_content('desired string')
    • @AshBlue 这只是确保“所需的字符串”包含在下拉列表的选项列表中,而不是实际选择。
    • 如果选项的选择是在 javascript 中完成的,find('option[selected]') 可能不起作用。在这种情况下,可能可以使用水豚的选择?像这样的方法:find('#restrictions_rating_movies').find(:xpath,"./option[contains(.,'Starwars')]").selected?
    • 我采纳了@LesNightingill 的想法,最终做了:find("#select_name option[value='something']").should be_selected
    • 如果您使用 Javascript 设置 select 的值,此方法将不起作用。如果是这种情况,您希望将has_select?has_no_select? 方法与selected 选项一起使用。见rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/…
    【解决方案3】:

    获取所选选项值的非常简单的方法是:

    find("#restrictions__rating_movies").value
    

    这将返回选定的选择选项值。

    【讨论】:

    • 在尝试了很多变化之后,这是对我有用的一个。我最终做了:find("select#my-select").value.should eq('test_value')。我喜欢你的方法,因为(对我来说)它更简单、更容易阅读——这意味着我更有可能记住它在做什么,并记住以后如何再做。谢谢!
    • +1 这似乎最适合 RSpec 的期望语法 expect(find("select#my-select").value).to eq 'test_value'
    • 这也是唯一适用于大多数驱动程序(selenium、poltergeist、webkit)的选项
    • 这是我最喜欢的可读性答案,您可以在没有不必要的抽象的情况下准确地看到正在发生的事情。
    • 问题是从框中获取文本,而不是选择的值。
    【解决方案4】:

    如果您只需要断言是否使用给定选项选择了某个字段,那么直接的答案是

    #Find a select box by (label) name or id and assert the given text is selected
    When /^select box "([^"]*)" is selected with "([^"]*)"$/ do |dropdown, selected_text|    
      assert page.has_select?(dropdown, selected: selected_text)
    end
    

    来源:http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers#has_select%3F-instance_method

    但您的问题的标题是“获取下拉列表的选择值”。 而且我遇到了类似的问题,我不仅想断言选择,还想检索所选字段的文本和值。我在 API 上找不到直接的方法。我发现的最简单的方法是:#all("option").find &amp;:selected?

    When /^ select box "([^"]*)" is selected with "([^"]*)"$/ do |dropdown, selected_text|
      sb = find_field(dropdown)
      sb_selected = sb.all("option").find &:selected?
      msg = "Selected: #{sb_selected.text.inspect} - value:#{sb_selected.value.inspect}"
      assert page.has_select?(dropdown, selected: selected_text), msg
    end
    

    当断言失败时,这会给我一个更全面的错误消息。

    如果有多个选择,您可以使用#select 代替#find,如#all("option").select &amp;:selected?。它将返回一个数组。

    这个答案不像之前的那样依赖于'option [selected]'技巧,所以即使选择是通过Javascript完成的(这就是之前的答案对我不起作用的原因)全部)。

    测试日期:

    capybara (2.2.1)
    capybara-webkit (1.1.0)
    cucumber (1.3.14)
    cucumber-rails (1.4.0)
    

    【讨论】:

      【解决方案5】:

      如果您想查找当前选定的文本,而不假设它可能是什么,以便您可以将其与预期进行比较,即使选择是由 JS 进行的,以下操作也有效(因此没有 'option[选择]')。

      首先我找到选择的值,然后找到具有该值的选项的文本:

        def selected(selector)
          value = find(selector).value
          text = find(selector).find("option[value='#{value}']").text
        end
      

      【讨论】:

        【解决方案6】:

        创建一个简单的函数来返回给定 select 元素的文本(下拉菜单):

        def get_dropdown_selected_item_text(dropdown)
          value = dropdown.value
          return dropdown.all(:css, "option").select {|opt| opt.value == value} .first.text
        end
        

        【讨论】:

          【解决方案7】:

          这样的东西有用吗?

          within("//select[@id='restrictions__rating_movies']") do
            find_field("//option[@selected='selected']").text
          end
          

          【讨论】:

          • 那行不通。这是错误 Selenium::WebDriver::Error::InvalidSelectorError: The given selector .////select[@id = 'restrictions__rating_movies'] 无效或不会生成 WebElement。发生以下错误:[InvalidSelectorError] 无法使用 xpath 表达式定位元素。////select[@id = 'restrictions__rating_movies'] 因为以下错误:[Exception...“表达式不是合法表达式。”
          • 那么find("//select option[@selected='selected']") 怎么样?
          • 我认为您需要传递 xpath 说明符,例如。 `within(:xpath, 'blah blah')
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-09
          • 2014-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-12
          • 2022-11-24
          相关资源
          最近更新 更多