diff --git a/lib/capybara/node/simple.rb b/lib/capybara/node/simple.rb index 96058ed20..76b33ec34 100644 --- a/lib/capybara/node/simple.rb +++ b/lib/capybara/node/simple.rb @@ -127,7 +127,8 @@ def checked? # # @return [Boolean] Whether the element is disabled def disabled? - native.has_attribute?('disabled') + native.has_attribute?('disabled') && + %w[button input select textarea optgroup option menuitem fieldset].include?(tag_name) end ## diff --git a/lib/capybara/selector.rb b/lib/capybara/selector.rb index 0d93ecf6d..295d1776a 100644 --- a/lib/capybara/selector.rb +++ b/lib/capybara/selector.rb @@ -176,7 +176,7 @@ end.reduce(:union) end - node_filter(:disabled, :boolean, default: false, skip_if: :all) { |node, value| node.tag_name == 'a' || !(value ^ node.disabled?) } + node_filter(:disabled, :boolean, default: false, skip_if: :all) { |node, value| !(value ^ node.disabled?) } describe_node_filters do |disabled: nil, **| ' that is disabled' if disabled == true diff --git a/lib/capybara/selenium/node.rb b/lib/capybara/selenium/node.rb index 96d1ba4d7..a971b92a3 100644 --- a/lib/capybara/selenium/node.rb +++ b/lib/capybara/selenium/node.rb @@ -147,6 +147,7 @@ def selected?; boolean_attr(native.selected?); end def disabled? return true unless native.enabled? + # WebDriver only defines `disabled?` for form controls but fieldset makes sense too find_xpath('self::fieldset/ancestor-or-self::fieldset[@disabled]').any? end diff --git a/lib/capybara/spec/session/node_spec.rb b/lib/capybara/spec/session/node_spec.rb index 98fb2dc28..81e5ca40d 100644 --- a/lib/capybara/spec/session/node_spec.rb +++ b/lib/capybara/spec/session/node_spec.rb @@ -137,7 +137,7 @@ expect(element.base).to have_received(:set).with('gorilla', clear: :backspace) end - context 'with a contenteditable element', requires: [:js], focus_: true do + context 'with a contenteditable element', requires: [:js] do it 'should allow me to change the contents' do @session.visit('/with_js') @session.find(:css, '#existing_content_editable').set('WYSIWYG') @@ -167,7 +167,7 @@ end end - describe '#disabled?', :focus_ do + describe '#disabled?' do it 'should extract disabled node' do @session.visit('/form') expect(@session.find('//input[@id="customer_name"]')).to be_disabled diff --git a/spec/selector_spec.rb b/spec/selector_spec.rb index daa440c33..05641903f 100644 --- a/spec/selector_spec.rb +++ b/spec/selector_spec.rb @@ -478,6 +478,10 @@ Capybara::Selector[:link_or_button].expression_filters.delete(:random) end + it 'should not find links when disabled == true' do + expect(string.all(:link_or_button, disabled: true).size).to eq 0 + end + context 'when modified' do it 'should still work' do filter = Capybara::Selector[:link_or_button].expression_filters[:random]