43

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

我可以很容易地使用 capybara 来检测按钮是否存在

should have_button 'save'

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

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

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

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


根据gregates的回答跟进:

正如我在评论中提到的,Capybara 的行为取决于底层驱动程序。我们正在使用 webkit,它返回“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"

Note that one line will effectively test for both existence and disabled state.

Edit: for enabled, try

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

(Either of these tests may need to be tweaked depending on precisely how you disable/enable the button.)

于 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")

此示例假定您已将 css id 设置为保存。

于 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

以及 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
于 2016-10-03T19:44:27.020 回答