page-object 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. data/ChangeLog +10 -1
  2. data/Gemfile +3 -0
  3. data/README.md +2 -2
  4. data/cucumber.yml +2 -0
  5. data/features/element.feature +81 -8
  6. data/features/form.feature +28 -0
  7. data/features/hidden_field.feature +32 -0
  8. data/features/html/static_elements.html +26 -0
  9. data/features/list_item.feature +36 -0
  10. data/features/ordered_list.feature +39 -0
  11. data/features/step_definitions/accessor_steps.rb +71 -0
  12. data/features/step_definitions/element_steps.rb +23 -0
  13. data/features/support/page.rb +43 -0
  14. data/features/text_area.feature +32 -0
  15. data/features/text_field.feature +1 -2
  16. data/features/unordered_list.feature +39 -0
  17. data/lib/page-object.rb +48 -3
  18. data/lib/page-object/accessors.rb +282 -111
  19. data/lib/page-object/elements.rb +6 -0
  20. data/lib/page-object/elements/element.rb +5 -1
  21. data/lib/page-object/elements/form.rb +25 -0
  22. data/lib/page-object/elements/hidden_field.rb +28 -0
  23. data/lib/page-object/elements/list_item.rb +7 -0
  24. data/lib/page-object/elements/ordered_list.rb +31 -0
  25. data/lib/page-object/elements/text_area.rb +24 -0
  26. data/lib/page-object/elements/text_field.rb +1 -1
  27. data/lib/page-object/elements/unordered_list.rb +31 -0
  28. data/lib/page-object/platforms/selenium_button.rb +1 -1
  29. data/lib/page-object/platforms/selenium_element.rb +3 -0
  30. data/lib/page-object/platforms/selenium_form.rb +14 -0
  31. data/lib/page-object/platforms/selenium_image.rb +6 -2
  32. data/lib/page-object/platforms/selenium_ordered_list.rb +18 -0
  33. data/lib/page-object/platforms/selenium_unordered_list.rb +18 -0
  34. data/lib/page-object/platforms/watir_element.rb +3 -0
  35. data/lib/page-object/platforms/watir_form.rb +14 -0
  36. data/lib/page-object/platforms/watir_ordered_list.rb +18 -0
  37. data/lib/page-object/platforms/watir_unordered_list.rb +18 -0
  38. data/lib/page-object/selenium_page_object.rb +101 -0
  39. data/lib/page-object/version.rb +2 -1
  40. data/lib/page-object/watir_page_object.rb +103 -2
  41. data/spec/page-object/accessors_spec.rb +203 -2
  42. data/spec/page-object/elements/form_spec.rb +24 -0
  43. data/spec/page-object/elements/hidden_field_spec.rb +32 -0
  44. data/spec/page-object/elements/list_item_spec.rb +22 -0
  45. data/spec/page-object/elements/ordered_list_spec.rb +43 -0
  46. data/spec/page-object/elements/text_area_spec.rb +32 -0
  47. data/spec/page-object/elements/text_field_spec.rb +1 -1
  48. data/spec/page-object/elements/unordered_list_spec.rb +43 -0
  49. metadata +39 -5
@@ -12,3 +12,9 @@ require 'page-object/elements/table_cell'
12
12
  require 'page-object/elements/table_row'
13
13
  require 'page-object/elements/span'
14
14
  require 'page-object/elements/image'
15
+ require 'page-object/elements/hidden_field'
16
+ require 'page-object/elements/form'
17
+ require 'page-object/elements/text_area'
18
+ require 'page-object/elements/list_item'
19
+ require 'page-object/elements/unordered_list'
20
+ require 'page-object/elements/ordered_list'
@@ -1,10 +1,12 @@
1
1
 
2
2
  module PageObject
3
3
  module Elements
4
-
5
4
  #
6
5
  # Contains functionality that is common across all elements.
7
6
  #
7
+ # @see PageObject::Platforms::WatirElement for the Watir version of all common methods
8
+ # @see PageObject::Platforms::SeleniumElement for the Selenium version of all common methods
9
+ #
8
10
  class Element
9
11
  attr_reader :element
10
12
 
@@ -13,10 +15,12 @@ module PageObject
13
15
  include_platform_for platform
14
16
  end
15
17
 
18
+ # @private
16
19
  def self.watir_identifier_for identifier
17
20
  identifier_for identifier, watir_finders, watir_mapping
18
21
  end
19
22
 
23
+ # @private
20
24
  def self.selenium_identifier_for identifier
21
25
  identifier = identifier_for identifier, selenium_finders, selenium_mapping
22
26
  return identifier.keys.first, identifier.values.first
@@ -0,0 +1,25 @@
1
+ module PageObject
2
+ module Elements
3
+ class Form < Element
4
+ def initialize(element, platform)
5
+ @element = element
6
+ include_platform_for platform
7
+ end
8
+
9
+ protected
10
+
11
+ def include_platform_for platform
12
+ super
13
+ if platform[:platform] == :watir
14
+ require 'page-object/platforms/watir_form'
15
+ self.class.send :include, PageObject::Platforms::WatirForm
16
+ elsif platform[:platform] == :selenium
17
+ require 'page-object/platforms/selenium_form'
18
+ self.class.send :include, PageObject::Platforms::SeleniumForm
19
+ else
20
+ raise ArgumentError, "expect platform to be :watir or :selenium"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ module PageObject
2
+ module Elements
3
+ class HiddenField < Element
4
+
5
+ def click
6
+ raise "click is not available on hidden field element with Selenium or Watir"
7
+ end
8
+
9
+ protected
10
+
11
+ def self.watir_finders
12
+ super + [:tag_name, :text]
13
+ end
14
+
15
+ def self.watir_mapping
16
+ super.merge({:css => :tag_name})
17
+ end
18
+
19
+ def self.selenium_finders
20
+ super + [:css]
21
+ end
22
+
23
+ def self.selenium_mapping
24
+ super.merge({:tag_name => :css})
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,7 @@
1
+ module PageObject
2
+ module Elements
3
+ class ListItem < Element
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ module PageObject
2
+ module Elements
3
+ class OrderedList < Element
4
+
5
+ def initialize(element, platform)
6
+ @element = element
7
+ include_platform_for platform
8
+ end
9
+
10
+ protected
11
+
12
+ def self.watir_finders
13
+ [:class, :id, :index, :xpath]
14
+ end
15
+
16
+ def include_platform_for platform
17
+ super
18
+ if platform[:platform] == :watir
19
+ require 'page-object/platforms/watir_ordered_list'
20
+ self.class.send :include, PageObject::Platforms::WatirOrderedList
21
+ elsif platform[:platform] == :selenium
22
+ require 'page-object/platforms/selenium_ordered_list'
23
+ self.class.send :include, PageObject::Platforms::SeleniumOrderedList
24
+ else
25
+ raise ArgumentError, "expect platform to be :watir or :selenium"
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,24 @@
1
+ module PageObject
2
+ module Elements
3
+ class TextArea < Element
4
+
5
+ protected
6
+
7
+ def self.watir_finders
8
+ super + [:tag_name]
9
+ end
10
+
11
+ def self.watir_mapping
12
+ super.merge({:css => :tag_name})
13
+ end
14
+
15
+ def self.selenium_finders
16
+ super + [:css]
17
+ end
18
+
19
+ def self.selenium_mapping
20
+ super.merge({:tag_name => :css})
21
+ end
22
+ end
23
+ end
24
+ end
@@ -5,7 +5,7 @@ module PageObject
5
5
  protected
6
6
 
7
7
  def self.watir_finders
8
- super + [:tag_name, :text, :value]
8
+ super + [:tag_name]
9
9
  end
10
10
 
11
11
  def self.watir_mapping
@@ -0,0 +1,31 @@
1
+ module PageObject
2
+ module Elements
3
+ class UnorderedList < Element
4
+
5
+ def initialize(element, platform)
6
+ @element = element
7
+ include_platform_for platform
8
+ end
9
+
10
+ protected
11
+
12
+ def self.watir_finders
13
+ [:class, :id, :index, :xpath]
14
+ end
15
+
16
+ def include_platform_for platform
17
+ super
18
+ if platform[:platform] == :watir
19
+ require 'page-object/platforms/watir_unordered_list'
20
+ self.class.send :include, PageObject::Platforms::WatirUnorderedList
21
+ elsif platform[:platform] == :selenium
22
+ require 'page-object/platforms/selenium_unordered_list'
23
+ self.class.send :include, PageObject::Platforms::SeleniumUnorderedList
24
+ else
25
+ raise ArgumentError, "expect platform to be :watir or :selenium"
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -6,7 +6,7 @@ module PageObject
6
6
  # #text does not reliabably return a value in Selenium
7
7
  #
8
8
  def text
9
- raise "value not available on link element with Selenium"
9
+ raise "text is not available on button element in Selenium"
10
10
  end
11
11
  end
12
12
  end
@@ -1,6 +1,9 @@
1
1
 
2
2
  module PageObject
3
3
  module Platforms
4
+ #
5
+ # Selenium implementation of the common functionality found across all elements
6
+ #
4
7
  module SeleniumElement
5
8
 
6
9
  #
@@ -0,0 +1,14 @@
1
+ module PageObject
2
+ module Platforms
3
+ module SeleniumForm
4
+
5
+ #
6
+ # Submit the form.
7
+ #
8
+ def submit
9
+ @element.submit
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -6,7 +6,6 @@ module PageObject
6
6
  # Return the width of the image.
7
7
  #
8
8
  def width
9
- dimension = @element.size
10
9
  dimension.width
11
10
  end
12
11
 
@@ -14,9 +13,14 @@ module PageObject
14
13
  # Return the height of the image
15
14
  #
16
15
  def height
17
- dimension = @element.size
18
16
  dimension.height
19
17
  end
18
+
19
+ private
20
+
21
+ def dimension
22
+ @element.size
23
+ end
20
24
  end
21
25
  end
22
26
  end
@@ -0,0 +1,18 @@
1
+ module PageObject
2
+ module Platforms
3
+ module SeleniumOrderedList
4
+
5
+ #
6
+ # Return the PageObject::Elements::ListItem for the index provided. Index
7
+ # is zero based.
8
+ #
9
+ # @return [PageObject::Elements::ListItem]
10
+ #
11
+ def [](idx)
12
+ element = @element.find_element(:xpath, ".//li[#{idx+1}]")
13
+ PageObject::Elements::ListItem.new(element, :platform => :selenium)
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module PageObject
2
+ module Platforms
3
+ module SeleniumUnorderedList
4
+
5
+ #
6
+ # Return the PageObject::Elements::ListItem for the index provided. Index
7
+ # is zero based.
8
+ #
9
+ # @return [PageObject::Elements::ListItem]
10
+ #
11
+ def [](idx)
12
+ element = @element.find_element(:xpath, ".//li[#{idx+1}]")
13
+ PageObject::Elements::ListItem.new(element, :platform => :selenium)
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -1,6 +1,9 @@
1
1
 
2
2
  module PageObject
3
3
  module Platforms
4
+ #
5
+ # Watir implementation of the common functionality found across all elements
6
+ #
4
7
  module WatirElement
5
8
 
6
9
  #
@@ -0,0 +1,14 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirForm
4
+
5
+ #
6
+ # Submit the form.
7
+ #
8
+ def submit
9
+ @element.submit
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirOrderedList
4
+
5
+ #
6
+ # Return the PageObject::Elements::ListItem for the index provided. Index
7
+ # is zero based.
8
+ #
9
+ # @return [PageObject::Elements::ListItem]
10
+ #
11
+ def [](idx)
12
+ element = @element.wd.find_element(:xpath, ".//li[#{idx+1}]")
13
+ PageObject::Elements::ListItem.new(element, :platform => :watir)
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirUnorderedList
4
+
5
+ #
6
+ # Return the PageObject::Elements::ListItem for the index provided. Index
7
+ # is zero based.
8
+ #
9
+ # @return [PageObject::Elements::ListItem]
10
+ #
11
+ def [](idx)
12
+ element = @element.wd.find_element(:xpath, ".//li[#{idx+1}]")
13
+ PageObject::Elements::ListItem.new(element, :platform => :watir)
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -1,6 +1,11 @@
1
1
  require 'page-object/elements'
2
2
 
3
3
  module PageObject
4
+ #
5
+ # Selenium implementation of the page object platform driver. You should not use the
6
+ # class directly. Instead you should include the PageObject module in your page object
7
+ # and use the methods dynamically added from the PageObject::Accessors module.
8
+ #
4
9
  class SeleniumPageObject
5
10
  def initialize(browser)
6
11
  @browser = browser
@@ -66,6 +71,53 @@ module PageObject
66
71
  PageObject::Elements::TextField.new(element, :platform => :selenium)
67
72
  end
68
73
 
74
+ #
75
+ # platform method to get the value stored in a hidden field
76
+ # See PageObject::Accessors#hidden_field
77
+ #
78
+ def hidden_field_value_for(identifier)
79
+ how, what = Elements::HiddenField.selenium_identifier_for identifier
80
+ @browser.find_element(how, what).attribute('value')
81
+ end
82
+
83
+ #
84
+ # platform method to retrieve a hidden field element
85
+ # See PageObject::Accessors#hidden_field
86
+ #
87
+ def hidden_field_for(identifier)
88
+ how, what = Elements::HiddenField.selenium_identifier_for identifier
89
+ element = @browser.find_element(how, what)
90
+ Elements::HiddenField.new(element, :platform => :selenium)
91
+ end
92
+
93
+ #
94
+ # platform method to set text in a textarea
95
+ # See PageObject::Accessors#text_area
96
+ #
97
+ def text_area_value_set(identifier, value)
98
+ how, what = Elements::TextArea.selenium_identifier_for identifier
99
+ @browser.find_element(how, what).send_keys(value)
100
+ end
101
+
102
+ #
103
+ # platform method to get the text from a textarea
104
+ # See PageObject::Accessors#text_area
105
+ #
106
+ def text_area_value_for(identifier)
107
+ how, what = Elements::TextArea.selenium_identifier_for identifier
108
+ @browser.find_element(how, what).attribute('value')
109
+ end
110
+
111
+ #
112
+ # platform method to get the text area element
113
+ # See PageObject::Accessors#text_area
114
+ #
115
+ def text_area_for(identifier)
116
+ how, what = Elements::TextArea.selenium_identifier_for identifier
117
+ element = @browser.find_element(how, what)
118
+ Elements::TextArea.new(element, :platform => :selenium)
119
+ end
120
+
69
121
  #
70
122
  # platform method to get the currently selected value from a select list
71
123
  # See PageObject::Accessors#select_list
@@ -282,5 +334,54 @@ module PageObject
282
334
  element = @browser.find_element(how, what)
283
335
  PageObject::Elements::Image.new(element, :platform => :selenium)
284
336
  end
337
+
338
+ #
339
+ # platform method to retrieve a form element
340
+ # See PageObject::Accessors#form
341
+ #
342
+ def form_for(identifier)
343
+ how, what = Elements::Form.selenium_identifier_for identifier
344
+ element = @browser.find_element(how, what)
345
+ PageObject::Elements::Form.new(element, :platform => :selenium)
346
+ end
347
+
348
+ #
349
+ # platform method to retrieve the text from a list item
350
+ # See PageObject::Accessors#list_item
351
+ #
352
+ def list_item_text_for(identifier)
353
+ how, what = Elements::ListItem.selenium_identifier_for identifier
354
+ @browser.find_element(how, what).text
355
+ end
356
+
357
+ #
358
+ # platform method to retrieve a list item element
359
+ # See PageObject::Accessors#list_item
360
+ #
361
+ def list_item_for(identifier)
362
+ how, what = Elements::ListItem.selenium_identifier_for identifier
363
+ element = @browser.find_element(how, what)
364
+ PageObject::Elements::ListItem.new(element, :platform => :selenium)
365
+ end
366
+
367
+ #
368
+ # platform method to retrieve an unordered list element
369
+ # See PageObject::Accessors#unordered_list
370
+ #
371
+ def unordered_list_for(identifier)
372
+ how, what = Elements::UnorderedList.selenium_identifier_for identifier
373
+ element = @browser.find_element(how, what)
374
+ PageObject::Elements::UnorderedList.new(element, :platform => :selenium)
375
+ end
376
+
377
+ #
378
+ # platform method to retrieve an ordered list element
379
+ # See PageObject::Accessors#ordered_list
380
+ #
381
+ def ordered_list_for(identifier)
382
+ how, what = Elements::OrderedList.selenium_identifier_for identifier
383
+ element = @browser.find_element(how, what)
384
+ PageObject::Elements::OrderedList.new(element, :platform => :selenium)
385
+ end
285
386
  end
286
387
  end