Como faço para escrever uma afirmação Capybara que verifica a presença de um botão e seu estado ativado ou desativado?

Eu tenho um aplicativo que ativa / desativa botões em resposta a coisas que acontecem na interface do usuário.

Eu posso facilmente usar a capivara para detectar se existe um botão

should have_button 'save'

mas não tenho idéia de como verificar o estado do botão salvar. Isso é:

Como faço para escrever uma afirmação Capybara que verifica a presença de um botãoe seu estado ativado ou desativado?

Eu hackeei um cheque para um botão desativado; para ativado, suponho que eu possa verificar se há um botão correspondente e se não há um botão desativado correspondente. Mas isso, para dizer o mínimo, é desajeitado.

Isso parece uma verificação de interface tão fundamental, que tenho certeza de que perdi alguma coisa, mas não consigo descobrir o que.

Acompanhamento com base na resposta de gregates:

Como mencionei no comentário, o comportamento da Capivara depende do driver subjacente. Estamos usando o webkit e ele retorna resultados de string "true" / "false". Aparentemente, outros drivers retornam verdadeiro / falso. O pessoal da Capybara está ciente do problema (github.com/jnicklas/capybara/issues/705), mas eles sentem (provavelmente corretamente) que não é realmente problema deles resolver.

Em vez de fazer com que meus testes dependam do driver que estou usando, acabei criando um correspondente personalizado:

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

Então você pode digitar:

user_license_area.find_button('Save').should be_disabled

questionAnswers(5)

yourAnswerToTheQuestion