web-dev-qa-db-ja.com

rspecでcapybaraを使用してドロップダウンオプションをクリックする方法

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

ドロップダウンメニューにあるため、ページに表示されないため、カピバラを使用してサインアウトをクリックする方法がわかりません。誰か知っている ?

ドロップダウンメニューの要素をクリックする他の方法はありますか?

21
u19964

こんにちは私は最終的にそれを理解しました。リンクを見つけるにはxpathを使用する必要がありました。上記のhtmlに基づいて、これが私がしたことです:

Rspecで、私は書いた:

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

「// a [@ href = '/ users/sign_out']」を使用する理由は、Webページでlink_to "Sign out", destroy_user_session_path, :method => :delete<a href="/users/sign_out" ...にコンパイルされているためです。

そしてそれは動作します:-)

ちなみに、私はこの便利なリンクを見つけました: http://www.suffix.be/blog/click_image_in_link_capybara

5
u19964

両方のリンクをクリックするだけでドロップダウンをテストしました

click_link "Welcome #{current_user.first_name} #{current_user.last_name}"
click_link 'sub link'
8
DVG

はるかに簡単な解決策は単純にこれです:

select( "メニューから選択したいオプション"、:from => "ラベル名")

注:「ラベル名」は、<label>の実際のテキストです。ただし、ここでも<select>の「id」または「name」属性を使用できます。これは、ある時点でラベルテキストを変更する可能性があるため、変更した場合でもテストは引き続き実行されるため、より良いと思います。パス。

4
nfriend21

これの私の例

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

同様の問題が発生しましたが、ドロップダウンにテキストがなく、アイコンのみが含まれていました。

%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
1
Bryan Ash