如何在 rspec 中使用 capybara 点击下拉选项

Posted

技术标签:

【中文标题】如何在 rspec 中使用 capybara 点击下拉选项【英文标题】:How to use capybara in rspec to click on a dropdown option 【发布时间】:2012-07-01 10:53:20 【问题描述】:

我正在使用 ruby​​ on rails 3.2.3 和 capybara 来帮助创建请求规范。我的目标是创建一个测试注销的规范请求。网页:

<li class="dropdown">
  <a class="dropdown-toggle" data-toggle="dropdown">
    Welcome <%= current_user.first_name + " "+ current_user.last_name%>
    <b class="caret"></b>
  </a>
  <ul class="dropdown-menu">
    <a href="#">
      <%= link_to "Sign out", destroy_user_session_path, :method => :delete%>
    </a>
  </ul>
</li>

为了测试,我有

describe "sign out" do
  it "should let user to sign out" do
    login_as user, :scope => :user
    # click_on "Welcome #user.first_name #user.last_name"
    # Now click on Sign out
  end
end

我不知道如何单击“使用水豚退出”,因为它位于下拉菜单中,因此在页面上不可见。有人知道吗 ?

还有其他方法可以点击下拉菜单中的元素吗?

【问题讨论】:

我已经通过选择特定链接标签解决了同样的问题(在 Twitter Bootstrap 按钮下拉菜单上):find('a', :text =&gt; option_title).click 【参考方案1】:

你好,我终于明白了。我不得不使用xpath 来查找链接。基于上面的html,这是我所做的:

在 rspec 中,我写道:

page.find(:xpath, "//a[@href='/users/sign_out']").click

我之所以使用“//a[@href='/users/sign_out']”是因为网页上的link_to "Sign out", destroy_user_session_path, :method =&gt; :delete被编译成&lt;a href="/users/sign_out" ...

它有效:-)

哦,顺便说一句,我找到了这个有用的链接:http://www.suffix.be/blog/click_image_in_link_capybara

【讨论】:

我已经能够测试一个非常相似的下拉菜单,只需点击两次,一次打开下拉菜单,一次点击链接。 我也是这么想的。你可以发布一些代码吗?如果可以将其应用于上面的html,那就太好了。谢谢。 我相信这里缺少的部分是为请求规范启用 javascript;通常是 capybara-webkit (github.com/thoughtbot/capybara-webkit)。启用此功能后,点击将在您的浏览器中正常工作。 你好,这样在不启用js的情况下它确实可以工作(测试可以点击)。 通过 xpath 查找比这些答案中引用的 click_link 方法提供了更多的控制权。这应该有更多的赞成票!【参考方案2】:

我已经通过点击两个链接测试了一个下拉菜单

click_link "Welcome #current_user.first_name #current_user.last_name"
click_link 'sub link'

【讨论】:

如何点击_link“下拉链接”。 您当然可能必须将变量 current_user 替换为为您的测试创建的用户对象 尝试使用 JavaScript 驱动程序运行它,这样您就可以看到发生了什么。我直接从我自己的项目中复制了它。 我不明白。如何“使用 javascript 驱动程序运行”。对不起,如果我的问题不好。谢谢 it "my example" do更改为it "my example", js: true do默认情况下,这将启动Firefox并使用selenium运行示例,因此您可以看到它运行。您可以在结尾添加一个睡眠,以便您有时间了解正在发生的事情【参考方案3】:

一个更简单的解决方案就是这样:

select("要从菜单中选择的选项", :from => "标签名称")

注意:“标签名称”是&lt;label&gt; 的实际文本。但是,您也可以在这里使用&lt;select&gt; 的“id”或“name”属性,我认为这更好,因为您可以在某些时候更改标签文本,如果您这样做,您的测试仍然会通过。

【讨论】:

"select" 不适用于非 html 选择框元素。问题是关于“按钮下拉菜单”(如 twitter bootsrap 之一),它不是 html 选择框。 这个答案实际上解决了问题的标题。我想这就是它获得最多票数的原因。 该代码不是一个选择,它是引导程序的注销代码。所以选择不起作用【参考方案4】:

我的例子

find("ol.nya-bs-select.btn-default.form-control[ng-model='scope.values.countries']")
    .find_button("Nothing selected").click

【讨论】:

【参考方案5】:

我遇到了类似的问题,但我的下拉菜单没有任何文字,只有图标:

%li#user-menu.dropdown
  %a.dropdown-toggle href: "#", data:  toggle: "dropdown" , role: "button", aria:  haspopup: "true", expanded: "false"  
    %i.fa.fa-user
    %span.caret
  %ul.dropdown-menu
    %li.logout-text= link_to "Log Out", destroy_user_session_path, :method => :delete

在我使用的规范中:

def when_I_sign_out
  find('#user-menu').click
  click_on 'Log Out'
end

【讨论】:

以上是关于如何在 rspec 中使用 capybara 点击下拉选项的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Capybara 和 RSpec 中测试 CSV 文件下载?

在 Rails 中使用 RSpec 和 Capybara 时未定义的方法“访问”

如何使用 Capybara Rspec Matchers 测试演示者?

在 RSpec 请求规范中使用 Capybara 时设置自定义请求标头的最佳方法是啥?

模拟在 Rspec Capybara 中按下 Tab 键?

使用 RSpec + capybara-webkit 检查 JS 框是不是存在