mirror of
https://github.com/teamcapybara/capybara.git
synced 2022-11-09 12:08:07 -05:00
Adjust has_select filters to allow invisible options in some cases
- selected filter always allows invisible options - options filter allows invisible options if the select itself is invisible - with_options filter allows invisible options if hte select itself is invisible
This commit is contained in:
parent
91e09a793d
commit
33e233a029
3 changed files with 47 additions and 3 deletions
|
@ -226,12 +226,22 @@ Capybara.add_selector(:select) do
|
||||||
label "select box"
|
label "select box"
|
||||||
xpath { |locator| XPath::HTML.select(locator) }
|
xpath { |locator| XPath::HTML.select(locator) }
|
||||||
filter(:options) do |node, options|
|
filter(:options) do |node, options|
|
||||||
actual = node.all(:xpath, './/option').map { |option| option.text }
|
if node.visible?
|
||||||
|
actual = node.all(:xpath, './/option').map { |option| option.text }
|
||||||
|
else
|
||||||
|
actual = node.all(:xpath, './/option', visible: false).map { |option| option.text(:all) }
|
||||||
|
end
|
||||||
options.sort == actual.sort
|
options.sort == actual.sort
|
||||||
end
|
end
|
||||||
filter(:with_options) { |node, options| options.all? { |option| node.first(:option, option, minimum: 0) } }
|
filter(:with_options) do |node, options|
|
||||||
|
finder_settings = { minimum: 0 }
|
||||||
|
if !node.visible?
|
||||||
|
finder_settings[:visible] = false
|
||||||
|
end
|
||||||
|
options.all? { |option| node.first(:option, option, finder_settings) }
|
||||||
|
end
|
||||||
filter(:selected) do |node, selected|
|
filter(:selected) do |node, selected|
|
||||||
actual = node.all(:xpath, './/option').select { |option| option.selected? }.map { |option| option.text }
|
actual = node.all(:xpath, './/option', visible: false).select { |option| option.selected? }.map { |option| option.text(:all) }
|
||||||
[selected].flatten.sort == actual.sort
|
[selected].flatten.sort == actual.sort
|
||||||
end
|
end
|
||||||
filter(:disabled, default: false, boolean: true, skip_if: :all) { |node, value| not(value ^ node.disabled?) }
|
filter(:disabled, default: false, boolean: true, skip_if: :all) { |node, value| not(value ^ node.disabled?) }
|
||||||
|
|
|
@ -59,6 +59,11 @@ Capybara::SpecHelper.spec '#has_select?' do
|
||||||
'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
|
'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
|
||||||
])
|
])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should be true even when the selected option invisible, regardless of the select's visibility" do
|
||||||
|
expect(@session).to have_select('Icecream', :visible => false, :selected => 'Chocolate')
|
||||||
|
expect(@session).to have_select('Sorbet', :selected => 'Vanilla')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with exact options' do
|
context 'with exact options' do
|
||||||
|
@ -74,6 +79,11 @@ Capybara::SpecHelper.spec '#has_select?' do
|
||||||
expect(@session).not_to have_select('Region', :options => ['Norway', 'Sweden'])
|
expect(@session).not_to have_select('Region', :options => ['Norway', 'Sweden'])
|
||||||
expect(@session).not_to have_select('Region', :options => ['Norway', 'Norway', 'Norway'])
|
expect(@session).not_to have_select('Region', :options => ['Norway', 'Norway', 'Norway'])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it" should be true even when the options are invisible, if the select itself is invisible" do
|
||||||
|
expect(@session).to have_select("Icecream", :visible => false, :options => ['Chocolate', 'Vanilla', 'Strawberry'])
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with partial options' do
|
context 'with partial options' do
|
||||||
|
@ -87,6 +97,10 @@ Capybara::SpecHelper.spec '#has_select?' do
|
||||||
expect(@session).not_to have_select('Does not exist', :with_options => ['John'])
|
expect(@session).not_to have_select('Does not exist', :with_options => ['John'])
|
||||||
expect(@session).not_to have_select('Region', :with_options => ['Norway', 'Sweden', 'Finland', 'Latvia'])
|
expect(@session).not_to have_select('Region', :with_options => ['Norway', 'Sweden', 'Finland', 'Latvia'])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it" should be true even when the options are invisible, if the select itself is invisible" do
|
||||||
|
expect(@session).to have_select("Icecream", :visible => false, :with_options => ['Vanilla', 'Strawberry'])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -191,6 +191,26 @@ New line after and before textarea tag
|
||||||
</select>
|
</select>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<!-- invisible select and options -->
|
||||||
|
<p style="display: none">
|
||||||
|
<label for="form_icecream">Icecream</label>
|
||||||
|
<select name="form[icecream]" id="form_icecream">
|
||||||
|
<option selected="selected">Chocolate</option>
|
||||||
|
<option>Vanilla</option>
|
||||||
|
<option>Strawberry</option>
|
||||||
|
</select>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<!-- visible select with invisible selected option (which some browsers may treat as visible) -->
|
||||||
|
<p>
|
||||||
|
<label for="form_sorbet">Sorbet</label>
|
||||||
|
<select name="form[sorbet]" id="form_sorbet">
|
||||||
|
<option>Chocolate</option>
|
||||||
|
<option selected="selected" style="display: none">Vanilla</option>
|
||||||
|
<option>Strawberry</option>
|
||||||
|
</select>
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<span>First address<span>
|
<span>First address<span>
|
||||||
<label for='address1_street'>Street</label>
|
<label for='address1_street'>Street</label>
|
||||||
|
|
Loading…
Reference in a new issue