43

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

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

should have_button 'save'

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

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

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

これは非常に基本的なUIチェックのように思われるので、何かを見逃したことは確かですが、何がわからないようです。


集合体の回答に基づいてフォローアップします。

コメントで述べたように、カピバラの振る舞いは基礎となるドライバーに依存しています。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
4

6 に答える 6

78

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をご覧ください。

アップデート

古いリンクが壊れています。これは、機能が説明されたGitHubの問題であり残念ながら、メソッドの不毛なドキュメントです

于 2014-07-07T16:12:04.723 に答える
14
find_button('save')[:disabled].should eq "disabled"

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

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

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

(ボタンを無効/有効にする方法によっては、これらのテストのいずれかを微調整する必要がある場合があります。)

于 2012-10-16T14:48:18.603 に答える
4

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

于 2016-09-01T10:27:22.430 に答える
3

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

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

この例では、cssidを保存するように設定していることを前提としています。

于 2014-12-23T13:55:41.953 に答える
1

ミニテスト付き:

assert find('input[name=username]').disabled?
于 2021-07-02T08:52:04.237 に答える
0

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
于 2016-10-03T19:44:27.020 に答える