如何编写一个Capybara断言来检查是否存在按钮及其启用或禁用状态?

时间:2012-10-16 14:38:59

标签: ruby-on-rails capybara

我有一个应用程序启用/禁用按钮以响应UI中发生的事情。

我可以轻松使用水豚来检测按钮是否存在

should have_button 'save'

但我不知道如何验证保存按钮的状态。那就是:

如何编写一个Capybara断言,检查是否存在按钮启用或禁用状态?

我已经一起检查了一个禁用按钮的检查;对于启用,我想我可以验证是否有匹配的按钮,并且没有匹配的禁用按钮。但至少可以说,这是笨重的。

这看起来像是一个基本的UI检查,我确信我错过了一些东西,但我似乎无法弄清楚是什么。


根据gregates的回答跟进:

正如我在评论中提到的,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

6 个答案:

答案 0 :(得分:62)

似乎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

了解有关此更新的更多信息

<强>更新

旧链接已损坏。 This is the GitHub issue where the feature was discussedthis is the unfortunately barren documentation for the method

答案 1 :(得分:14)

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

请注意,一行将有效地测试存在和禁用状态。

编辑:启用后,尝试

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

(这些测试中的任何一个都可能需要调整,具体取决于您如何禁用/启用按钮。)

答案 2 :(得分:2)

有很多方法可以做到这一点。我认为最好的方法是使用css选择器

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

此示例假设您已将css ID设置为save。

答案 3 :(得分:2)

有be_disabled check

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

答案 4 :(得分:0)

来自用户在UI中的操作(选择文档类型)的类似情况触发按钮变为启用...

在控件上有一个id,找到按钮(无论状态如何)变得非常干净,并声明状态为“disabled-ness”。

  @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

支持黄瓜的功能与Capybara同步:

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

答案 5 :(得分:0)

使用最小测试:

This is correct behavior because switch statement doesn’t use `==` operator to match cases, instead it uses `~=`. Try adding `~=` as well for `AMInputType`.