add locate field attribute filter set

This commit is contained in:
Thomas Walpole 2016-04-26 08:51:22 -07:00
parent 48ab1ede94
commit 5030a152f3
4 changed files with 43 additions and 2 deletions

View File

@ -102,6 +102,20 @@ module Capybara
locate_field += XPath.descendant(:label)[XPath.string.n.is(locator)].descendant(xpath)
locate_field
end
FilterSet.add(:locate_field) do
filter(:id) { |node, id| node['id'] == id }
filter(:name) { |node, name| node['name'] == name }
filter(:placeholder) { |node, placeholder| node['placeholder'] == placeholder }
describe do |options|
desc = String.new
[:id, :name, :placeholder].each do |opt|
desc << " with #{opt.to_s} #{options[opt]}" if options.has_key?(opt)
end
desc
end
end
end
end
@ -123,6 +137,9 @@ Capybara.add_selector(:field) do
xpath = locate_field(xpath, locator.to_s) unless locator.nil?
xpath
end
filter_set(:locate_field)
filter(:checked, boolean: true) { |node, value| not(value ^ node.checked?) }
filter(:unchecked, boolean: true) { |node, value| (value ^ node.checked?) }
filter(:disabled, default: false, boolean: true, skip_if: :all) { |node, value| not(value ^ node.disabled?) }
@ -222,6 +239,8 @@ Capybara.add_selector(:fillable_field) do
xpath
end
filter_set(:locate_field)
filter(:disabled, default: false, boolean: true, skip_if: :all) { |node, value| not(value ^ node.disabled?) }
filter(:multiple, boolean: true) { |node, value| !(value ^ node[:multiple]) }
@ -242,6 +261,8 @@ Capybara.add_selector(:radio_button) do
xpath
end
filter_set(:locate_field)
filter(:checked, boolean: true) { |node, value| not(value ^ node.checked?) }
filter(:unchecked, boolean: true) { |node, value| (value ^ node.checked?) }
filter(:option) { |node, value| node.value == value.to_s }
@ -265,6 +286,8 @@ Capybara.add_selector(:checkbox) do
xpath
end
filter_set(:locate_field)
filter(:checked, boolean: true) { |node, value| not(value ^ node.checked?) }
filter(:unchecked, boolean: true) { |node, value| (value ^ node.checked?) }
filter(:option) { |node, value| node.value == value.to_s }
@ -289,6 +312,8 @@ Capybara.add_selector(:select) do
xpath
end
filter_set(:locate_field)
filter(:options) do |node, options|
if node.visible?
actual = node.all(:xpath, './/option').map { |option| option.text }
@ -349,6 +374,8 @@ Capybara.add_selector(:file_field) do
xpath
end
filter_set(:locate_field)
filter(:disabled, default: false, boolean: true, skip_if: :all) { |node, value| not(value ^ node.disabled?) }
filter(:multiple, boolean: true) { |node, value| !(value ^ node[:multiple]) }

View File

@ -87,7 +87,7 @@ Capybara::SpecHelper.spec '#find_field' do
end
end
context 'with no locator', locator: true do
context 'with no locator' do
it 'should use options to find the field' do
expect(@session.find_field(with: 'dog')['id']).to eq "form_pets_dog"
end

View File

@ -32,4 +32,18 @@ Capybara::SpecHelper.spec Capybara::Selector do
end
end
end
describe "locate_field selectors" do
it "can find specifically by id" do
expect(@session.find(:field, id: 'customer_email').value).to eq "ben@ben.com"
end
it "can find specifically by name" do
expect(@session.find(:field, name: 'form[other_title]')['id']).to eq "form_other_title"
end
it "can find specifically by placeholder" do
expect(@session.find(:field, placeholder: 'FirstName')['id']).to eq "form_first_name"
end
end
end

View File

@ -37,7 +37,7 @@
<p>
<label for="form_first_name">
First Name
<input type="text" name="form[first_name]" value="John" id="form_first_name"/>
<input type="text" name="form[first_name]" value="John" id="form_first_name" placeholder="FirstName"/>
</label>
</p>