Skip to content

Commit

Permalink
Fixing the elements implementation so that assertions can be performe…
Browse files Browse the repository at this point in the history
…d on it
  • Loading branch information
selvakn committed Sep 21, 2013
1 parent 14fa2a2 commit 36a0fcf
Show file tree
Hide file tree
Showing 9 changed files with 49 additions and 31 deletions.
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
v 0.2.0

* Not backward compatible - breaks the elements api in page to have better assertions on the elements level

v 0.1.1

* Added tests


v 0.1.0

Initial version extracted
1 change: 1 addition & 0 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* Get rid of prefix in favour of base_element
4 changes: 2 additions & 2 deletions examples/simple/spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ def search(term)
end

class ResultsPage < Capypage::Page
elements :results, '#links .results_links_deep' do |result|
elements :results, '#links', '.results_links_deep' do |result|
result.element :link, '.links_main a'
result.element :snippet, '.snippet'
end
end
end
end
19 changes: 14 additions & 5 deletions lib/capypage/element.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ class Element
attr_accessor :selector, :prefix, :finder_options, :base_element

def initialize(selector, prefix = nil, options = {}, &block)
options.reverse_merge! :match => :smart
options.reverse_merge! :match => :first
@finder_options = options.clone
@selector = selector
@prefix = prefix
@finder_options = options
@base_element = options.delete(:base_element) || Capybara.current_session
@base_element = finder_options[:base_element] || capybara_page
block.call(self) if block.present?
end

Expand All @@ -25,7 +25,6 @@ def elements(name, selector, options = {}, &block)
end

def visible?(options = {})
options.reverse_merge! finder_options
options.reverse_merge! :wait => 2
return capybara_element(options).visible?
rescue Capybara::ElementNotFound
Expand All @@ -34,13 +33,23 @@ def visible?(options = {})

protected
def capybara_element(options = {})
base_element.find(element_selector, options.reverse_merge(finder_options))
base_element.find(element_selector, capybara_finder_options(options))
end

def element_selector
[prefix, selector].compact.join(" ")
end

def capybara_page
Capybara.current_session
end

def capybara_finder_options(options = {})
finder_options_without_base = finder_options.clone
finder_options_without_base.delete(:base_element)
options.reverse_merge finder_options_without_base
end

def self.capybara_element_methods
Capybara::Node::Element.instance_methods - Object.methods
end
Expand Down
22 changes: 6 additions & 16 deletions lib/capypage/elements.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,24 @@ class Elements < Element
delegate :each, :size, :[],
:to => :all

def initialize(selector, prefix = nil, options = {}, &block)
super(selector, prefix, options)
def initialize(parent_selector, children_selector, prefix = nil, options = {}, &block)
parent_selector_options = options.merge :base_element => Element.new(parent_selector, prefix, options)

super(children_selector, prefix, parent_selector_options)
@child_dsl_block = block
end

def all(options = {})
base_element.has_selector? element_selector
base_element.all(element_selector, options.reverse_merge(finder_options))
end

def find(text, options = {})
capybara_element options.merge(:text => text)
base_element.all(element_selector, capybara_finder_options(options))
end

def find_by_text(text, options = {})
Element.new(selector, prefix, finder_options.merge(options).merge(:text => text), &child_dsl_block)
end

def find_first(index = 1)
Elements.new("#{element_selector}:nth-child(-n+#{index})", prefix, finder_options)
end

def find_last(index = 1)
Elements.new("#{element_selector}:nth-last-child(-n+#{index})", prefix, finder_options)
end

def find_by_index(index)
Element.new("#{element_selector}:nth-child(#{index + 1})", prefix, finder_options, &child_dsl_block)
end
end
end
end
6 changes: 3 additions & 3 deletions lib/capypage/page.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ def element(name, selector, options = {})
define_method(name) { Element.new(selector, prefix, options) }
end

def elements(name, selector, options = {}, &block)
define_method(name) { Elements.new(selector, prefix, options, &block) }
def elements(name, parent_selector, children_selector, options = {}, &block)
define_method(name) { Elements.new(parent_selector, children_selector, prefix, options, &block) }
end

def section(name, section, selector, options = {})
Expand All @@ -37,4 +37,4 @@ def load
visit self.class.url
end
end
end
end
2 changes: 1 addition & 1 deletion lib/capypage/version.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module Capypage
VERSION = '0.1.1'
VERSION = '0.2.0'
end
10 changes: 8 additions & 2 deletions spec/elements_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,18 @@
element = elements.find_by_text('Title 1')
expect(element.details.text).to eq('Details 1')
end

it 'should look up the element in parent selector' do
element = elements.find_by_text 'Hello'
expect(element.base_element).to_not eq(Capybara.current_session)
expect(element.base_element.selector).to eq('ul.list')
end
end

describe 'delegation of capybara methods to the collection' do
xit 'should delegate has_text' do
it 'should delegate has_text' do
expect(elements).to have_text('Title 1')
end
end

end
end
4 changes: 2 additions & 2 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ class SamplePage < Capypage::Page
set_url '/'

element :header, 'header'
elements :list, 'ul.list li' do |row|
elements :list, 'ul.list', 'li' do |row|
row.element :title, '.title'
row.element :details, '.details'
end

end
end

0 comments on commit 36a0fcf

Please sign in to comment.