我有一个应用程序,可以根据UI中发生的事情启用/禁用按钮.

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

should have_button 'save'

但我不知道如何验证保存按钮的状态.也就是说:

How do I write a Capybara assertion that checks for the presence of a button 100 its enabled or disabled state?

我拼凑了一张支票,上面有一个禁用的按钮;对于enabled,我想我可以验证是否有匹配的按钮,以及是否没有匹配的disabled按钮.但至少可以说,这是笨重的.

这看起来像是一个基本的UI判断,我确信我错过了一些东西,但我似乎不知道是什么.


根据格雷盖茨的回答进行跟进:

正如我在 comments 中提到的,水豚的行为取决于潜在的驱动因素.我们正在使用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

推荐答案

看来水豚对禁用元素的处理已经改变了,所以我想我应该给出一个更新.

要测试页面是否有按钮并已启用,请使用:

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

旧的链接断了.This is the GitHub issue where the feature was discussedthis is the unfortunately barren documentation for the method.

Ruby-on-rails相关问答推荐

关系 fields_for 上不允许的参数

获取所有属于模型的嵌套对象

组织和/或存储我一直在 RSpec 中使用的模拟对象的最佳方式是什么?

如何在测试期间为 Rails 应用程序启用 Rails.cache 会话对象

别名可能与不同模型的相同别名有许多关联?

如何在两个日期之间生成随机日期和时间?

SQLite3::BusyException

jQuery ajax 请求不会触发 Rails 控制器的 JS 响应?

价格字段的字符串、小数或浮点数据类型?

从子类中的重载方法调用基类方法

DateTime.now 还是 Time.now?

在 Windows 上安装特定的 Ruby on Rails 版本

如何在 Windows 上为 Ruby 安装 sqlite3?

Rails 引擎中的迁移?

设计:在注册期间禁用密码确认

从 Rails 中的控制器调用辅助方法时出现未定义的方法

从 Rails 中的 ActiveRecord::RecordNotFound 救援

Ruby on Rails 3:通过 Rails 将数据流式传输到客户端

Rails:如何将日期时间字符串解析为特定时区

没有路由匹配缺少必需的键:[:id]