page-object 0.7.1 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. data/ChangeLog +9 -0
  2. data/Guardfile +1 -1
  3. data/README.md +2 -0
  4. data/cucumber.yml +1 -1
  5. data/features/audio.feature +50 -0
  6. data/features/canvas.feature +36 -0
  7. data/features/html/static_elements.html +35 -0
  8. data/features/list_item.feature +1 -0
  9. data/features/step_definitions/audio_steps.rb +27 -0
  10. data/features/step_definitions/canvas_steps.rb +15 -0
  11. data/features/step_definitions/element_steps.rb +12 -0
  12. data/features/support/page.rb +18 -0
  13. data/features/table.feature +8 -0
  14. data/lib/page-object/accessors.rb +59 -0
  15. data/lib/page-object/element_locators.rb +60 -0
  16. data/lib/page-object/elements.rb +3 -0
  17. data/lib/page-object/elements/audio.rb +31 -0
  18. data/lib/page-object/elements/canvas.rb +23 -0
  19. data/lib/page-object/elements/element.rb +1 -1
  20. data/lib/page-object/elements/list_item.rb +9 -0
  21. data/lib/page-object/nested_elements.rb +24 -0
  22. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +29 -1
  23. data/lib/page-object/platforms/selenium_webdriver/table_row.rb +2 -1
  24. data/lib/page-object/platforms/watir_webdriver/page_object.rb +28 -0
  25. data/lib/page-object/platforms/watir_webdriver/table_row.rb +1 -0
  26. data/lib/page-object/version.rb +1 -1
  27. data/page-object.gemspec +1 -1
  28. data/spec/page-object/element_locators_spec.rb +132 -0
  29. data/spec/page-object/elements/canvas_spec.rb +40 -0
  30. data/spec/page-object/elements/list_item_spec.rb +2 -2
  31. data/spec/page-object/selenium_accessors_spec.rb +62 -1
  32. data/spec/page-object/watir_accessors_spec.rb +61 -0
  33. metadata +18 -6
data/ChangeLog CHANGED
@@ -1,3 +1,12 @@
1
+ === Version 0.7.2 / 2012-8-1
2
+ * Enhancements
3
+ * Added ability to find list_item by :text
4
+ * Added support for the following new elements
5
+ Canvas
6
+ Audio
7
+ * Updated to use selenium-webdriver 2.25.0
8
+ * Updated to provide better support for table_row.find_index_by_title when tables have theads... (George Shakhnazaryan)
9
+
1
10
  === Version 0.7.1 / 2012-7-15
2
11
  * Enhancements
3
12
  * Added support for the following new elements
data/Guardfile CHANGED
@@ -11,7 +11,7 @@ guard 'rspec', :cli => '--color --format Fuubar' do
11
11
  watch('spec/spec_helper.rb') { "spec" }
12
12
  end
13
13
 
14
- guard 'cucumber', :notification => true, :all_after_pass => false, :all_on_start => false, :cli => '--profile focus' do
14
+ guard 'cucumber', :notification => true, :all_after_pass => false, :cli => '--profile focus' do
15
15
  watch(%r{^features/.+\.feature$})
16
16
  watch(%r{^features/support/.+$}) { "features" }
17
17
  watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
data/README.md CHANGED
@@ -15,6 +15,8 @@ To see the changes from release to release please look at the [ChangeLog](https:
15
15
 
16
16
  To read about the motivation for this gem please read this [blog entry](http://www.cheezyworld.com/2010/11/19/ui-tests-introducing-a-simple-dsl/)
17
17
 
18
+ There is a book that describes in detail how to use this gem and others to create a complete view of testing web and other types of applications. The book is named [Cucumber & Cheese](http://leanpub.com/cucumber_and_cheese)
19
+
18
20
  ## Support
19
21
 
20
22
  If you need help using the page-object gem please ask your questions on [Stack Overflow](http://stackoverflow.com). Please be sure to use the [page-object-gem](http://stackoverflow.com/questions/tagged/page-object-gem) tag. If you wish to report an issue or request a new feature use the [github issue tracking page](http://github.com/cheezy/page-object/issues).
@@ -5,5 +5,5 @@ std_opts = "--no-source --color --format Cucumber::Formatter::Fuubar"
5
5
  default: DRIVER=WATIR <%= std_opts %> --tags ~@selenium_only
6
6
  watir: DRIVER=WATIR <%= std_opts %> --tags ~@selenium_only
7
7
  selenium: DRIVER=SELENIUM <%= std_opts %> --tags ~@watir_only
8
- focus: DRIVER=SELENIUM <%= std_opts %> --tags ~@watir_only --tags @focus
8
+ focus: DRIVER=WATIR <%= std_opts %> --tags ~@selenium_only --tags @focus
9
9
 
@@ -0,0 +1,50 @@
1
+ Feature: Support for the audio element
2
+
3
+ Background:
4
+ Given I am on the static elements page
5
+
6
+ Scenario: finding an audio element
7
+ When I retrieve the audio element
8
+ Then I should know it exists
9
+ And I should know it is visible
10
+
11
+ Scenario Outline: Locating an audio element on the page
12
+ When I search for the audio element by "<search_by>"
13
+ Then I should know it is visible
14
+
15
+ Examples:
16
+ | search_by |
17
+ | id |
18
+ | class |
19
+ | name |
20
+ | xpath |
21
+ | index |
22
+
23
+ Scenario Outline: Locating audios using multiple parameters
24
+ When I search for the audio element by "<param1>" and "<param2>"
25
+ Then I should know it is visible
26
+
27
+ Examples:
28
+ | param1 | param2 |
29
+ | class | index |
30
+ | name | index |
31
+
32
+ Scenario: Should know if it is autoplay
33
+ When I retrieve the audio element
34
+ Then I should know the audio is not autoplay
35
+
36
+ Scenario: Should know if the controls are displayed
37
+ When I retrieve the audio element
38
+ Then I should know that the controls are displayed
39
+
40
+ Scenario: Should know if it is paused
41
+ When I retrieve the audio element
42
+ Then I should know that the audio is paused
43
+
44
+ Scenario: Should know its duration
45
+ When I retrieve the audio element
46
+ Then I should know that the duration is greater than 74 seconds
47
+
48
+ Scenario: Should know its volume
49
+ When I retrieve the audio element
50
+ Then I should know that its volume is 1
@@ -0,0 +1,36 @@
1
+ Feature: Support for the canvas element
2
+
3
+ Background:
4
+ Given I am on the static elements page
5
+
6
+ Scenario: Retrieve a canvas element
7
+ When I retrieve the canvas element
8
+ Then I should know it exists
9
+ And I should know it is visible
10
+
11
+ Scenario Outline: Locating a canvas on the page
12
+ When I search for the canvas by "<search_by>"
13
+ Then I should know it is visible
14
+
15
+ Examples:
16
+ | search_by |
17
+ | id |
18
+ | class |
19
+ | name |
20
+ | xpath |
21
+ | index |
22
+
23
+ Scenario: Determining the width and height of the canvas
24
+ When I retrieve the canvas element
25
+ Then I should see that the canvas width is "200"
26
+ And I should see that the canvas height is "100"
27
+
28
+ Scenario Outline: Locating canvases using multiple parameters
29
+ When I search for the canvas element by "<param1>" and "<param2>"
30
+ Then I should know it is visible
31
+
32
+ Scenarios:
33
+ | param1 | param2 |
34
+ | class | index |
35
+ | name | index |
36
+
@@ -31,6 +31,22 @@
31
31
  <area shape="circle" coords="90,58,3" href="mercur.html"/>
32
32
  <area shape="circle" coords="124,58,8" href="venus.html"/>
33
33
  </map>
34
+
35
+ <canvas id="canvas" name="canvas" class="canvas" width="200" height="100"></canvas>
36
+ <script type="text/javascript">
37
+ var c=document.getElementById("myCanvas");
38
+ var ctx=c.getContext("2d");
39
+ ctx.fillStyle="#FF0000";
40
+ ctx.fillRect(0,0,150,75);
41
+ </script>
42
+
43
+ <audio controls id="audio" name="audio" class="audio">
44
+ <source src="http://media.w3.org/2010/07/bunny/04-Death_Becomes_Fur.mp4"
45
+ type='audio/mp4'>
46
+ <source src="http://media.w3.org/2010/07/bunny/04-Death_Becomes_Fur.oga"
47
+ type='audio/ogg; codecs=vorbis'>
48
+ <p>Your user agent does not support the HTML5 Audio element.</p>
49
+ </audio>
34
50
 
35
51
  <a href="success.html" id="link_id" name="link_name" class="link_class" title="link_title">Google Search</a>
36
52
 
@@ -62,6 +78,25 @@
62
78
  </tr>
63
79
  </table>
64
80
 
81
+ <table id='table_with_thead_id' border='1'>
82
+ <thead>
83
+ <tr>
84
+ <th>Col1</th>
85
+ <th>Col2</th>
86
+ </tr>
87
+ </thead>
88
+ <tbody>
89
+ <tr>
90
+ <td>Data1</td>
91
+ <td>Data2</td>
92
+ </tr>
93
+ <tr>
94
+ <td>Data3</td>
95
+ <td>Data4</td>
96
+ </tr>
97
+ </tbody>
98
+ </table>
99
+
65
100
  <form method="get" action="success.html">
66
101
  <input id='button_id' name='button_name' class='button_class' type="submit" value="Click Me"/>
67
102
  <input id='button_image_id' type='image' src='images/submit.gif' alt='Submit'/>
@@ -18,6 +18,7 @@ Feature: List item
18
18
  | xpath |
19
19
  | index |
20
20
  | name |
21
+ | text |
21
22
 
22
23
  Scenario Outline: Locating list items using multiple parameters
23
24
  When I search for the list item by "<param1>" and "<param2>"
@@ -0,0 +1,27 @@
1
+ When /^I search for the audio element by "([^\"]*)"$/ do |how|
2
+ @element = @page.send "audio_#{how}_element"
3
+ end
4
+
5
+ When /^I search for the audio element by "([^"]*)" and "([^"]*)"$/ do |param1, param2|
6
+ @element = @page.send "audio_#{param1}_#{param2}_element"
7
+ end
8
+
9
+ Then /^I should know the audio is not autoplay$/ do
10
+ @element.should_not be_autoplay
11
+ end
12
+
13
+ Then /^I should know that the controls are displayed$/ do
14
+ @element.should have_controls
15
+ end
16
+
17
+ Then /^I should know that the audio is paused$/ do
18
+ @element.should be_paused
19
+ end
20
+
21
+ Then /^I should know that the duration is greater than (\d+) seconds$/ do |duration|
22
+ @element.duration.should > duration.to_f
23
+ end
24
+
25
+ Then /^I should know that its volume is (\d+)$/ do |volume|
26
+ @element.volume.should == volume.to_i
27
+ end
@@ -0,0 +1,15 @@
1
+ When /^I search for the canvas by "([^\"]*)"$/ do |how|
2
+ @element = @page.send "canvas_#{how}_element"
3
+ end
4
+
5
+ Then /^I should see that the canvas width is "([^\"]*)"$/ do |width|
6
+ @element.width.should == width.to_i
7
+ end
8
+
9
+ Then /^I should see that the canvas height is "([^\"]*)"$/ do |height|
10
+ @element.height.should == height.to_i
11
+ end
12
+
13
+ When /^I search for the canvas element by "([^"]*)" and "([^"]*)"$/ do |param1, param2|
14
+ @element = @page.send "canvas_#{param1}_#{param2}_element"
15
+ end
@@ -30,6 +30,10 @@ When /^I retrieve a table element$/ do
30
30
  @element = @page.table_id_element
31
31
  end
32
32
 
33
+ When /^I retrieve a table with thead element$/ do
34
+ @element = @page.table_with_thead_id_element
35
+ end
36
+
33
37
  When /^I retrieve a button element$/ do
34
38
  @element = @page.button_id_element
35
39
  end
@@ -46,6 +50,14 @@ When /^I retrieve the area element$/ do
46
50
  @element = @page.area_id_element
47
51
  end
48
52
 
53
+ When /^I retrieve the canvas element$/ do
54
+ @element = @page.canvas_id_element
55
+ end
56
+
57
+ When /^I retrieve the audio element$/ do
58
+ @element = @page.audio_id_element
59
+ end
60
+
49
61
  When /^I locate the form$/ do
50
62
  @element = @page.form_id_element
51
63
  end
@@ -116,6 +116,7 @@ class Page
116
116
  table(:table_xpath, :xpath => '//table')
117
117
  table(:table_class_index, :class => "table_class", :index => 0)
118
118
  table(:table_name_index, :name => "table_name", :index => 0)
119
+ table(:table_with_thead_id, :id => 'table_with_thead_id')
119
120
 
120
121
  cell(:cell_id, :id => 'cell_id')
121
122
  cell(:cell_name, :name => 'cell_name')
@@ -176,6 +177,7 @@ class Page
176
177
  list_item(:li_name, :name => 'li_name')
177
178
  list_item(:li_class, :class => 'li_class')
178
179
  list_item(:li_index, :index => 0)
180
+ list_item(:li_text, :text => 'Item One')
179
181
  list_item(:li_xpath, :xpath => '//li[1]')
180
182
  list_item(:li_class_index, :class => "li_class", :index => 0)
181
183
  list_item(:li_name_index, :name => "li_name", :index => 0)
@@ -285,6 +287,22 @@ class Page
285
287
  area(:area_class_index, :class => 'area', :index => 0)
286
288
  area(:area_name_index, :name => 'area', :index => 0)
287
289
 
290
+ canvas(:canvas_id, :id => 'canvas')
291
+ canvas(:canvas_name, :name => 'canvas')
292
+ canvas(:canvas_class, :class => 'canvas')
293
+ canvas(:canvas_index, :index => 0)
294
+ canvas(:canvas_xpath, :xpath => '//canvas')
295
+ canvas(:canvas_class_index, :class => 'canvas', :index => 0)
296
+ canvas(:canvas_name_index, :name => 'canvas', :index => 0)
297
+
298
+ audio(:audio_id, :id => 'audio')
299
+ audio(:audio_name, :name => 'audio')
300
+ audio(:audio_class, :class => 'audio')
301
+ audio(:audio_index, :index => 0)
302
+ audio(:audio_xpath, :xpath => '//audio')
303
+ audio(:audio_class_index, :class => 'audio', :index => 0)
304
+ audio(:audio_name_index, :name => 'audio', :index => 0)
305
+
288
306
  element(:article_id, :article, :id => 'article_id')
289
307
  element(:header_id, :header, :id => 'header_id')
290
308
  element(:footer_id, :footer, :id => 'footer_id')
@@ -46,6 +46,14 @@ Feature: Table
46
46
  When I retrieve a table element
47
47
  Then the data for column "Data2" and row "2" should be "Data4"
48
48
 
49
+ Scenario: Retrieve data from a table with a thead using a column header
50
+ When I retrieve a table with thead element
51
+ Then the data for column "Col1" and row "2" should be "Data1"
52
+
53
+ Scenario: Retrieve data from the first row of a table with a thead using a column header
54
+ When I retrieve a table with thead element
55
+ Then the data for column "Col1" and row "1" should be "Col1"
56
+
49
57
  Scenario: Retrieve data from a table using a partial column header
50
58
  When I retrieve a table element
51
59
  Then the data for column "ata2" and row "2" should be "Data4"
@@ -643,6 +643,7 @@ module PageObject
643
643
  # * :id => Watir and Selenium
644
644
  # * :index => Watir and Selenium
645
645
  # * :name => Watir and Selenium
646
+ # * :text => Watir and Selenium
646
647
  # * :xpath => Watir and Selenium
647
648
  # @param optional block to be invoked when element method is called
648
649
  #
@@ -1067,6 +1068,64 @@ module PageObject
1067
1068
  end
1068
1069
  end
1069
1070
 
1071
+ #
1072
+ # adds two methods - one to return the canvas element and another to check
1073
+ # the canvas's existence.
1074
+ #
1075
+ # @example
1076
+ # canvas(:my_canvas, :id => 'canvas_id')
1077
+ # # will generate 'my_canvas_element' and 'my_canvas?' methods
1078
+ #
1079
+ # @param [Symbol] the name used for the generated methods
1080
+ # @param [Hash] identifier how we find a canvas. You can use a multiple paramaters
1081
+ # by combining of any of the following except xpath. The valid keys are:
1082
+ # * :class => Watir and Selenium
1083
+ # * :id => Watir and Selenium
1084
+ # * :index => Watir and Selenium
1085
+ # * :name => Watir and Selenium
1086
+ # * :xpath => Watir and Selenium
1087
+ # @param optional block to be invoked when element method is called
1088
+ #
1089
+ def canvas(name, identifier={:index => 0}, &block)
1090
+ define_method("#{name}_element") do
1091
+ return call_block(&block) if block_given?
1092
+ platform.canvas_for(identifier.clone)
1093
+ end
1094
+ define_method("#{name}?") do
1095
+ return call_block(&block).exists? if block_given?
1096
+ platform.canvas_for(identifier.clone).exists?
1097
+ end
1098
+ end
1099
+
1100
+ #
1101
+ # adds two methods - one to return the audio element and another to check
1102
+ # the audio's existence.
1103
+ #
1104
+ # @example
1105
+ # audio(:acdc, :id => 'audio_id')
1106
+ # # will generate 'acdc_element' and 'acdc?' methods
1107
+ #
1108
+ # @param [Symbol] the name used for the generated methods
1109
+ # @param [Hash] identifier how we find an audio element. You can use a multiple paramaters
1110
+ # by combining of any of the following except xpath. The valid keys are:
1111
+ # * :class => Watir and Selenium
1112
+ # * :id => Watir and Selenium
1113
+ # * :index => Watir and Selenium
1114
+ # * :name => Watir and Selenium
1115
+ # * :xpath => Watir and Selenium
1116
+ # @param optional block to be invoked when element method is called
1117
+ #
1118
+ def audio(name, identifier={:index => 0}, &block)
1119
+ define_method("#{name}_element") do
1120
+ return call_block(&block) if block_given?
1121
+ platform.audio_for(identifier.clone)
1122
+ end
1123
+ define_method("#{name}?") do
1124
+ return call_block(&block).exists? if block_given?
1125
+ platform.audio_for(identifier.clone).exists?
1126
+ end
1127
+ end
1128
+
1070
1129
  #
1071
1130
  # adds three methods - one to retrieve the text of an element, another
1072
1131
  # to retrieve an element, and another to check the element's existence.
@@ -911,6 +911,66 @@ module PageObject
911
911
  platform.areas_for(identifier.clone)
912
912
  end
913
913
 
914
+ #
915
+ # Finds a canvas
916
+ #
917
+ # @param [Hash] identifier how we find a canvas. You can use a multiple paramaters
918
+ # by combining of any of the following except xpath. It defaults to {:index => 0}
919
+ # which will return the first file field. The valid keys are:
920
+ # * :class => Watir and Selenium
921
+ # * :id => Watir and Selenium
922
+ # * :index => Watir and Selenium
923
+ # * :name => Watir and Selenium
924
+ # * :xpath => Watir and Selenium
925
+ def canvas_element(identifier={:index => 0})
926
+ platform.canvas_for(identifier.clone)
927
+ end
928
+
929
+ #
930
+ # Finds all canvases that match the provided identifier
931
+ #
932
+ # @param [Hash] identifier how we find a canvas. You can use a multiple paramaters
933
+ # by combining of any of the following except xpath. It defaults to and empty Hash
934
+ # which will return all file fields. The valid keys are:
935
+ # * :class => Watir and Selenium
936
+ # * :id => Watir and Selenium
937
+ # * :index => Watir and Selenium
938
+ # * :name => Watir and Selenium
939
+ # * :xpath => Watir and Selenium
940
+ def canvas_elements(identifier={})
941
+ platform.canvases_for(identifier.clone)
942
+ end
943
+
944
+ #
945
+ # Finds an audio element
946
+ #
947
+ # @param [Hash] identifier how we find an audio. You can use a multiple paramaters
948
+ # by combining of any of the following except xpath. It defaults to {:index => 0}
949
+ # which will return the first file field. The valid keys are:
950
+ # * :class => Watir and Selenium
951
+ # * :id => Watir and Selenium
952
+ # * :index => Watir and Selenium
953
+ # * :name => Watir and Selenium
954
+ # * :xpath => Watir and Selenium
955
+ def audio_element(identifier={:index => 0})
956
+ platform.audio_for(identifier.clone)
957
+ end
958
+
959
+ #
960
+ # Finds all audio elements that match the provided identifier
961
+ #
962
+ # @param [Hash] identifier how we find an audio element. You can use a multiple paramaters
963
+ # by combining of any of the following except xpath. It defaults to and empty Hash
964
+ # which will return all file fields. The valid keys are:
965
+ # * :class => Watir and Selenium
966
+ # * :id => Watir and Selenium
967
+ # * :index => Watir and Selenium
968
+ # * :name => Watir and Selenium
969
+ # * :xpath => Watir and Selenium
970
+ def audio_elements(identifier={})
971
+ platform.audios_for(identifier.clone)
972
+ end
973
+
914
974
  #
915
975
  # Finds an element
916
976
  #
@@ -51,4 +51,7 @@ require 'page-object/elements/paragraph'
51
51
  require 'page-object/elements/label'
52
52
  require 'page-object/elements/file_field'
53
53
  require 'page-object/elements/area'
54
+ require 'page-object/elements/canvas'
55
+ require 'page-object/elements/audio'
56
+
54
57
 
@@ -0,0 +1,31 @@
1
+
2
+ module PageObject
3
+ module Elements
4
+ class Audio < Element
5
+
6
+ def autoplay?
7
+ attribute(:autoplay)
8
+ end
9
+
10
+ def has_controls?
11
+ attribute(:controls)
12
+ end
13
+
14
+ def paused?
15
+ attribute(:paused)
16
+ end
17
+
18
+ def duration
19
+ duration = attribute(:duration)
20
+ return duration.to_f if duration
21
+ end
22
+
23
+ def volume
24
+ volume = attribute(:volume)
25
+ return volume.to_i if volume
26
+ end
27
+
28
+ end
29
+ ::PageObject::Elements.type_to_class[:audio] = ::PageObject::Elements::Audio
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+
2
+ module PageObject
3
+ module Elements
4
+ class Canvas < Element
5
+ #
6
+ # return the width of the canvas
7
+ #
8
+ def width
9
+ attribute(:width).to_i
10
+ end
11
+
12
+ #
13
+ # return the height of the canvas
14
+ #
15
+ def height
16
+ attribute(:height).to_i
17
+ end
18
+
19
+ end
20
+ ::PageObject::Elements.type_to_class[:canvas] = ::PageObject::Elements::Canvas
21
+ end
22
+ end
23
+
@@ -105,7 +105,7 @@ module PageObject
105
105
  protected
106
106
 
107
107
  def self.should_build_watir_xpath identifier
108
- ['table', 'span', 'div', 'td', 'li', 'ul', 'ol', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'label', 'area'].include? identifier[:tag_name] and identifier[:name]
108
+ ['table', 'span', 'div', 'td', 'li', 'ul', 'ol', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'label', 'area', 'canvas', 'audio'].include? identifier[:tag_name] and identifier[:name]
109
109
  end
110
110
 
111
111
  def self.build_xpath_for identifier
@@ -2,6 +2,15 @@ module PageObject
2
2
  module Elements
3
3
  class ListItem < Element
4
4
 
5
+ protected
6
+
7
+ def self.watir_finders
8
+ super + [:text]
9
+ end
10
+
11
+ def self.selenium_finders
12
+ super + [:text]
13
+ end
5
14
  end
6
15
 
7
16
  ::PageObject::Elements.tag_to_class[:li] = ::PageObject::Elements::ListItem
@@ -204,5 +204,29 @@ module PageObject
204
204
  def file_field_element(identifier={:index => 0})
205
205
  @platform.file_field_for(identifier)
206
206
  end
207
+
208
+ def area_element(identifier={:index => 0})
209
+ @platform.area_for(identifier)
210
+ end
211
+
212
+ def area_elements(identifier={:index => 0})
213
+ @platform.areas_for(identifier)
214
+ end
215
+
216
+ def canvas_element(identifier={:index => 0})
217
+ @platform.canvas_for(identifier)
218
+ end
219
+
220
+ def canvas_elements(identifier={:index => 0})
221
+ @platform.canvases_for(identifier)
222
+ end
223
+
224
+ def audio_element(identifier={:index => 0})
225
+ @platform.audio_for(identifier)
226
+ end
227
+
228
+ def audio_elements(identifier={:index => 0})
229
+ @platform.audios_for(identifier)
230
+ end
207
231
  end
208
232
  end
@@ -885,6 +885,34 @@ module PageObject
885
885
  def areas_for(identifier)
886
886
  find_selenium_elements(identifier, Elements::Area, 'area')
887
887
  end
888
+
889
+ #
890
+ # platform method to retrieve a canvas element
891
+ #
892
+ def canvas_for(identifier)
893
+ find_selenium_element(identifier, Elements::Canvas, 'canvas')
894
+ end
895
+
896
+ #
897
+ # platform method to return an array of canvas elements
898
+ #
899
+ def canvases_for(identifier)
900
+ find_selenium_elements(identifier, Elements::Canvas, 'canvas')
901
+ end
902
+
903
+ #
904
+ # platform method to retrieve an audio element
905
+ #
906
+ def audio_for(identifier)
907
+ find_selenium_element(identifier, Elements::Audio, 'audio')
908
+ end
909
+
910
+ #
911
+ # platform method to return an array of audio elements
912
+ #
913
+ def audios_for(identifier)
914
+ find_selenium_elements(identifier, Elements::Audio, 'audio')
915
+ end
888
916
 
889
917
  #
890
918
  # platform method to retrieve a generic element
@@ -975,7 +1003,7 @@ module PageObject
975
1003
  return false if identifier[:label]
976
1004
  return false if identifier[:text] and tag == 'input' and additional[:type] == 'hidden'
977
1005
  return false if identifier[:text] and tag == 'input' and additional[:type] == 'text'
978
- return false if identifier[:text] and ['div', 'span', 'td', 'label'].include? tag
1006
+ return false if identifier[:text] and ['div', 'span', 'td', 'label', 'li'].include? tag
979
1007
  return false if identifier[:title] and tag == 'input' and additional[:type] == 'text'
980
1008
  return false if identifier[:title] and tag == 'input' and additional[:type] == 'file'
981
1009
  return false if identifier[:title] and tag == 'a'
@@ -28,7 +28,8 @@ module PageObject
28
28
 
29
29
  def find_index_by_title(title)
30
30
  table = parent
31
- table = table.parent if parent.element.tag_name == 'tbody'
31
+ parent_tag_name = parent.element.tag_name
32
+ table = table.parent if (parent_tag_name == 'tbody' || parent_tag_name == 'thead')
32
33
  table[0].find_index { |column| column.text.include? title }
33
34
  end
34
35
 
@@ -827,6 +827,34 @@ module PageObject
827
827
  find_watir_elements("areas(identifier)", Elements::Area, identifier, 'area')
828
828
  end
829
829
 
830
+ #
831
+ # platform method to retrieve a canvas element
832
+ #
833
+ def canvas_for(identifier)
834
+ find_watir_element("canvas(identifier)", Elements::Canvas, identifier, 'canvas')
835
+ end
836
+
837
+ #
838
+ # platform method to retrieve an array of canvas elements
839
+ #
840
+ def canvases_for(identifier)
841
+ find_watir_elements("canvases(identifier)", Elements::Canvas, identifier, 'canvas')
842
+ end
843
+
844
+ #
845
+ # platform method to retrieve an audio element
846
+ #
847
+ def audio_for(identifier)
848
+ find_watir_element("audio(identifier)", Elements::Audio, identifier, 'audio')
849
+ end
850
+
851
+ #
852
+ # platform method to retrieve an array of audio elements
853
+ #
854
+ def audios_for(identifier)
855
+ find_watir_elements("audios(identifier)", Elements::Audio, identifier, 'audio')
856
+ end
857
+
830
858
  #
831
859
  # platform method to return a PageObject::Elements::Element element
832
860
  # See PageObject::Accessors#elem
@@ -26,6 +26,7 @@ module PageObject
26
26
 
27
27
  def find_index_by_title(title)
28
28
  table = element.parent
29
+ table = table.parent if table.tag_name == 'tbody'
29
30
  first_row = table[0]
30
31
  first_row.cells.find_index {|column| column.text.include? title }
31
32
  end
@@ -1,4 +1,4 @@
1
1
  module PageObject
2
2
  # @private
3
- VERSION = "0.7.1"
3
+ VERSION = "0.7.2"
4
4
  end
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ["lib"]
21
21
 
22
22
  s.add_dependency 'watir-webdriver', '>= 0.6.1'
23
- s.add_dependency 'selenium-webdriver', '>= 2.24.0'
23
+ s.add_dependency 'selenium-webdriver', '>= 2.25.0'
24
24
 
25
25
  s.add_development_dependency 'rspec', '>= 2.6.0'
26
26
  s.add_development_dependency 'cucumber', '< 1.2.0'
@@ -585,6 +585,72 @@ describe PageObject::ElementLocators do
585
585
  watir_page_object.file_field_elements
586
586
  end
587
587
 
588
+ it "should find an area element" do
589
+ watir_browser.should_receive(:area).with(:id => 'blah').and_return(watir_browser)
590
+ element = watir_page_object.area_element(:id => 'blah')
591
+ element.should be_instance_of PageObject::Elements::Area
592
+ end
593
+
594
+ it "should find an area element using a default identifier" do
595
+ watir_browser.should_receive(:area).with(:index => 0).and_return(watir_browser)
596
+ watir_page_object.area_element
597
+ end
598
+
599
+ it "should find all area elements" do
600
+ watir_browser.should_receive(:areas).with(:id => 'blah').and_return([watir_browser])
601
+ elements = watir_page_object.area_elements(:id => 'blah')
602
+ elements[0].should be_instance_of PageObject::Elements::Area
603
+ end
604
+
605
+ it "should find all areas with no identifier" do
606
+ watir_browser.should_receive(:areas).with({}).and_return([watir_browser])
607
+ watir_page_object.area_elements
608
+ end
609
+
610
+ it "should find a canvas element" do
611
+ watir_browser.should_receive(:canvas).with(:id => 'blah').and_return(watir_browser)
612
+ element = watir_page_object.canvas_element(:id => 'blah')
613
+ element.should be_instance_of PageObject::Elements::Canvas
614
+ end
615
+
616
+ it "should find a canvas element using a default identifier" do
617
+ watir_browser.should_receive(:canvas).with(:index => 0).and_return(watir_browser)
618
+ watir_page_object.canvas_element
619
+ end
620
+
621
+ it "should find all canvas elements" do
622
+ watir_browser.should_receive(:canvases).with(:id => 'blah').and_return([watir_browser])
623
+ elements = watir_page_object.canvas_elements(:id => 'blah')
624
+ elements[0].should be_instance_of PageObject::Elements::Canvas
625
+ end
626
+
627
+ it "should find all canvases with no identifier" do
628
+ watir_browser.should_receive(:canvases).with({}).and_return([watir_browser])
629
+ watir_page_object.canvas_elements
630
+ end
631
+
632
+ it "should find an audio element" do
633
+ watir_browser.should_receive(:audio).with(:id => 'blah').and_return(watir_browser)
634
+ element = watir_page_object.audio_element(:id => 'blah')
635
+ element.should be_instance_of PageObject::Elements::Audio
636
+ end
637
+
638
+ it "should find an audio element using a default identifier" do
639
+ watir_browser.should_receive(:audio).with(:index => 0).and_return(watir_browser)
640
+ watir_page_object.audio_element
641
+ end
642
+
643
+ it "should find all audio elements" do
644
+ watir_browser.should_receive(:audios).with(:id => 'blah').and_return([watir_browser])
645
+ elements = watir_page_object.audio_elements(:id => 'blah')
646
+ elements[0].should be_instance_of PageObject::Elements::Audio
647
+ end
648
+
649
+ it "should find all audio elements with no identifier" do
650
+ watir_browser.should_receive(:audios).with({}).and_return([watir_browser])
651
+ watir_page_object.audio_elements
652
+ end
653
+
588
654
  it "should find an element" do
589
655
  watir_browser.should_receive(:audio).with(:id => 'blah').and_return(watir_browser)
590
656
  element = watir_page_object.element(:audio, :id => 'blah')
@@ -906,6 +972,72 @@ describe PageObject::ElementLocators do
906
972
  selenium_browser.should_receive(:find_element).with(:id, 'blah').and_return(selenium_browser)
907
973
  element = selenium_page_object.file_field_element(:id => 'blah')
908
974
  element.should be_instance_of PageObject::Elements::FileField
975
+ end
976
+
977
+ it "should find an area element" do
978
+ selenium_browser.should_receive(:find_element).with(:id, 'blah').and_return(selenium_browser)
979
+ element = selenium_page_object.area_element(:id => 'blah')
980
+ element.should be_instance_of PageObject::Elements::Area
981
+ end
982
+
983
+ it "should find an area element using a default identifier" do
984
+ selenium_browser.should_receive(:find_element).with(:xpath, './/area[1]').and_return(selenium_browser)
985
+ selenium_page_object.area_element
986
+ end
987
+
988
+ it "should find all area elements" do
989
+ selenium_browser.should_receive(:find_elements).with(:id, 'blah').and_return([selenium_browser])
990
+ elements = selenium_page_object.area_elements(:id => 'blah')
991
+ elements[0].should be_instance_of PageObject::Elements::Area
992
+ end
993
+
994
+ it "should find all areas with no identifier" do
995
+ selenium_browser.should_receive(:find_elements).with(:tag_name, 'area').and_return([selenium_browser])
996
+ selenium_page_object.area_elements
997
+ end
998
+
999
+ it "should find a canvas element" do
1000
+ selenium_browser.should_receive(:find_element).with(:id, 'blah').and_return(selenium_browser)
1001
+ element = selenium_page_object.canvas_element(:id => 'blah')
1002
+ element.should be_instance_of PageObject::Elements::Canvas
1003
+ end
1004
+
1005
+ it "should find a canvas element using a default identifier" do
1006
+ selenium_browser.should_receive(:find_element).with(:xpath, './/canvas[1]').and_return(selenium_browser)
1007
+ selenium_page_object.canvas_element
1008
+ end
1009
+
1010
+ it "should find all canvas elements" do
1011
+ selenium_browser.should_receive(:find_elements).with(:id, 'blah').and_return([selenium_browser])
1012
+ elements = selenium_page_object.canvas_elements(:id => 'blah')
1013
+ elements[0].should be_instance_of PageObject::Elements::Canvas
1014
+ end
1015
+
1016
+ it "should find all canvases with no identifier" do
1017
+ selenium_browser.should_receive(:find_elements).with(:tag_name, 'canvas').and_return([selenium_browser])
1018
+ selenium_page_object.canvas_elements
1019
+ end
1020
+
1021
+ it "should find an audio element" do
1022
+ selenium_browser.should_receive(:find_element).with(:id, 'blah').and_return(selenium_browser)
1023
+ element = selenium_page_object.audio_element(:id => 'blah')
1024
+ element.should be_instance_of PageObject::Elements::Audio
1025
+ end
1026
+
1027
+ it "should find an audio element using a default identifier" do
1028
+ selenium_browser.should_receive(:find_element).with(:xpath, './/audio[1]').and_return(selenium_browser)
1029
+ selenium_page_object.audio_element
1030
+ end
1031
+
1032
+ it "should find all audio elements" do
1033
+ selenium_browser.should_receive(:find_elements).with(:id, 'blah').and_return([selenium_browser])
1034
+ elements = selenium_page_object.audio_elements(:id => 'blah')
1035
+ elements[0].should be_instance_of PageObject::Elements::Audio
1036
+ end
1037
+
1038
+ it "should find all audio elements with no identifier" do
1039
+ selenium_browser.should_receive(:find_elements).with(:tag_name, 'audio').and_return([selenium_browser])
1040
+ selenium_page_object.audio_elements
909
1041
  end
910
1042
  end
911
1043
  end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Canvas do
5
+ let(:area) { PageObject::Elements::Canvas }
6
+
7
+ context "when mapping how to find an element" do
8
+ it "should map watir types to same" do
9
+ [:class, :id, :index, :name, :xpath].each do |t|
10
+ identifier = area.watir_identifier_for t => 'value'
11
+ identifier.keys.first.should == t
12
+ end
13
+ end
14
+
15
+ it "should map selenium types to same" do
16
+ [:class, :id, :index, :name, :xpath].each do |t|
17
+ key, value = area.selenium_identifier_for t => 'value'
18
+ key.should == t
19
+ end
20
+ end
21
+ end
22
+
23
+ context "implementation" do
24
+ let(:canvas_element) { double('canvas_element') }
25
+
26
+ context "when using selenium" do
27
+ let(:selenium_canvas) { PageObject::Elements::Canvas.new(canvas_element, :platform => :selenium_webdriver) }
28
+
29
+ it "should know its width" do
30
+ canvas_element.should_receive(:attribute).with(:width).and_return("400")
31
+ selenium_canvas.width.should == 400
32
+ end
33
+
34
+ it "should know its height" do
35
+ canvas_element.should_receive(:attribute).with(:height).and_return("100")
36
+ selenium_canvas.height.should == 100
37
+ end
38
+ end
39
+ end
40
+ end
@@ -6,14 +6,14 @@ describe PageObject::Elements::ListItem do
6
6
 
7
7
  describe "when mapping how to find an element" do
8
8
  it "should map watir types to same" do
9
- [:class, :id, :index, :xpath].each do |t|
9
+ [:class, :id, :index, :text, :xpath].each do |t|
10
10
  identifier = list_item.watir_identifier_for t => 'value'
11
11
  identifier.keys.first.should == t
12
12
  end
13
13
  end
14
14
 
15
15
  it "should map selenium types to same" do
16
- [:class, :id, :index, :name, :xpath].each do |t|
16
+ [:class, :id, :index, :name, :text, :xpath].each do |t|
17
17
  key, value = list_item.selenium_identifier_for t => 'value'
18
18
  key.should == t
19
19
  end
@@ -31,6 +31,9 @@ class SeleniumAccessorsTestPageObject
31
31
  h6(:heading6, :id => 'main_heading')
32
32
  paragraph(:first_para, :id => 'first')
33
33
  file_field(:upload_me, :id => 'the_file')
34
+ area(:img_area, :id => 'area')
35
+ canvas(:my_canvas, :id => 'canvas')
36
+ audio(:acdc, :id => 'audio_id')
34
37
  end
35
38
 
36
39
  class SeleniumBlockPageObject
@@ -113,12 +116,21 @@ class SeleniumBlockPageObject
113
116
  file_field :a_file do |element|
114
117
  "file_field"
115
118
  end
119
+ area :img_area do |element|
120
+ "area"
121
+ end
122
+ canvas :my_canvas do |element|
123
+ "canvas"
124
+ end
125
+ audio :acdc do |element|
126
+ 'audio'
127
+ end
116
128
  end
117
129
 
118
130
  describe PageObject::Accessors do
119
131
  let(:selenium_browser) { mock_selenium_browser }
120
132
  let(:selenium_page_object) { SeleniumAccessorsTestPageObject.new(selenium_browser) }
121
- let(:block_page_object) { SeleniumBlockPageObject.new(watir_browser) }
133
+ let(:block_page_object) { SeleniumBlockPageObject.new(selenium_browser) }
122
134
 
123
135
  before(:each) do
124
136
  selenium_browser.stub(:switch_to).and_return(selenium_browser)
@@ -502,4 +514,53 @@ describe PageObject::Accessors do
502
514
  element.should be_instance_of PageObject::Elements::FileField
503
515
  end
504
516
  end
517
+
518
+ describe "area accessors" do
519
+ context "when called on a page object" do
520
+ it "should generate accessor methods" do
521
+ selenium_page_object.should respond_to(:img_area)
522
+ selenium_page_object.should respond_to(:img_area_element)
523
+ end
524
+
525
+ it "should call a block on the element method when present" do
526
+ block_page_object.img_area_element.should == "area"
527
+ end
528
+ end
529
+
530
+ it "should click on the area" do
531
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
532
+ selenium_browser.should_receive(:click)
533
+ selenium_page_object.img_area
534
+ end
535
+
536
+ it "should retrieve the element from the page" do
537
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
538
+ element = selenium_page_object.img_area_element
539
+ element.should be_instance_of PageObject::Elements::Area
540
+ end
541
+ end
542
+
543
+ describe "canvas accessors" do
544
+ context "when called on a page object" do
545
+ it "should generate accessor methods" do
546
+ selenium_page_object.should respond_to(:my_canvas_element)
547
+ end
548
+
549
+ it "should call a block on the element method when present" do
550
+ block_page_object.my_canvas_element.should == "canvas"
551
+ end
552
+ end
553
+ end
554
+
555
+ describe "audio accessors" do
556
+ context "when called on a page object" do
557
+ it "should generate accessor methods" do
558
+ selenium_page_object.should respond_to(:acdc_element)
559
+ end
560
+
561
+ it "should call a block on the element method when present" do
562
+ block_page_object.acdc_element.should == "audio"
563
+ end
564
+ end
565
+ end
505
566
  end
@@ -31,6 +31,9 @@ class WatirAccessorsTestPageObject
31
31
  h6(:heading6, :id => 'main_heading')
32
32
  paragraph(:first_para, :id => 'first')
33
33
  file_field(:upload_me, :id => 'the_file')
34
+ area(:img_area, :id => 'area')
35
+ canvas(:my_canvas, :id => 'canvas_id')
36
+ audio(:acdc, :id => 'audio_id')
34
37
  end
35
38
 
36
39
  class WatirBlockPageObject
@@ -113,6 +116,15 @@ class WatirBlockPageObject
113
116
  file_field :a_file do |element|
114
117
  "file_field"
115
118
  end
119
+ area :img_area do |element|
120
+ "area"
121
+ end
122
+ canvas :my_canvas do |element|
123
+ "canvas"
124
+ end
125
+ audio :acdc do |element|
126
+ "audio"
127
+ end
116
128
  end
117
129
 
118
130
  describe PageObject::Accessors do
@@ -1025,4 +1037,53 @@ describe PageObject::Accessors do
1025
1037
  element.should be_instance_of PageObject::Elements::FileField
1026
1038
  end
1027
1039
  end
1040
+
1041
+ describe "area accessors" do
1042
+ context "when called on a page object" do
1043
+ it "should generate accessor methods" do
1044
+ watir_page_object.should respond_to(:img_area)
1045
+ watir_page_object.should respond_to(:img_area_element)
1046
+ end
1047
+
1048
+ it "should call a block on the element method when present" do
1049
+ block_page_object.img_area_element.should == "area"
1050
+ end
1051
+ end
1052
+
1053
+ it "should click on the area" do
1054
+ watir_browser.should_receive(:area).and_return(watir_browser)
1055
+ watir_browser.should_receive(:click)
1056
+ watir_page_object.img_area
1057
+ end
1058
+
1059
+ it "should retrieve the element from the page" do
1060
+ watir_browser.should_receive(:area).and_return(watir_browser)
1061
+ element = watir_page_object.img_area_element
1062
+ element.should be_instance_of PageObject::Elements::Area
1063
+ end
1064
+ end
1065
+
1066
+ describe "canvas accessors" do
1067
+ context "when called on a page object" do
1068
+ it "should generate accessor methods" do
1069
+ watir_page_object.should respond_to(:my_canvas_element)
1070
+ end
1071
+
1072
+ it "should call a block on the element method when present" do
1073
+ block_page_object.my_canvas_element.should == "canvas"
1074
+ end
1075
+ end
1076
+ end
1077
+
1078
+ describe "audio accessors" do
1079
+ context "when called on a page object" do
1080
+ it "should generate accessor methods" do
1081
+ watir_page_object.should respond_to(:acdc_element)
1082
+ end
1083
+
1084
+ it "should call a block on the element method when present" do
1085
+ block_page_object.acdc_element.should == "audio"
1086
+ end
1087
+ end
1088
+ end
1028
1089
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: page-object
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-15 00:00:00.000000000 Z
12
+ date: 2012-08-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: watir-webdriver
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ! '>='
36
36
  - !ruby/object:Gem::Version
37
- version: 2.24.0
37
+ version: 2.25.0
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
- version: 2.24.0
45
+ version: 2.25.0
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: rspec
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -127,7 +127,9 @@ files:
127
127
  - cucumber.yml
128
128
  - features/area.feature
129
129
  - features/async.feature
130
+ - features/audio.feature
130
131
  - features/button.feature
132
+ - features/canvas.feature
131
133
  - features/check_box.feature
132
134
  - features/div.feature
133
135
  - features/element.feature
@@ -183,7 +185,9 @@ files:
183
185
  - features/step_definitions/accessor_steps.rb
184
186
  - features/step_definitions/area_steps.rb
185
187
  - features/step_definitions/async_steps.rb
188
+ - features/step_definitions/audio_steps.rb
186
189
  - features/step_definitions/button_steps.rb
190
+ - features/step_definitions/canvas_steps.rb
187
191
  - features/step_definitions/check_box_steps.rb
188
192
  - features/step_definitions/div_steps.rb
189
193
  - features/step_definitions/element_steps.rb
@@ -231,7 +235,9 @@ files:
231
235
  - lib/page-object/element_locators.rb
232
236
  - lib/page-object/elements.rb
233
237
  - lib/page-object/elements/area.rb
238
+ - lib/page-object/elements/audio.rb
234
239
  - lib/page-object/elements/button.rb
240
+ - lib/page-object/elements/canvas.rb
235
241
  - lib/page-object/elements/check_box.rb
236
242
  - lib/page-object/elements/div.rb
237
243
  - lib/page-object/elements/element.rb
@@ -303,6 +309,7 @@ files:
303
309
  - spec/page-object/element_locators_spec.rb
304
310
  - spec/page-object/elements/area_spec.rb
305
311
  - spec/page-object/elements/button_spec.rb
312
+ - spec/page-object/elements/canvas_spec.rb
306
313
  - spec/page-object/elements/check_box_spec.rb
307
314
  - spec/page-object/elements/div_spec.rb
308
315
  - spec/page-object/elements/element_spec.rb
@@ -354,7 +361,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
354
361
  version: '0'
355
362
  segments:
356
363
  - 0
357
- hash: -3346417755984147094
364
+ hash: -4250086403219071004
358
365
  required_rubygems_version: !ruby/object:Gem::Requirement
359
366
  none: false
360
367
  requirements:
@@ -363,7 +370,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
363
370
  version: '0'
364
371
  segments:
365
372
  - 0
366
- hash: -3346417755984147094
373
+ hash: -4250086403219071004
367
374
  requirements: []
368
375
  rubyforge_project: page-object
369
376
  rubygems_version: 1.8.24
@@ -373,7 +380,9 @@ summary: Page Object DSL for browser testing
373
380
  test_files:
374
381
  - features/area.feature
375
382
  - features/async.feature
383
+ - features/audio.feature
376
384
  - features/button.feature
385
+ - features/canvas.feature
377
386
  - features/check_box.feature
378
387
  - features/div.feature
379
388
  - features/element.feature
@@ -429,7 +438,9 @@ test_files:
429
438
  - features/step_definitions/accessor_steps.rb
430
439
  - features/step_definitions/area_steps.rb
431
440
  - features/step_definitions/async_steps.rb
441
+ - features/step_definitions/audio_steps.rb
432
442
  - features/step_definitions/button_steps.rb
443
+ - features/step_definitions/canvas_steps.rb
433
444
  - features/step_definitions/check_box_steps.rb
434
445
  - features/step_definitions/div_steps.rb
435
446
  - features/step_definitions/element_steps.rb
@@ -474,6 +485,7 @@ test_files:
474
485
  - spec/page-object/element_locators_spec.rb
475
486
  - spec/page-object/elements/area_spec.rb
476
487
  - spec/page-object/elements/button_spec.rb
488
+ - spec/page-object/elements/canvas_spec.rb
477
489
  - spec/page-object/elements/check_box_spec.rb
478
490
  - spec/page-object/elements/div_spec.rb
479
491
  - spec/page-object/elements/element_spec.rb