web-dev-qa-db-ja.com

ボタンの存在とその有効状態または無効状態をチェックするカピバラアサーションを作成するにはどうすればよいですか?

UIで発生することに対応してボタンを有効/無効にするアプリがあります。

カピバラを使用して、ボタンが存在するかどうかを簡単に検出できます

should have_button 'save'

しかし、保存ボタンの状態を確認する方法がわかりません。あれは:

ボタンの存在をチェックするCapybaraアサーションを書くにはどうすればいいですか?andボタンの有効状態または無効状態

無効なボタンのチェックを一緒にハックしました。有効にした場合、一致するボタンがあり、一致する無効なボタンがないことを確認できると思います。しかし、これは控えめに言っても不格好です。

これは基本的なUIチェックのように思えます。何かを見落としていると確信していますが、何がわかるのかわかりません。


集合体の答えに基づいてフォローアップ:

コメントで述べたように、Capybaraの動作は、基盤となるドライバーに依存しています。 Webkitを使用しており、「true」/「false」の文字列結果を返します。どうやら、他のドライバーはtrue/falseを返します。 Capybaraの人々はこの問題(github.com/jnicklas/capybara/issues/705)を認識していますが、(おそらく正しく)解決すべき問題ではないと感じています。

テストを使用しているドライバーに依存するのではなく、カスタムマッチャーを作成することになりました。

RSpec::Matchers.define :be_enabled do
  match do |actual|
    driver_result = actual[:disabled]
    # nil, false, or "false" will all satisfy this matcher
    (driver_result.nil? || driver_result == false || driver_result == "false").should be_true
  end
end

RSpec::Matchers.define :be_disabled do
  match do |actual|
    driver_result = actual[:disabled]
    (driver_result == "disabled" || driver_result == true || driver_result == "true").should be_true
  end
end

次に入力できます:

user_license_area.find_button('Save').should be_disabled
32
Andy Davis

Capybaraの無効化された要素の処理が変更されたように見えるので、更新を行うと思いました。

ページにボタンがあり、有効になっているかどうかをテストするには、次を使用します。

expect(page).to have_button('Save')

ページにボタンがあり、無効になっているかどうかをテストするには、次を使用します。

expect(page).to have_button('Save', disabled: true)

この形式は、has_field?find_fieldなど.

この更新の詳細については、 http://www.elabs.se/tag/capybara をご覧ください。

[〜#〜] update [〜#〜]

古いリンクが壊れています。 これはこの機能が議論されたGitHubの問題です および これは残念ながらメソッドの不毛なドキュメントです です。

63
J3RN
find_button('save')[:disabled].should eq "disabled"

1行で、存在状態と無効状態の両方を効果的にテストすることに注意してください。

編集:有効にするには、試してください

find_button('save')[:disabled].should_not be

(これらのテストは、ボタンの無効化/有効化の方法に応じて微調整する必要があります。)

14
gregates

これを行うには多くの方法があります。私は最善の方法はCSSセレクターを使用することだと思います

expect(page).to have_css("#save:enabled")

この例では、css idがsaveに設定されていると想定しています。

2
Thomas

Be_disabledチェックがあります

it "allows finding elements and checking if they are disabled" do
  expect(string.find('//form/input[@name="bleh"]')).to be_disabled
  expect(string.find('//form/input[@name="meh"]')).not_to be_disabled
end

https://github.com/jnicklas/capybara/blob/2a51b817b355f6c1a5e95a471a87f1a492562e55/spec/basic_node_spec.rb#L108

2
Piotr Kędziak

UIでのユーザーのアクション(ドキュメントの種類の選択)がボタンを有効にするトリガーとなる同様の状況から...

コントロールのIDを使用すると、(状態に関係なく)ボタンを見つけて「無効」の状態をアサートするのが非常にきれいになります。

  @javascript
  Scenario: Package generation not allowed unless a document type is selected
    Given I view the "Liberty and 4th Building Renovation" project
    When I view the Package Creator
    Then both document package generation buttons should be disabled

  @javascript
  Scenario: Package generation allowed when documents types are selected
    Given I view the "Liberty and 4th Building Renovation" project
    When I view the Package Creator
    And I select any document type
    Then both document package generation buttons should be enabled

そして、カピバラでサポートするキュウリ機能のステップ:

Then(/^both document package generation buttons should be disabled$/) do
  expect(find_by_id('generate_pdf')).to be_disabled
  expect(find_by_id('generate_Zip')).to be_disabled
end

Then(/^both document package generation buttons should be enabled/) do
  expect(find_by_id('generate_pdf')).not_to be_disabled
  expect(find_by_id('generate_Zip')).not_to be_disabled
end
0
Jon Kern