page_object_wrapper 0.0.6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/README.md +180 -340
  2. data/bad_pages/bad_page.rb +34 -0
  3. data/good_pages/another_test_page.rb +14 -0
  4. data/good_pages/some_test_page.rb +53 -0
  5. data/good_pages/test_table_page.rb +12 -0
  6. data/img/scheme.png +0 -0
  7. data/lib/page_object_wrapper.rb +57 -92
  8. data/lib/page_object_wrapper/Action.rb +11 -0
  9. data/lib/page_object_wrapper/Dsl.rb +35 -0
  10. data/lib/page_object_wrapper/Element.rb +15 -0
  11. data/lib/page_object_wrapper/ElementsSet.rb +22 -0
  12. data/lib/page_object_wrapper/Exceptions.rb +7 -21
  13. data/lib/page_object_wrapper/PageObject.rb +371 -0
  14. data/lib/page_object_wrapper/Pagination.rb +6 -57
  15. data/lib/page_object_wrapper/Table.rb +13 -48
  16. data/lib/page_object_wrapper/known_elements.rb +31 -0
  17. data/lib/page_object_wrapper/version.rb +1 -1
  18. data/spec/define_page_object_spec.rb +162 -0
  19. data/spec/defined_elements_spec.rb +77 -0
  20. data/spec/feed_elements_spec.rb +95 -0
  21. data/spec/fire_event_spec.rb +53 -0
  22. data/spec/generate_spec.rb +20 -0
  23. data/spec/load_spec.rb +46 -0
  24. data/spec/open_spec.rb +70 -0
  25. data/spec/select_from_spec.rb +84 -0
  26. data/spec/shared_examples.rb +12 -0
  27. data/spec/spec_helper.rb +2 -15
  28. metadata +35 -27
  29. data/Gemfile +0 -4
  30. data/LICENSE.txt +0 -22
  31. data/Rakefile +0 -1
  32. data/lib/page_object_wrapper/Distribution.rb +0 -43
  33. data/lib/page_object_wrapper/DynamicClass.rb +0 -31
  34. data/lib/page_object_wrapper/Editable.rb +0 -13
  35. data/lib/page_object_wrapper/Form.rb +0 -116
  36. data/lib/page_object_wrapper/Submitter.rb +0 -8
  37. data/page_object_wrapper.gemspec +0 -22
  38. data/spec/example_spec.rb +0 -42
  39. data/spec/form_spec.rb +0 -176
  40. data/spec/page_object_spec.rb +0 -173
  41. data/spec/pagination_spec.rb +0 -14
  42. data/spec/table_spec.rb +0 -52
  43. data/spec/test_data_spec.rb +0 -38
data/Rakefile DELETED
@@ -1 +0,0 @@
1
- require "bundler/gem_tasks"
@@ -1,43 +0,0 @@
1
- class Distribution
2
- attr_accessor :total_object_number
3
- # distribution types
4
- RANDOM=0 #(default)
5
- SEQUENTAL=1
6
- def initialize(dist_hash) # {status_name => status_probability (in percents)}
7
- @distribution=dist_hash
8
- @type=RANDOM
9
- @sequental_increment=1
10
- @sequental_index=@sequental_increment
11
- # check for consistency
12
- raise "Distribution init error > summ of percents must be 100" if @distribution.values.inject{|sum,x| sum + x }!=100
13
- end
14
-
15
- def type(type,total_object_number=nil)
16
- raise "Unknown type: #{type}. Possible types are Distribution::RANDOM, Distribution::SEQUENTAL" if not (type==RANDOM or type==SEQUENTAL)
17
- @type=type
18
- if @type==SEQUENTAL
19
- raise "SEQUENTAL type requires the total number of objects that will be generated (>0)" if (total_object_number==nil or total_object_number==0)
20
- @sequental_increment=(100/total_object_number).floor
21
- @sequental_index=@sequental_increment
22
- end
23
- end
24
-
25
- def generate
26
- r=(@type==RANDOM)? rand(100) : @sequental_index
27
- @sequental_index=(@sequental_index<100)? @sequental_index+@sequental_increment : @sequental_increment
28
- dist_ary=@distribution.values
29
- dist_ary_normalized=[]
30
- dist_ary_normalized << dist_ary.first
31
- for i in 1..dist_ary.length-1
32
- dist_ary_normalized[i]=dist_ary_normalized[i-1]+dist_ary[i]
33
- end
34
- ind=(dist_ary_normalized << r).sort!.index(r)
35
- return @distribution.keys[ind]
36
- end
37
- end
38
-
39
- #d=Distribution.new('new'=>10,'old'=>30,'very_old'=>60)
40
- #d.type(Distribution::SEQUENTAL,10)
41
- #10.times do
42
- # puts d.generate
43
- #end
@@ -1,31 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
- require 'Exceptions'
3
- class DynamicClass
4
-
5
- def metaclass
6
- class << self
7
- self
8
- end
9
- end
10
-
11
- @@objects=[]
12
- def initialize(xml_hash)
13
- raise DynamicClassError.new('parameter is not a hash','new',xml_hash) if not xml_hash.is_a?(Hash)
14
- xml_hash.each_pair {|attr, value|
15
- metaclass.send :attr_accessor, attr
16
- send "#{attr}=".to_sym, value
17
- }
18
- @@objects << self
19
- end
20
-
21
- def self.find(attr,value)
22
- ind=@@objects.collect(&attr.to_sym).index(value)
23
- @@objects[ind]
24
- end
25
- def self.each
26
- @@objects.each{|object|
27
- yield object
28
- }
29
- end
30
- end
31
-
@@ -1,13 +0,0 @@
1
- class Editable
2
- attr_accessor :watir_element, :label, :default, :required
3
- def initialize(watir_element,label,default,required)
4
- @watir_element = watir_element
5
- @label=label.to_sym
6
- @default=default
7
- @required=required
8
- end
9
-
10
- def required?
11
- required
12
- end
13
- end
@@ -1,116 +0,0 @@
1
- require 'Editable'
2
- require 'Exceptions'
3
- require 'Submitter'
4
- class Form < Watir::Form
5
- def initialize(current_page,target_page,accessor,*args)
6
- super(accessor,extract_selector(args).merge(:tag_name => "form"))
7
- @elements=[]
8
- @accessor=accessor
9
- @current_page=current_page
10
- @target_page=target_page
11
- @submit_element = nil
12
- end
13
-
14
- def editable(type,how_find_hash,label=type,default='Field data',required=false)
15
- watir_element = @accessor.send(type.to_sym,how_find_hash)
16
- raise FormError.new('Element not found', 'editable', "TYPE=#{type.inspect}, HOW_FIND=#{how_find_hash.inspect}, PAGE=#{@current_page.class.name}") if not element.exists?
17
- Form.send :define_method, label do
18
- watir_element
19
- end
20
- @elements << Editable.new(watir_element,label,default,required)
21
- end
22
-
23
- def submitter(type,how_find_hash,how_click_method ='click',*click_params)
24
- # find submitter
25
- @submit_element = Submitter.new(how_click_method,click_params)
26
- @submit_element.watir_element = @accessor.send(type.to_sym,how_find_hash)
27
- raise FormError.new('Element not found', 'submitter', "TYPE=#{type.inspect}, HOW_FIND=#{how_find_hash.inspect}") if not @submit_element.watir_element.exists?
28
- end
29
-
30
- def submit(correct_submission_flag)
31
- return_page = (correct_submission_flag==true)? @target_page : @current_page
32
- if @submit_element.nil?
33
- # submitter is not defined, applying regular form submission
34
- super()
35
- return return_page.new
36
- else
37
- # submitter defined, applying its submission method
38
- begin
39
- @submit_element.watir_element.send(@submit_element.how_click_method.to_sym,*@submit_element.click_params)
40
- rescue Exception => e
41
- puts "ORIGINAL ERROR: #{e.message}"
42
- raise FormError.new('Error clicking submitter', "SUBMITTER: WATIR_ELEMENT=#{@submit_element.watir_element}, HOW_FIND=#{@submit_element.how_find_hash}", "CLICK_METHOD: #{@submit_element.how_click_mehtod}, CLICK_PARAMS: #{@submit_element.click_params}")
43
- end
44
- return return_page.new
45
- end
46
- end
47
-
48
- def default(label)
49
- find_input(label).default
50
- end
51
-
52
- def each
53
- @elements.each{|e|
54
- yield e
55
- }
56
- end
57
-
58
- def each_required
59
- @elements.select{|f| f.required}.each{|e|
60
- yield e
61
- }
62
- end
63
-
64
- def fill_only(data_hash)
65
- if data_hash.nil?
66
- raise FormError.new('Invalid parameter','fill_only',data_hash)
67
- else
68
- data_hash.each_key{|label|
69
- f=find_input(label)
70
- f.watir_element.set(data_hash[label])
71
- }
72
- end
73
- self
74
- end
75
-
76
- def fill_all(except_hash=nil)
77
- fill_elements(@elements,except_hash)
78
- self
79
- end
80
-
81
- def fill_required(except_hash=nil)
82
- fill_elements(@elements.select{|f| f.required},except_hash)
83
- self
84
- end
85
-
86
-
87
- private
88
- def find_input(label)
89
- label = label.to_sym
90
- index=@elements.collect(&:label).index(label)
91
- raise FormError.new('label not found','find_input',label) if index.nil?
92
- @elements[index]
93
- end
94
- def fill_elements(elements,except_hash)
95
- elements = @elements.clone
96
- if not except_hash.nil?
97
- if not except_hash.has_key?(:except)
98
- raise FormError.new('Invalid parameter, must be :except=>"label or [label1,label2,...]"',"fill_elements",elements.inspect,except_hash.inspect)
99
- else
100
- if except_hash[:except].is_a?(String) or except_hash[:except].is_a?(Symbol)
101
- elements.delete(find_input(except_hash[:except]))
102
- elsif except_hash[:except].is_a?(Array)
103
- except_hash[:except].each{|label|
104
- elements.delete(find_input(label))
105
- }
106
- else
107
- raise FormError.new('Invalid parameter',"fill_elements",elements.inspect,except_hash.inspect)
108
- end
109
- end
110
- end
111
- elements.select{|e| e.respond_to?(:set)}.each{|field|
112
- field.watir_element.when_present.set(field.default)
113
- }
114
- end
115
- end
116
-
@@ -1,8 +0,0 @@
1
- class Submitter
2
- attr_accessor :how_click_method, :click_params, :watir_element
3
- def initialize(how_click_method=:click,click_params=nil)
4
- @how_click_method=how_click_method
5
- @click_params=click_params
6
- @watir_element = nil
7
- end
8
- end
@@ -1,22 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'page_object_wrapper/version'
5
-
6
- Gem::Specification.new do |gem|
7
- gem.name = "page_object_wrapper"
8
- gem.version = PageObjectWrapper::VERSION
9
- gem.authors = ["Evgeniy Khatko"]
10
- gem.email = ["evgeniy.khatko@gmail.com"]
11
- gem.description = %q{Wraps watir-webdriver with convenient testing interface, based on PageObjects automation testing pattern. Simplifies resulting automated test understanding.}
12
- gem.summary = %q{Wraps watir-webdriver with convenient testing interface.}
13
- gem.homepage = "https://github.com/evgeniy-khatko/page_object_wrapper"
14
- gem.add_dependency "watir-webdriver"
15
- gem.add_development_dependency "rspec", ">= 2.0.0"
16
-
17
-
18
- gem.files = `git ls-files`.split($/)
19
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
21
- gem.require_paths = ["lib","lib/page_object_wrapper"]
22
- end
@@ -1,42 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Overall usage" do
4
- describe "Test Google for long search query" do
5
- let(:precondition){"Open google.com page"}
6
- let(:step1){"Enter long search query into the search field"}
7
- let(:step2){"Press search button"}
8
- let(:expected_result){"The requested URL /... is too large to process"}
9
-
10
- describe "Defining two page objects: GoogleSearchPage, GoogleErrorPage and performing test" do
11
- let(:pages_definition){
12
- class GoogleSearchPage < PageObjectWrapper::Page
13
- attr_accessor :find_form
14
- @url="/"
15
- expected_element :text_field, :name => 'q'
16
- def initialize visit=false
17
- super visit
18
- @find_form = form(GoogleErrorPage, {:action => '/search'})
19
- @find_form.editable(:text_field, {:name => 'q'}, :seach_what, '@find_form default value', true)
20
- end
21
- end
22
-
23
- class GoogleErrorPage < PageObjectWrapper::Page
24
- @url="really does not matter, because navigating to this page done through search query submission"
25
- #expected_element :ins, {:text => "That\’s an error."}
26
- end
27
- {:gsearch_page_class => GoogleSearchPage, :gerror_page => GoogleErrorPage}
28
- }
29
-
30
- it "performing test" do
31
- puts precondition
32
- google_page = pages_definition[:gsearch_page_class].new(true)
33
- puts step1
34
- long_query = 'q '*1000
35
- google_page.find_form.fill_only(:seach_what => long_query)
36
- puts step2
37
- google_error_page = google_page.find_form.submit(true)
38
- google_error_page.should have_text(expected_result)
39
- end
40
- end
41
- end
42
- end
@@ -1,176 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
- require 'spec_helper'
3
-
4
- describe "Form wrapper" do
5
- describe "form definition", :code => 6..30 do
6
- let(:page_objects){
7
- class GoogleAdvancedSearchPage < PageObjectWrapper::Page
8
- attr_accessor :as_form
9
- @url="/advanced_search"
10
- expected_element :text_field, :name => 'as_q'
11
- def initialize visit=false
12
- super visit
13
- @as_form = form(GoogleResultsPage, {:name => 'f'})
14
- @as_form.editable(:text_field, {:name => 'as_q'}, :with_words, 'with_words default value', true)
15
- @as_form.editable(:text_field, {:name => 'as_epq'}, :with_phrase, 'with_phrase default value', true)
16
- @as_form.editable(:text_field, {:name => 'as_oq'}, :with_any_word, 'with_any_word default value', false)
17
- @as_form.submitter(:input, {:type => 'submit'})
18
- end
19
- end
20
- class GoogleResultsPage < PageObjectWrapper::Page
21
- @url="/"
22
- expected_element :button, :name => 'btnG'
23
- def initialize visit=false
24
- super visit
25
- @find_form = form(GoogleResultsPage, {:action => '/search'})
26
- @find_form.editable(:text_field, {:name => 'q'}, :seach_what, '@find_form default value', true)
27
- end
28
- end
29
- {:gresults_page_class => GoogleResultsPage, :gadv_page_class => GoogleAdvancedSearchPage}
30
- }
31
-
32
-
33
- it "is defined as #form(TargetPage, how_find_hash)", :code => [13,25] do
34
- page_objects[:gadv_page_class].new(true).as_form.class.should eq(Form)
35
- end
36
-
37
- it "has #editable(:field_type, how_find_hash, :label, default_value, required?) method to set form's fields
38
- :field_type sets corresponding watir element type
39
- how_find_hash is used to locate corresponding watir element on the page
40
- :label is used to reffer to the form field after definition
41
- default_value is used to populate fields with default test data
42
- required = true | false and indicates if the field is required
43
- ", :code => 14..16 do
44
- gadv_page = page_objects[:gadv_page_class].new(true)
45
- gadv_page.as_form.with_words.tag_name.should eq('input')
46
- gadv_page.as_form.with_words.name.should eq('as_q')
47
- gadv_page.as_form.with_words.should be_a(Watir::TextField)
48
- end
49
-
50
- it "has #submitter(:field_type, how_find_hash, how_click_mehtod, click_params) method to set form's submitter
51
- :field_type sets corresponding watir element type
52
- how_find_hash is used to locate corresponding watir element on the page
53
- how_click_mehtod is used to tell Waitr the method which should be applied to click the submitter
54
- click_params set parameters for the how_click_mehtod
55
- ", :code => 17 do
56
- end
57
- end
58
- describe "form usage", :code => 59..84 do
59
- let(:page_objects){
60
- class GoogleAdvancedSearchPage < PageObjectWrapper::Page
61
- attr_accessor :as_form
62
- @url="/advanced_search"
63
- expected_element :text_field, :name => 'as_q'
64
- def initialize visit=false
65
- super visit
66
- @as_form = form(GoogleSearchPage, {:name => 'f'})
67
- @as_form.editable(:text_field, {:name => 'as_q'}, :with_words, 'with_words default value', true)
68
- @as_form.editable(:text_field, {:name => 'as_epq'}, :with_phrase, 'with_phrase default value', true)
69
- @as_form.editable(:text_field, {:name => 'as_oq'}, :with_any_word, 'with_any_word default value', false)
70
- @as_form.submitter(:input, {:type => 'submit'})
71
- end
72
- end
73
- class GoogleSearchPage < PageObjectWrapper::Page
74
- attr_accessor :find_form
75
- @url="/"
76
- expected_element :text_field, :name => 'q' # tells Watir that we expect this element which identifies the page in a uniq way
77
- def initialize visit=false
78
- super visit
79
- @find_form = form(GoogleSearchPage, {:action => '/search'})
80
- @find_form.editable(:text_field, {:name => 'q'}, :search_what, '@find_form default value', true)
81
- end
82
- end
83
- {:gsearch_page_class => GoogleSearchPage, :gadv_page_class => GoogleAdvancedSearchPage}
84
- }
85
-
86
- it "has #submit(flag) method which submits form
87
- if flag = true than TargetPage instance is returned
88
- if flag = false than CurrentPage instance is returned
89
- if submitter is defined, than it's used to submit the form, otherwise standart Watir::Form submit is used
90
- ", :code => 91..95 do
91
- gadv_page = page_objects[:gadv_page_class].new(true)
92
- gsearch_page = gadv_page.as_form.submit(true)
93
- gsearch_page.should be_a(GoogleSearchPage)
94
- gsearch_page_reloaded = gsearch_page.find_form.submit(false)
95
- gsearch_page_reloaded.should be_a(GoogleSearchPage)
96
- end
97
-
98
- it "field's watir elements can be accessed by labels", :code => 99..100 do
99
- gsearch_page = page_objects[:gsearch_page_class].new(true)
100
- gsearch_page.find_form.search_what.should be_a(Watir::TextField)
101
- end
102
-
103
- it "fields default values set during form definition can be retrieved with #default(:label) method", :code => 104..105 do
104
- gsearch_page = page_objects[:gsearch_page_class].new(true)
105
- gsearch_page.find_form.default(:search_what).should eq('@find_form default value')
106
- end
107
-
108
- it "has #each method which allows navigating between form fields", :code => 110..112 do
109
- gadv_page = page_objects[:gadv_page_class].new(true)
110
- gadv_page.as_form.each{|form_field|
111
- form_field.should be_a(Editable)
112
- form_field.watir_element.should be_a(Watir::TextField)
113
- }
114
- end
115
-
116
- it "has #each_required method which allows navigating between form required fields", :code => 118..122 do
117
- gadv_page = page_objects[:gadv_page_class].new(true)
118
- gadv_page.as_form.each_required{|form_field|
119
- form_field.should be_a(Editable)
120
- form_field.watir_element.should be_a(Watir::TextField)
121
- form_field.should be_required
122
- }
123
- end
124
-
125
- it "has #fill_only(:label => value) method which populated form's :label field with \'value\'
126
- method returns form object
127
- ", :code => 129..130 do
128
- gadv_page = page_objects[:gadv_page_class].new(true)
129
- form = gadv_page.as_form.fill_only(:with_words => 'some value')
130
- gadv_page.as_form.with_words.value.should eq('some value')
131
- form.should be_a(Form)
132
- end
133
-
134
- it "has #fill_all(:except => labels_array | label) method which populated all form's fields with default values
135
- if except_hash is not nil than provided fields are not populated
136
- method returns form object
137
- ", :code => 139..142 do
138
- gadv_page = page_objects[:gadv_page_class].new(true)
139
- form = gadv_page.as_form.fill_all
140
- gadv_page.as_form.each{|field|
141
- field.watir_element.value.should eq(gadv_page.as_form.default(field.label))
142
- }
143
- gadv_page = page_objects[:gadv_page_class].new(true)
144
- gadv_page.as_form.fill_all(:except => :with_words)
145
- gadv_page.as_form.each{|field|
146
- if field.label==:with_words
147
- field.watir_element.value.should eq ''
148
- else
149
- field.watir_element.value.should eq(gadv_page.as_form.default(field.label))
150
- end
151
- }
152
- form.should be_a(Form)
153
- end
154
-
155
- it "has #fill_required(:except => labels_array | label) method which populated all required form's fields with default values
156
- if except_hash is not nil than provided fields are not populated
157
- method returns form object
158
- ", :code => 165..172 do
159
- gadv_page = page_objects[:gadv_page_class].new(true)
160
- form = gadv_page.as_form.fill_required
161
- gadv_page.as_form.each_required{|field|
162
- field.watir_element.value.should eq(gadv_page.as_form.default(field.label))
163
- }
164
- gadv_page = page_objects[:gadv_page_class].new(true)
165
- gadv_page.as_form.fill_required(:except => :with_words)
166
- gadv_page.as_form.each_required{|field|
167
- if field.label==:with_words
168
- field.watir_element.value.should eq ''
169
- else
170
- field.watir_element.value.should eq(gadv_page.as_form.default(field.label))
171
- end
172
- }
173
- form.should be_a(Form)
174
- end
175
- end
176
- end