Allow all invalid element error types to trigger allow_label_click behavior - Issue #1762

This commit is contained in:
Thomas Walpole 2016-09-21 12:10:32 -07:00
parent b00adfa5e5
commit 272a052f68
4 changed files with 32 additions and 18 deletions

View File

@ -28,7 +28,7 @@ matrix:
- gemfile: gemfiles/Gemfile.base-versions
rvm: 1.9.3
- gemfile: gemfiles/Gemfile.beta-versions
rvm: 2.4.0-preview1
rvm: 2.4.0-preview2
- gemfile: gemfiles/Gemfile.beta-marionette
env: GECKODRIVER=true
rvm: 2.3.1

View File

@ -109,11 +109,12 @@ module Capybara
allow_label_click = options.delete(:allow_label_click) { Capybara.automatic_label_click }
begin
find(:radio_button, locator, options).set(true)
rescue Capybara::ElementNotFound => e
raise unless allow_label_click
radio = find(:radio_button, locator, options)
radio.set(true)
rescue => e
raise unless allow_label_click && catch_error?(e)
begin
radio = find(:radio_button, locator, options.merge({wait: 0, visible: :hidden}))
radio ||= find(:radio_button, locator, options.merge({wait: 0, visible: :all}))
label = find(:label, for: radio, wait: 0, visible: true)
label.click unless radio.checked?
rescue
@ -145,11 +146,12 @@ module Capybara
allow_label_click = options.delete(:allow_label_click) { Capybara.automatic_label_click }
begin
find(:checkbox, locator, options).set(true)
rescue Capybara::ElementNotFound => e
raise unless allow_label_click
cbox = find(:checkbox, locator, options)
cbox.set(true)
rescue => e
raise unless allow_label_click && catch_error?(e)
begin
cbox = find(:checkbox, locator, options.merge({wait: 0, visible: :hidden}))
cbox ||= find(:checkbox, locator, options.merge({wait: 0, visible: :all}))
label = find(:label, for: cbox, wait: 0, visible: true)
label.click unless cbox.checked?
rescue
@ -181,11 +183,12 @@ module Capybara
allow_label_click = options.delete(:allow_label_click) { Capybara.automatic_label_click }
begin
find(:checkbox, locator, options).set(false)
rescue Capybara::ElementNotFound => e
raise unless allow_label_click
cbox = find(:checkbox, locator, options)
cbox.set(false)
rescue => e
raise unless allow_label_click && catch_error?(e)
begin
cbox = find(:checkbox, locator, options.merge({wait: 0, visible: :hidden}))
cbox ||= find(:checkbox, locator, options.merge({wait: 0, visible: :all}))
label = find(:label, for: cbox, wait: 0, visible: true)
label.click if cbox.checked?
rescue

View File

@ -161,11 +161,20 @@ Capybara::SpecHelper.spec "#check" do
expect{@session.check('form_cars_mclaren')}.to raise_error(Capybara::ElementNotFound, 'Unable to find checkbox "form_cars_mclaren"')
end
it "should check via the label if allow_label_click == true" do
expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be
@session.check('form_cars_tesla', allow_label_click: true)
@session.click_button('awesome')
expect(extract_results(@session)['cars']).to include('tesla')
context "with allow_label_click == true" do
it "should check via the label if input is hidden" do
expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be
@session.check('form_cars_tesla', allow_label_click: true)
@session.click_button('awesome')
expect(extract_results(@session)['cars']).to include('tesla')
end
it "should check via the label if input is moved off the left edge of the page" do
expect(@session.find(:checkbox, 'form_cars_pagani', unchecked: true, visible: :all)).to be
@session.check('form_cars_pagani', allow_label_click: true)
@session.click_button('awesome')
expect(extract_results(@session)['cars']).to include('pagani')
end
end
end
end

View File

@ -183,6 +183,8 @@ New line after and before textarea tag
<label for="form_cars_tesla">Tesla</label>
<input type="checkbox" value="ferrari" name="form[cars][]" id="form_cars_ferrari" checked="checked" style="display: none"/>
<label for="form_cars_ferrari">Ferrari</label>
<input type="checkbox" value="pagani" name="form[cars][]" id="form_cars_pagani" style="position: absolute; left: -9999px"/>
<label for="form_cars_pagani">Pagani</label>
<input type="checkbox" value="ariel" name="form[cars][]" id="form_cars_ariel" style="display: none"/>
<label>
McLaren