page_object_wrapper 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in page_object_wrapper.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 ekhatko
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -34,7 +34,9 @@ Or install it yourself as:
34
34
  - a label identifies the object
35
35
 
36
36
  Here in the structure of PageObjectWrapper:
37
- ![PageObjectWrapper scheme](page_object_wrapper/blob/master/img/scheme.png)
37
+ ![PageObjectWrapper scheme](https://raw.github.com/evgeniy-khatko/page_object_wrapper/master/img/scheme.png)
38
+
39
+ where required attributes are marked with (*)
38
40
 
39
41
  ### Examples
40
42
 
@@ -117,10 +119,25 @@ There is a directory, where we've defined a page\_object inside a \*\_page.rb fi
117
119
  - it's possible to define several page objects in one file
118
120
  - .open\_page method takes page label, directs browser to that page and returns corresponding page\_object
119
121
  - PageObjectWrapper.current\_page points to the opened page\_object
122
+ - it's possible to set page\_object locator in 2 different ways: specifying full url (like in example) or specifying PageObjectWrapper.domain and page\_object local path (like in specs)
123
+
124
+ #### page\_object.xxx
125
+ Defined elements can be accessed with their labels.
126
+ - element from an element\_set is corresponds to real Watir::Element
127
+ - elemets\_set corresponds to an Array of Watir::Element
128
+
129
+ *preconditions*
130
+ **tp** is a :some\_test\_page object opened in the browser
131
+
132
+ tp.tf # => Watir::TextField
133
+ tp.rb # => Watir::Radio
134
+ tp.test_elements # => Array of Watir elements
135
+
136
+
120
137
 
121
138
  #### feed\_xxx
122
139
  *preconditions*
123
- tp is a :some\_test\_page object opened in the browser
140
+ **tp** is a :some\_test\_page object opened in the browser
124
141
 
125
142
  context "argument = :fresh_food" do
126
143
  it "populates all xxx elements with :fresh_food" do
@@ -146,7 +163,7 @@ tp is a :some\_test\_page object opened in the browser
146
163
 
147
164
  #### fire\_xxx
148
165
  *preconditions*
149
- tp is a :some\_test\_page object opened in the browser
166
+ **tp** is a :some\_test\_page object opened in the browser
150
167
 
151
168
  it "executes fire_block in Watir::Browser context" do
152
169
  tp = PageObjectWrapper.open_page(:some_test_page)
@@ -165,7 +182,7 @@ tp is a :some\_test\_page object opened in the browser
165
182
 
166
183
  #### select\_from\_xxx
167
184
  *preconditions*
168
- tp is a :some\_test\_page object opened in the browser
185
+ **tp** is a :some\_test\_page object opened in the browser
169
186
  its syntax is close to SQL *'select column1 from page\_object.some\_table where column2 = string\_or\_regexp'*
170
187
  page\_object.select\_from\_xxx( :column1, :column2 => 'string\_or\_regexp' )
171
188
  correct arguments are:
@@ -213,8 +230,7 @@ TODO
213
230
  2. Create your feature branch (`git checkout -b my-new-feature`)
214
231
  3. Commit your changes (`git commit -am 'Add some feature'`)
215
232
  4. Push to the branch (`git push origin my-new-feature`)
216
- 5. Create new Pull Request
217
- page\_object\_wrapper
218
- ===================
233
+ 5. Create new Pull Request
219
234
 
235
+ ##page\_object\_wrapper
220
236
  Wraps watir-webdriver with convenient testing interface, based on PageObjects automation testing pattern. Simplifies resulting automated test understanding.
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -21,6 +21,8 @@ PageObjectWrapper.define_page('some_page_with_lost_of_errors') do
21
21
  action('',nil) do
22
22
  end
23
23
 
24
+ action_alias('',nil){ action 'unknown action'}
25
+
24
26
  table('') do
25
27
  end
26
28
  table(:some_table) do
@@ -38,6 +38,8 @@ PageObjectWrapper.define_page(:some_test_page) do
38
38
  textarea(:id => 'f2').set data
39
39
  end
40
40
 
41
+ action_alias(:fill_textarea_alias, :some_test_page){ action :fill_textarea }
42
+
41
43
  table(:table_without_header) do
42
44
  locator :summary => 'Each row names a Nordic country and specifies its total area and land area, in square kilometers'
43
45
  end
@@ -0,0 +1,12 @@
1
+ require 'Dsl'
2
+ class Alias < DslElement
3
+ attr_reader :next_page_value
4
+ dsl_attr_accessor :action
5
+
6
+ def initialize(label, next_page)
7
+ super label
8
+ @next_page_value = next_page
9
+ end
10
+ end
11
+
12
+
@@ -5,12 +5,13 @@ include PageObjectWrapper
5
5
  require 'ElementsSet'
6
6
  require 'Element'
7
7
  require 'Action'
8
+ require 'Alias'
8
9
  require 'Table'
9
10
  require 'Pagination'
10
11
  require 'known_elements'
11
12
 
12
13
  class PageObject < DslElementWithLocator
13
- attr_reader :esets, :elements, :actions, :tables, :paginations, :uniq_element_type, :uniq_element_hash
14
+ attr_reader :esets, :elements, :actions, :aliases, :tables, :paginations, :uniq_element_type, :uniq_element_hash
14
15
  @@browser = nil
15
16
  @@pages = []
16
17
  @@current_page = nil
@@ -30,6 +31,7 @@ class PageObject < DslElementWithLocator
30
31
  @esets = []
31
32
  @elements = []
32
33
  @actions = []
34
+ @aliases = []
33
35
  @tables = []
34
36
  @paginations = []
35
37
  end
@@ -60,6 +62,10 @@ class PageObject < DslElementWithLocator
60
62
  # page_object.fire_some_action
61
63
  a = action_for($1)
62
64
  fire_action(a, *args)
65
+ when (FIRE_ACTION.match(method_name) and has_alias?($1))
66
+ # page_object.fire_some_action
67
+ a = alias_for($1)
68
+ fire_action(a, *args)
63
69
  when (SELECT_FROM.match(method_name) and has_table?($1))
64
70
  # page_object.select_from_some_table(:header_column, {:column => 'value'})
65
71
  table = table_for($1)
@@ -99,6 +105,9 @@ class PageObject < DslElementWithLocator
99
105
  when (FIRE_ACTION.match(method_name) and has_action?($1))
100
106
  # page_object.fire_some_action
101
107
  true
108
+ when (FIRE_ACTION.match(method_name) and has_alias?($1))
109
+ # page_object.fire_some_action
110
+ true
102
111
  when (SELECT_FROM.match(method_name) and has_table?($1))
103
112
  # page_object.select_from_some_table(:header_column, {:column => 'value'})
104
113
  true
@@ -162,6 +171,13 @@ class PageObject < DslElementWithLocator
162
171
  a
163
172
  end
164
173
 
174
+ def action_alias(label, next_page, &block)
175
+ a = Alias.new(label, next_page)
176
+ a.instance_eval(&block)
177
+ @aliases << a
178
+ a
179
+ end
180
+
165
181
  def table(label, &block)
166
182
  t = Table.new(label)
167
183
  t.instance_eval(&block)
@@ -208,6 +224,16 @@ class PageObject < DslElementWithLocator
208
224
  action_output.unshift "action(#{a.label_value.inspect}):\n" if not action_output.empty?
209
225
  output += action_output
210
226
  }
227
+ @aliases.each{|a|
228
+ alias_output = []
229
+ alias_output << "\talias #{a.label_value.inspect} already defined\n" if labeled(@aliases).count(a.label_value) > 1
230
+ alias_output << "\tlabel #{a.label_value.inspect} not a Symbol\n" if not a.label_value.is_a?(Symbol)
231
+ alias_output << "\tnext_page #{a.next_page_value.inspect} not a Symbol\n" if not a.next_page_value.is_a? Symbol
232
+ alias_output << "\tnext_page #{a.next_page_value.inspect} unknown page_object\n" if not labeled(@@pages).include?(a.next_page_value)
233
+ alias_output << "\taction #{a.action_value.inspect} not known Action\n" if not labeled(@actions).include? a.action_value
234
+ alias_output.unshift "alias(#{a.label_value.inspect}):\n" if not alias_output.empty?
235
+ output += alias_output
236
+ }
211
237
  @tables.each{|t|
212
238
  table_output = []
213
239
  table_output << "\ttable #{t.label_value.inspect} already defined\n" if labeled(@tables).count(t.label_value) > 1
@@ -280,7 +306,8 @@ private
280
306
 
281
307
  def fire_action(a, *args)
282
308
  raise PageObjectWrapper::BrowserNotFound if @@browser.nil?
283
- @@browser.instance_exec args, &a.fire_block_value
309
+ block = (a.is_a? Action)? a.fire_block_value : action_for(a.action_value).fire_block_value
310
+ @@browser.instance_exec args, &block
284
311
  self.class.map_current_page a.next_page_value
285
312
  @@current_page
286
313
  end
@@ -349,6 +376,10 @@ private
349
376
  labeled(@actions).include?(label.to_sym)
350
377
  end
351
378
 
379
+ def has_alias?(label)
380
+ labeled(@aliases).include?(label.to_sym)
381
+ end
382
+
352
383
  def eset_for(label)
353
384
  @esets[labeled(@esets).index(label.to_sym)]
354
385
  end
@@ -368,4 +399,8 @@ private
368
399
  def action_for(label)
369
400
  @actions[labeled(@actions).index(label.to_sym)]
370
401
  end
402
+
403
+ def alias_for(label)
404
+ @aliases[labeled(@aliases).index(label.to_sym)]
405
+ end
371
406
  end
@@ -1,3 +1,3 @@
1
1
  module PageObjectWrapper
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -0,0 +1,22 @@
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
@@ -39,6 +39,9 @@ describe "define_page_object" do
39
39
  specify { subject.actions.collect(&:label_value).should include(:press_cool_button)}
40
40
  it { should respond_to(:fire_press_cool_button) }
41
41
 
42
+ specify { subject.aliases.collect(&:label_value).should include(:fill_textarea_alias)}
43
+ it { should respond_to(:fire_fill_textarea_alias) }
44
+
42
45
  specify { subject.tables.collect(&:label_value).should include(:table_without_header)}
43
46
  it { should respond_to(:select_from_table_without_header) }
44
47
  it { should respond_to(:select_from_table_with_header) }
@@ -101,7 +104,7 @@ describe "define_page_object" do
101
104
  it_should_behave_like "a label"
102
105
  end
103
106
 
104
- describe "action next_page" do
107
+ describe "action attributes" do
105
108
  it { should respond_to(:next_page_value) }
106
109
  it { should respond_to(:fire_block_value) }
107
110
 
@@ -110,6 +113,24 @@ describe "define_page_object" do
110
113
  end
111
114
  end
112
115
 
116
+ context "action alias" do
117
+ subject { page_object.aliases[page_object.aliases.collect(&:label_value).index(:fill_textarea_alias)] }
118
+
119
+ it { should be_a(Alias) }
120
+
121
+ describe "alias label" do
122
+ it_should_behave_like "a label"
123
+ end
124
+
125
+ describe "alias attributes" do
126
+ it { should respond_to(:next_page_value) }
127
+ it { should respond_to(:action_value) }
128
+
129
+ its(:next_page_value){ should eq :some_test_page }
130
+ its(:action_value) { should eq :fill_textarea }
131
+ end
132
+ end
133
+
113
134
  context "table" do
114
135
  subject { page_object.tables[page_object.tables.collect(&:label_value).index(:table_without_header)] }
115
136
 
@@ -17,25 +17,22 @@ describe "page_object.fire_xxx" do
17
17
  before(:all){
18
18
  @b = Watir::Browser.new
19
19
  PageObjectWrapper.use_browser @b
20
- begin
21
20
  PageObjectWrapper.load('./good_pages')
22
- rescue
23
- end
24
21
  }
25
22
  after(:all){ PageObjectWrapper.browser.close }
26
23
 
24
+ it "executes fire_block in Watir::Browser context" do
25
+ tp = PageObjectWrapper.open_page(:some_test_page)
26
+ tp.fire_fill_textarea
27
+ @b.textarea(:id => 'f2').value.should eq('Default data')
28
+ end
29
+
27
30
  context "xxx not found among current_page actions" do
28
31
  it "raises NoMethodError" do
29
32
  tp = PageObjectWrapper.current_page
30
33
  expect{tp.fire_nonexistent_action}.to raise_error(NoMethodError)
31
34
  end
32
35
  end
33
-
34
- it "executes fire_block in Watir::Browser context" do
35
- tp = PageObjectWrapper.open_page(:some_test_page)
36
- tp.fire_fill_textarea
37
- @b.textarea(:id => 'f2').value.should eq('Default data')
38
- end
39
36
 
40
37
  it "can be invoked with parameters" do
41
38
  tp = PageObjectWrapper.current_page
@@ -43,11 +40,20 @@ describe "page_object.fire_xxx" do
43
40
  @b.textarea(:id => 'f2').value.should eq('User defined data')
44
41
  end
45
42
 
43
+ context "xxx is alias" do
44
+ it "executes corresponding action" do
45
+ tp = PageObjectWrapper.open_page(:some_test_page)
46
+ tp.fire_fill_textarea_alias
47
+ @b.textarea(:id => 'f2').value.should eq('Default data')
48
+ end
49
+ end
50
+
46
51
  it "returns next_page" do
47
52
  tp = PageObjectWrapper.current_page
48
53
  np = tp.fire_press_cool_button
49
54
  np.should be_a(PageObject)
50
55
  np.label_value.should eq(:test_page_with_table)
51
56
  end
57
+
52
58
  end
53
59
  end
@@ -30,6 +30,11 @@ action(""):
30
30
  label "" not a Symbol
31
31
  next_page nil not a Symbol
32
32
  next_page nil unknown page_object
33
+ alias(""):
34
+ label "" not a Symbol
35
+ next_page nil not a Symbol
36
+ next_page nil unknown page_object
37
+ action "unknown action" not known Action
33
38
  table(""):
34
39
  label "" not a Symbol
35
40
  locator nil not a meaningful Hash
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: page_object_wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-19 00:00:00.000000000 Z
12
+ date: 2012-12-19 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: watir-webdriver
16
- requirement: &11659160 !ruby/object:Gem::Requirement
16
+ requirement: &5265420 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *11659160
24
+ version_requirements: *5265420
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &11658620 !ruby/object:Gem::Requirement
27
+ requirement: &5243480 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: 2.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *11658620
35
+ version_requirements: *5243480
36
36
  description: Wraps watir-webdriver with convenient testing interface, based on PageObjects
37
37
  automation testing pattern. Simplifies resulting automated test understanding.
38
38
  email:
@@ -42,7 +42,10 @@ extensions: []
42
42
  extra_rdoc_files: []
43
43
  files:
44
44
  - .gitignore
45
+ - Gemfile
46
+ - LICENSE.txt
45
47
  - README.md
48
+ - Rakefile
46
49
  - bad_pages/bad_page.rb
47
50
  - good_pages/another_test_page.rb
48
51
  - good_pages/some_test_page.rb
@@ -50,6 +53,7 @@ files:
50
53
  - img/scheme.png
51
54
  - lib/page_object_wrapper.rb
52
55
  - lib/page_object_wrapper/Action.rb
56
+ - lib/page_object_wrapper/Alias.rb
53
57
  - lib/page_object_wrapper/Dsl.rb
54
58
  - lib/page_object_wrapper/Element.rb
55
59
  - lib/page_object_wrapper/ElementsSet.rb
@@ -59,6 +63,7 @@ files:
59
63
  - lib/page_object_wrapper/Table.rb
60
64
  - lib/page_object_wrapper/known_elements.rb
61
65
  - lib/page_object_wrapper/version.rb
66
+ - page_object_wrapper.gemspec
62
67
  - spec/define_page_object_spec.rb
63
68
  - spec/defined_elements_spec.rb
64
69
  - spec/feed_elements_spec.rb