page-object 0.7.2 → 0.7.3

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 (38) hide show
  1. data/.gitignore +1 -0
  2. data/ChangeLog +8 -0
  3. data/cucumber.yml +2 -1
  4. data/features/audio.feature +17 -0
  5. data/features/element.feature +10 -0
  6. data/features/html/hover.html +12 -0
  7. data/features/html/static_elements.html +10 -2
  8. data/features/page_level_actions.feature +8 -0
  9. data/features/sample-app/public/04-Death_Becomes_Fur.mp4 +0 -0
  10. data/features/sample-app/public/04-Death_Becomes_Fur.oga +0 -0
  11. data/features/sample-app/public/movie.mp4 +0 -0
  12. data/features/sample-app/public/movie.ogg +0 -0
  13. data/features/step_definitions/element_steps.rb +21 -0
  14. data/features/step_definitions/page_level_actions_steps.rb +12 -0
  15. data/features/step_definitions/video_steps.rb +45 -0
  16. data/features/support/page.rb +10 -0
  17. data/features/support/persistent_browser.rb +3 -2
  18. data/features/support/url_helper.rb +4 -0
  19. data/features/video.feature +72 -0
  20. data/lib/page-object.rb +1 -0
  21. data/lib/page-object/accessors.rb +29 -0
  22. data/lib/page-object/element_locators.rb +30 -0
  23. data/lib/page-object/elements.rb +2 -0
  24. data/lib/page-object/elements/audio.rb +1 -23
  25. data/lib/page-object/elements/element.rb +1 -1
  26. data/lib/page-object/elements/media.rb +45 -0
  27. data/lib/page-object/elements/video.rb +18 -0
  28. data/lib/page-object/nested_elements.rb +8 -0
  29. data/lib/page-object/platforms/selenium_webdriver/element.rb +23 -5
  30. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +22 -4
  31. data/lib/page-object/platforms/watir_webdriver/element.rb +14 -0
  32. data/lib/page-object/platforms/watir_webdriver/page_object.rb +18 -4
  33. data/lib/page-object/version.rb +1 -1
  34. data/spec/page-object/element_locators_spec.rb +22 -0
  35. data/spec/page-object/page-object_spec.rb +14 -6
  36. data/spec/page-object/selenium_accessors_spec.rb +16 -0
  37. data/spec/page-object/watir_accessors_spec.rb +16 -0
  38. metadata +20 -4
data/.gitignore CHANGED
@@ -4,3 +4,4 @@ Gemfile.lock
4
4
  .idea/
5
5
  pkg
6
6
  TAGS
7
+ chromedriver.log
data/ChangeLog CHANGED
@@ -1,3 +1,11 @@
1
+ === Version 0.7.3 / 2012-8-18
2
+ * Enhancements
3
+ * Improved handling of alert and confirm Javascript popups (George Shakhnazaryan)
4
+ * Added hover method to Element. Browser support is limited.
5
+ * Added method to get the id of an Element
6
+ * Added support for the following new elements
7
+ Video
8
+
1
9
  === Version 0.7.2 / 2012-8-1
2
10
  * Enhancements
3
11
  * Added ability to find list_item by :text
data/cucumber.yml CHANGED
@@ -1,9 +1,10 @@
1
1
  <%
2
- std_opts = "--no-source --color --format Cucumber::Formatter::Fuubar"
2
+ std_opts = "BROWSER=firefox --no-source --color --format Cucumber::Formatter::Fuubar"
3
3
  %>
4
4
 
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
8
  focus: DRIVER=WATIR <%= std_opts %> --tags ~@selenium_only --tags @focus
9
+ #focus: DRIVER=SELENIUM <%= std_opts %> --tags ~@watir_only --tags @focus
9
10
 
@@ -48,3 +48,20 @@ Feature: Support for the audio element
48
48
  Scenario: Should know its volume
49
49
  When I retrieve the audio element
50
50
  Then I should know that its volume is 1
51
+
52
+ Scenario: Should know if it has ended
53
+ When I retrieve the audio element
54
+ Then I should know that it has not ended
55
+
56
+ Scenario: Should know if it is seeking
57
+ When I retrieve the audio element
58
+ Then I should know that it is not seeking
59
+
60
+ Scenario: Should know if it is in a loop
61
+ When I retrieve the audio element
62
+ Then I should know that it is not in a loop
63
+
64
+ Scenario: Should know if it is muted
65
+ When I retrieve the audio element
66
+ Then I should know that it is muted
67
+
@@ -264,6 +264,11 @@ Feature: Elements
264
264
  When I set the focus to the test text_field using the onfocus event
265
265
  Then I should see the onfocus text "changed by onfocus event"
266
266
 
267
+ Scenario: Hovering over an element
268
+ Given I am on the hover page
269
+ When I hover over the hello link
270
+ Then the font size should be "20px"
271
+
267
272
  Scenario: Setting focus on an element
268
273
  When I set the focus on the test text_field
269
274
  Then I should see the onfocus text "changed by onfocus event"
@@ -276,3 +281,8 @@ Feature: Elements
276
281
  Scenario: Flashing an element
277
282
  When I retrieve a button element
278
283
  Then I should be able to flash it
284
+
285
+ @focus
286
+ Scenario: Getting an element's id
287
+ When I retrieve a button element
288
+ Then I should know its id is "button_id"
@@ -0,0 +1,12 @@
1
+ <html>
2
+ <head>
3
+ <style type="text/css" media="screen">
4
+ a { font-size: 10px; }
5
+ a:hover { font-size: 20px; }
6
+ </style>
7
+ </head>
8
+
9
+ <body>
10
+ <a href="#">hello</a>
11
+ </body>
12
+ </html>
@@ -41,13 +41,19 @@
41
41
  </script>
42
42
 
43
43
  <audio controls id="audio" name="audio" class="audio">
44
- <source src="http://media.w3.org/2010/07/bunny/04-Death_Becomes_Fur.mp4"
44
+ <source src="http://localhost:4567/04-Death_Becomes_Fur.mp4"
45
45
  type='audio/mp4'>
46
- <source src="http://media.w3.org/2010/07/bunny/04-Death_Becomes_Fur.oga"
46
+ <source src="http://localhost:4567/04-Death_Becomes_Fur.oga"
47
47
  type='audio/ogg; codecs=vorbis'>
48
48
  <p>Your user agent does not support the HTML5 Audio element.</p>
49
49
  </audio>
50
50
 
51
+ <video width="320" height="240" controls="controls" id="video" name="video" class="video">
52
+ <source src="http://localhost:4567/movie.mp4" type="video/mp4" />
53
+ <source src="http://localhost:4567/movie.ogg" type="video/ogg" />
54
+ Your browser does not support the video tag.
55
+ </video>
56
+
51
57
  <a href="success.html" id="link_id" name="link_name" class="link_class" title="link_title">Google Search</a>
52
58
 
53
59
  <input id="cb_id" name="cb_name" class="cb_class" type="checkbox" value="1"/>
@@ -128,7 +134,9 @@
128
134
  <a href="success.html">Hello</a>
129
135
 
130
136
  <input id=alert_button type=button onclick="alert('I am an alert')" value=Alert>
137
+ <input id=alert_button_that_reloads type=button onclick="alert('I am an alert'); location.reload()" value="Alert that Reloads">
131
138
  <input id=confirm_button type=button onclick="this.value = confirm('set the value')" value=Confirm>
139
+ <input id=confirm_button_that_reloads type=button onclick="if(confirm('set the value')) location.reload()" value="Confirm that Reloads">
132
140
  <input id=prompt_button type=button onclick='this.value = prompt("enter your name", "John Doe")' value=Prompt>
133
141
 
134
142
  <h1 id="h1_id" class="h1_class" name="h1_name">h1's are cool</h1>
@@ -31,10 +31,18 @@ Feature: Page level actions
31
31
  When I handle the alert
32
32
  Then I should be able to get the alert's message
33
33
 
34
+ Scenario: Handling alert popups that reload the page
35
+ When I handle the alert that reloads the page
36
+ Then I should be able to get the alert's message
37
+
34
38
  Scenario: Handling confirm popups
35
39
  When I handle the confirm
36
40
  Then I should be able to get the confirm message
37
41
 
42
+ Scenario: Handling confirm popups that reload the page
43
+ When I handle the confirm that reloads the page
44
+ Then I should be able to get the confirm message
45
+
38
46
  Scenario: Handling prompt popups
39
47
  When I handle the prompt
40
48
  Then I should be able to get the message and default value
@@ -190,4 +190,25 @@ Then /^I should be able to flash it$/ do
190
190
  @element.flash
191
191
  end
192
192
 
193
+ class HoverPage
194
+ include PageObject
193
195
 
196
+ link(:hello)
197
+ end
198
+
199
+ Given /^I am on the hover page$/ do
200
+ @page = HoverPage.new(@browser)
201
+ @page.navigate_to UrlHelper.hover
202
+ end
203
+
204
+ When /^I hover over the hello link$/ do
205
+ @page.hello_element.hover
206
+ end
207
+
208
+ Then /^the font size should be "([^\"]*)"$/ do |font_size|
209
+ @page.hello_element.style('font-size').should == font_size if ENV['BROWSER'] == 'chrome'
210
+ end
211
+
212
+ Then /^I should know its id is "([^\"]*)"$/ do |id|
213
+ @element.id.should == id
214
+ end
@@ -23,6 +23,12 @@ When /^I handle the alert$/ do
23
23
  end
24
24
  end
25
25
 
26
+ When /^I handle the alert that reloads the page$/ do
27
+ @msg = @page.alert do
28
+ @page.alert_button_that_reloads
29
+ end
30
+ end
31
+
26
32
  Then /^I should be able to get the alert\'s message$/ do
27
33
  @msg.should == "I am an alert"
28
34
  end
@@ -33,6 +39,12 @@ When /^I handle the confirm$/ do
33
39
  end
34
40
  end
35
41
 
42
+ When /^I handle the confirm that reloads the page$/ do
43
+ @msg = @page.confirm(true) do
44
+ @page.confirm_button_that_reloads
45
+ end
46
+ end
47
+
36
48
  Then /^I should be able to get the confirm message$/ do
37
49
  @msg.should == 'set the value'
38
50
  end
@@ -0,0 +1,45 @@
1
+
2
+ When /^I retrieve the video element$/ do
3
+ @element = @page.video_id_element
4
+ end
5
+
6
+ When /^I search for the video element by "([^\"]*)"$/ do |how|
7
+ @element = @page.send "video_#{how}_element"
8
+ end
9
+
10
+ When /^I search for the video element by "([^\"]*)" and "([^\"]*)"$/ do |param1, param2|
11
+ @element = @page.send "video_#{param1}_#{param2}_element"
12
+ end
13
+
14
+ Then /^I should know the video is not autoplay$/ do
15
+ @element.should_not be_autoplay
16
+ end
17
+
18
+ Then /^I should know that the video is paused$/ do
19
+ @element.should be_paused
20
+ end
21
+
22
+ Then /^I should know that its height is (\d+) pixels$/ do |height|
23
+ @element.height.should == height.to_i
24
+ end
25
+
26
+ Then /^I should knot what its width is (\d+) pixels$/ do |width|
27
+ @element.width.should == width.to_i
28
+ end
29
+
30
+ Then /^I should know that it has not ended$/ do
31
+ @element.should_not be_ended
32
+ end
33
+
34
+ Then /^I should know that it is not seeking$/ do
35
+ @element.should_not be_seeking
36
+ end
37
+
38
+ Then /^I should know that it is not in a loop$/ do
39
+ @element.should_not be_loop
40
+ end
41
+
42
+ Then /^I should know that it is muted$/ do
43
+ @element.should_not be_muted
44
+ end
45
+
@@ -255,7 +255,9 @@ class Page
255
255
  paragraph(:p_name_index, :name => 'p_name', :index => 0)
256
256
 
257
257
  button(:alert_button, :id => 'alert_button')
258
+ button(:alert_button_that_reloads, :id => 'alert_button_that_reloads')
258
259
  button(:confirm_button, :id => 'confirm_button')
260
+ button(:confirm_button_that_reloads, :id => 'confirm_button_that_reloads')
259
261
  button(:prompt_button, :id => 'prompt_button')
260
262
 
261
263
  file_field(:file_field_id, :id => 'file_field_id')
@@ -302,6 +304,14 @@ class Page
302
304
  audio(:audio_xpath, :xpath => '//audio')
303
305
  audio(:audio_class_index, :class => 'audio', :index => 0)
304
306
  audio(:audio_name_index, :name => 'audio', :index => 0)
307
+
308
+ video(:video_id, :id => 'video')
309
+ video(:video_name, :name => 'video')
310
+ video(:video_class, :class => 'video')
311
+ video(:video_index, :index => 0)
312
+ video(:video_xpath, :xpath => '//video')
313
+ video(:video_class_index, :class => 'video', :index => 0)
314
+ video(:video_name_index, :name => 'video', :index => 0)
305
315
 
306
316
  element(:article_id, :article, :id => 'article_id')
307
317
  element(:header_id, :header, :id => 'header_id')
@@ -4,8 +4,9 @@ module PageObject
4
4
  @@browser = false
5
5
  def self.get_browser
6
6
  if !@@browser
7
- @@browser = Watir::Browser.new :firefox if ENV['DRIVER'] == 'WATIR'
8
- @@browser = Selenium::WebDriver.for :firefox if ENV['DRIVER'] == 'SELENIUM'
7
+ target_browser = ENV['BROWSER'].to_sym
8
+ @@browser = Watir::Browser.new target_browser if ENV['DRIVER'] == 'WATIR'
9
+ @@browser = Selenium::WebDriver.for target_browser if ENV['DRIVER'] == 'SELENIUM'
9
10
  end
10
11
  @@browser
11
12
  end
@@ -44,5 +44,9 @@ module UrlHelper
44
44
  def indexed
45
45
  "#{files}/indexed_property.html"
46
46
  end
47
+
48
+ def hover
49
+ "#{files}/hover.html"
50
+ end
47
51
  end
48
52
  end
@@ -0,0 +1,72 @@
1
+ Feature: Support for video element
2
+
3
+ Background:
4
+ Given I am on the static elements page
5
+
6
+ Scenario: finding an video element
7
+ When I retrieve the video element
8
+ Then I should know it exists
9
+ And I should know it is visible
10
+
11
+ Scenario Outline: Locating a video element on the page
12
+ When I search for the video 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 videos using multiple parameters
24
+ When I search for the video 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 video element
34
+ Then I should know the video is not autoplay
35
+
36
+ Scenario: Should know if the controls are displayed
37
+ When I retrieve the video 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 video element
42
+ Then I should know that the video is paused
43
+
44
+ Scenario: Should know its duration
45
+ When I retrieve the video element
46
+ Then I should know that the duration is greater than 12 seconds
47
+
48
+ Scenario: Should know its volume
49
+ When I retrieve the video element
50
+ Then I should know that its volume is 1
51
+
52
+ Scenario: Should know its height and width
53
+ When I retrieve the video element
54
+ Then I should know that its height is 240 pixels
55
+ And I should knot what its width is 320 pixels
56
+
57
+ Scenario: Should know if it has ended
58
+ When I retrieve the video element
59
+ Then I should know that it has not ended
60
+
61
+ Scenario: Should know if it is seeking
62
+ When I retrieve the video element
63
+ Then I should know that it is not seeking
64
+
65
+ Scenario: Should know if it is in a loop
66
+ When I retrieve the video element
67
+ Then I should know that it is not in a loop
68
+
69
+ Scenario: Should know if it is muted
70
+ When I retrieve the video element
71
+ Then I should know that it is muted
72
+
data/lib/page-object.rb CHANGED
@@ -3,6 +3,7 @@ require 'page-object/accessors'
3
3
  require 'page-object/platforms'
4
4
  require 'page-object/element_locators'
5
5
  require 'page-object/nested_elements'
6
+ require 'page-object/page_factory'
6
7
  require 'page-object/page_populator'
7
8
  require 'page-object/javascript_framework_facade'
8
9
  require 'page-object/indexed_properties'
@@ -1126,6 +1126,35 @@ module PageObject
1126
1126
  end
1127
1127
  end
1128
1128
 
1129
+ #
1130
+ # adds two methods - one to return the video element and another to check
1131
+ # the video's existence.
1132
+ #
1133
+ # @example
1134
+ # video(:movie, :id => 'video_id')
1135
+ # # will generate 'movie_element' and 'movie?' methods
1136
+ #
1137
+ # @param [Symbol] the name used for the generated methods
1138
+ # @param [Hash] identifier how we find a video element. You can use a multiple paramaters
1139
+ # by combining of any of the following except xpath. The valid keys are:
1140
+ # * :class => Watir and Selenium
1141
+ # * :id => Watir and Selenium
1142
+ # * :index => Watir and Selenium
1143
+ # * :name => Watir and Selenium
1144
+ # * :xpath => Watir and Selenium
1145
+ # @param optional block to be invoked when element method is called
1146
+ #
1147
+ def video(name, identifier={:index => 0}, &block)
1148
+ define_method("#{name}_element") do
1149
+ return call_block(&block) if block_given?
1150
+ platform.video_for(identifier.clone)
1151
+ end
1152
+ define_method("#{name}?") do
1153
+ return call_block(&block).exists? if block_given?
1154
+ platform.video_for(identifier.clone).exists?
1155
+ end
1156
+ end
1157
+
1129
1158
  #
1130
1159
  # adds three methods - one to retrieve the text of an element, another
1131
1160
  # to retrieve an element, and another to check the element's existence.
@@ -971,6 +971,36 @@ module PageObject
971
971
  platform.audios_for(identifier.clone)
972
972
  end
973
973
 
974
+ #
975
+ # Finds a video element
976
+ #
977
+ # @param [Hash] identifier how we find a video. You can use a multiple paramaters
978
+ # by combining of any of the following except xpath. It defaults to {:index => 0}
979
+ # which will return the first file field. The valid keys are:
980
+ # * :class => Watir and Selenium
981
+ # * :id => Watir and Selenium
982
+ # * :index => Watir and Selenium
983
+ # * :name => Watir and Selenium
984
+ # * :xpath => Watir and Selenium
985
+ def video_element(identifier={:index => 0})
986
+ platform.video_for(identifier.clone)
987
+ end
988
+
989
+ #
990
+ # Finds all video elements that match the provided identifier
991
+ #
992
+ # @param [Hash] identifier how we find a video element. You can use a multiple paramaters
993
+ # by combining of any of the following except xpath. It defaults to and empty Hash
994
+ # which will return all file fields. The valid keys are:
995
+ # * :class => Watir and Selenium
996
+ # * :id => Watir and Selenium
997
+ # * :index => Watir and Selenium
998
+ # * :name => Watir and Selenium
999
+ # * :xpath => Watir and Selenium
1000
+ def video_elements(identifier={})
1001
+ platform.videos_for(identifier.clone)
1002
+ end
1003
+
974
1004
  #
975
1005
  # Finds an element
976
1006
  #
@@ -52,6 +52,8 @@ require 'page-object/elements/label'
52
52
  require 'page-object/elements/file_field'
53
53
  require 'page-object/elements/area'
54
54
  require 'page-object/elements/canvas'
55
+ require 'page-object/elements/media'
55
56
  require 'page-object/elements/audio'
57
+ require 'page-object/elements/video'
56
58
 
57
59
 
@@ -1,30 +1,8 @@
1
1
 
2
2
  module PageObject
3
3
  module Elements
4
- class Audio < Element
4
+ class Audio < Media
5
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
6
  end
29
7
  ::PageObject::Elements.type_to_class[:audio] = ::PageObject::Elements::Audio
30
8
  end
@@ -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', 'canvas', 'audio'].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', 'video'].include? identifier[:tag_name] and identifier[:name]
109
109
  end
110
110
 
111
111
  def self.build_xpath_for identifier
@@ -0,0 +1,45 @@
1
+
2
+ module PageObject
3
+ module Elements
4
+ class Media < 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
+ def ended?
29
+ attribute(:ended)
30
+ end
31
+
32
+ def seeking?
33
+ attribute(:seeking)
34
+ end
35
+
36
+ def loop?
37
+ attribute(:loop)
38
+ end
39
+
40
+ def muted?
41
+ attribute(:muted)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,18 @@
1
+ module PageObject
2
+ module Elements
3
+ class Video < Media
4
+
5
+ def height
6
+ height = attribute(:height)
7
+ return height.to_i if height
8
+ end
9
+
10
+ def width
11
+ width = attribute(:width)
12
+ return width.to_i if width
13
+ end
14
+
15
+ end
16
+ ::PageObject::Elements.type_to_class[:video] = ::PageObject::Elements::Video
17
+ end
18
+ end
@@ -228,5 +228,13 @@ module PageObject
228
228
  def audio_elements(identifier={:index => 0})
229
229
  @platform.audios_for(identifier)
230
230
  end
231
+
232
+ def video_element(identifier={:index => 0})
233
+ @platform.video_for(identifier)
234
+ end
235
+
236
+ def video_elements(identifier={:index => 0})
237
+ @platform.video_for(identifier)
238
+ end
231
239
  end
232
240
  end
@@ -28,10 +28,10 @@ module PageObject
28
28
  #
29
29
  def flash
30
30
  original_color = attribute('backgroundColor')
31
- bridge = element.instance_variable_get(:@bridge)
31
+ the_bridge = bridge
32
32
  10.times do |n|
33
33
  color = (n % 2 == 0) ? 'red' : original_color
34
- bridge.executeScript("arguments[0].style.backgroundColor = '#{color}'", element)
34
+ the_bridge.executeScript("arguments[0].style.backgroundColor = '#{color}'", element)
35
35
  end
36
36
  end
37
37
 
@@ -109,16 +109,22 @@ module PageObject
109
109
  def fire_event(event_name)
110
110
  event_name = event_name.to_s.sub(/^on/, '').downcase
111
111
  script = "return (%s).apply(null, arguments)" % ATOMS.fetch(:fireEvent)
112
- bridge = element.instance_variable_get(:@bridge)
113
112
  bridge.executeScript(script, element, event_name)
114
113
  end
115
114
 
115
+ #
116
+ # hover over the element
117
+ #
118
+ def hover
119
+ mouse = Selenium::WebDriver::Mouse.new(bridge)
120
+ mouse.move_to(element)
121
+ end
122
+
116
123
  #
117
124
  # find the parent element
118
125
  #
119
126
  def parent
120
127
  script = "return (%s).apply(null, arguments)" % ATOMS.fetch(:getParentElement)
121
- bridge = element.instance_variable_get(:@bridge)
122
128
  parent = bridge.executeScript(script, element)
123
129
  type = element.attribute(:type).to_s.downcase if parent.tag_name.to_sym == :input
124
130
  cls = ::PageObject::Elements.element_class_for(parent.tag_name, type)
@@ -129,7 +135,6 @@ module PageObject
129
135
  # Set the focus to the current element
130
136
  #
131
137
  def focus
132
- bridge = element.instance_variable_get(:@bridge)
133
138
  bridge.executeScript("return arguments[0].focus()", element)
134
139
  end
135
140
 
@@ -233,6 +238,19 @@ module PageObject
233
238
  def clear
234
239
  element.clear
235
240
  end
241
+
242
+ #
243
+ # get the id of the element
244
+ #
245
+ def id
246
+ attribute(:id)
247
+ end
248
+
249
+ private
250
+
251
+ def bridge
252
+ bridge = element.instance_variable_get(:@bridge)
253
+ end
236
254
  end
237
255
  end
238
256
  end
@@ -70,9 +70,11 @@ module PageObject
70
70
  # See PageObject#alert
71
71
  #
72
72
  def alert(frame=nil, &block)
73
- @browser.execute_script "window.alert = function(msg) { window.__lastWatirAlert = msg; }"
74
73
  yield
75
- @browser.execute_script "return window.__lastWatirAlert"
74
+ alert = @browser.switch_to.alert
75
+ value = alert.text
76
+ alert.accept
77
+ value
76
78
  end
77
79
 
78
80
  #
@@ -80,9 +82,11 @@ module PageObject
80
82
  # See PageObject#confirm
81
83
  #
82
84
  def confirm(response, frame=nil, &block)
83
- @browser.execute_script "window.confirm = function(msg) { window.__lastWatirConfirm = msg; return #{!!response} }"
84
85
  yield
85
- @browser.execute_script "return window.__lastWatirConfirm"
86
+ alert = @browser.switch_to.alert
87
+ value = alert.text
88
+ response ? alert.accept : alert.dismiss
89
+ value
86
90
  end
87
91
 
88
92
  #
@@ -914,6 +918,20 @@ module PageObject
914
918
  find_selenium_elements(identifier, Elements::Audio, 'audio')
915
919
  end
916
920
 
921
+ #
922
+ # platform method to retrieve a video element
923
+ #
924
+ def video_for(identifier)
925
+ find_selenium_element(identifier, Elements::Video, 'video')
926
+ end
927
+
928
+ #
929
+ # platform method to return an array of video elements
930
+ #
931
+ def videos_for(identifier)
932
+ find_selenium_elements(identifier, Elements::Video, 'video')
933
+ end
934
+
917
935
  #
918
936
  # platform method to retrieve a generic element
919
937
  # See PageObject::Accessors#element
@@ -102,6 +102,13 @@ module PageObject
102
102
  element.fire_event(event_name)
103
103
  end
104
104
 
105
+ #
106
+ # hover over the element
107
+ #
108
+ def hover
109
+ element.hover
110
+ end
111
+
105
112
  #
106
113
  # find the parent element
107
114
  #
@@ -197,6 +204,13 @@ module PageObject
197
204
  def clear
198
205
  element.clear
199
206
  end
207
+
208
+ #
209
+ # get the id of the element
210
+ #
211
+ def id
212
+ element.id
213
+ end
200
214
  end
201
215
  end
202
216
  end
@@ -71,9 +71,9 @@ module PageObject
71
71
  #
72
72
  def alert(frame=nil, &block)
73
73
  switch_to_frame(frame)
74
- @browser.wd.execute_script "window.alert = function(msg) { window.__lastWatirAlert = msg; }"
75
74
  yield
76
- value = @browser.wd.execute_script "return window.__lastWatirAlert"
75
+ value = @browser.alert.text
76
+ @browser.alert.ok
77
77
  switch_to_default_content(frame)
78
78
  value
79
79
  end
@@ -84,9 +84,9 @@ module PageObject
84
84
  #
85
85
  def confirm(response, frame=nil, &block)
86
86
  switch_to_frame(frame)
87
- @browser.wd.execute_script "window.confirm = function(msg) { window.__lastWatirConfirm = msg; return #{!!response} }"
88
87
  yield
89
- value = @browser.wd.execute_script "return window.__lastWatirConfirm"
88
+ value = @browser.alert.text
89
+ response ? @browser.alert.ok : @browser.alert.close
90
90
  switch_to_default_content(frame)
91
91
  value
92
92
  end
@@ -855,6 +855,20 @@ module PageObject
855
855
  find_watir_elements("audios(identifier)", Elements::Audio, identifier, 'audio')
856
856
  end
857
857
 
858
+ #
859
+ # platform method to retrieve a video element
860
+ #
861
+ def video_for(identifier)
862
+ find_watir_element("video(identifier)", Elements::Video, identifier, 'video')
863
+ end
864
+
865
+ #
866
+ # platform method to retrieve an array of video elements
867
+ #
868
+ def videos_for(identifier)
869
+ find_watir_elements("videos(identifier)", Elements::Video, identifier, 'video')
870
+ end
871
+
858
872
  #
859
873
  # platform method to return a PageObject::Elements::Element element
860
874
  # See PageObject::Accessors#elem
@@ -1,4 +1,4 @@
1
1
  module PageObject
2
2
  # @private
3
- VERSION = "0.7.2"
3
+ VERSION = "0.7.3"
4
4
  end
@@ -651,6 +651,28 @@ describe PageObject::ElementLocators do
651
651
  watir_page_object.audio_elements
652
652
  end
653
653
 
654
+ it "should find a video element" do
655
+ watir_browser.should_receive(:video).with(:id => 'blah').and_return(watir_browser)
656
+ element = watir_page_object.video_element(:id => 'blah')
657
+ element.should be_instance_of PageObject::Elements::Video
658
+ end
659
+
660
+ it "should find a video element using a default identifier" do
661
+ watir_browser.should_receive(:video).with(:index => 0).and_return(watir_browser)
662
+ watir_page_object.video_element
663
+ end
664
+
665
+ it "should find all video elements" do
666
+ watir_browser.should_receive(:videos).with(:id => 'blah').and_return([watir_browser])
667
+ elements = watir_page_object.video_elements(:id => 'blah')
668
+ elements[0].should be_instance_of PageObject::Elements::Video
669
+ end
670
+
671
+ it "should find all video elements with no identifier" do
672
+ watir_browser.should_receive(:videos).with({}).and_return([watir_browser])
673
+ watir_page_object.video_elements
674
+ end
675
+
654
676
  it "should find an element" do
655
677
  watir_browser.should_receive(:audio).with(:id => 'blah').and_return(watir_browser)
656
678
  element = watir_page_object.element(:audio, :id => 'blah')
@@ -123,15 +123,17 @@ describe PageObject do
123
123
  end
124
124
 
125
125
  it "should override alert popup behavior" do
126
- watir_browser.should_receive(:wd).twice.and_return(watir_browser)
127
- watir_browser.should_receive(:execute_script).twice
126
+ watir_browser.should_receive(:alert).twice.and_return(watir_browser)
127
+ watir_browser.should_receive(:text)
128
+ watir_browser.should_receive(:ok)
128
129
  watir_page_object.alert do
129
130
  end
130
131
  end
131
132
 
132
133
  it "should override confirm popup behavior" do
133
- watir_browser.should_receive(:wd).twice.and_return(watir_browser)
134
- watir_browser.should_receive(:execute_script).twice
134
+ watir_browser.should_receive(:alert).twice.and_return(watir_browser)
135
+ watir_browser.should_receive(:text)
136
+ watir_browser.should_receive(:ok)
135
137
  watir_page_object.confirm(true) do
136
138
  end
137
139
  end
@@ -233,13 +235,19 @@ describe PageObject do
233
235
  end
234
236
 
235
237
  it "should override alert popup behavior" do
236
- selenium_browser.should_receive(:execute_script).twice
238
+ selenium_browser.should_receive(:switch_to).and_return(selenium_browser)
239
+ selenium_browser.should_receive(:alert).and_return(selenium_browser)
240
+ selenium_browser.should_receive(:text)
241
+ selenium_browser.should_receive(:accept)
237
242
  selenium_page_object.alert do
238
243
  end
239
244
  end
240
245
 
241
246
  it "should override confirm popup behavior" do
242
- selenium_browser.should_receive(:execute_script).twice
247
+ selenium_browser.should_receive(:switch_to).and_return(selenium_browser)
248
+ selenium_browser.should_receive(:alert).and_return(selenium_browser)
249
+ selenium_browser.should_receive(:text)
250
+ selenium_browser.should_receive(:accept)
243
251
  selenium_page_object.confirm(true) do
244
252
  end
245
253
  end
@@ -34,6 +34,7 @@ class SeleniumAccessorsTestPageObject
34
34
  area(:img_area, :id => 'area')
35
35
  canvas(:my_canvas, :id => 'canvas')
36
36
  audio(:acdc, :id => 'audio_id')
37
+ video(:movie, :id => 'movie_id')
37
38
  end
38
39
 
39
40
  class SeleniumBlockPageObject
@@ -125,6 +126,9 @@ class SeleniumBlockPageObject
125
126
  audio :acdc do |element|
126
127
  'audio'
127
128
  end
129
+ video :movie do |element|
130
+ 'video'
131
+ end
128
132
  end
129
133
 
130
134
  describe PageObject::Accessors do
@@ -563,4 +567,16 @@ describe PageObject::Accessors do
563
567
  end
564
568
  end
565
569
  end
570
+
571
+ describe "video accessors" do
572
+ context "when called on a page object" do
573
+ it "should generate accessor methods" do
574
+ selenium_page_object.should respond_to(:movie_element)
575
+ end
576
+
577
+ it "should call a block on the elmenet method when present" do
578
+ block_page_object.movie_element.should == "video"
579
+ end
580
+ end
581
+ end
566
582
  end
@@ -34,6 +34,7 @@ class WatirAccessorsTestPageObject
34
34
  area(:img_area, :id => 'area')
35
35
  canvas(:my_canvas, :id => 'canvas_id')
36
36
  audio(:acdc, :id => 'audio_id')
37
+ video(:movie, :id => 'video_id')
37
38
  end
38
39
 
39
40
  class WatirBlockPageObject
@@ -125,6 +126,9 @@ class WatirBlockPageObject
125
126
  audio :acdc do |element|
126
127
  "audio"
127
128
  end
129
+ video :movie do |element|
130
+ "video"
131
+ end
128
132
  end
129
133
 
130
134
  describe PageObject::Accessors do
@@ -1086,4 +1090,16 @@ describe PageObject::Accessors do
1086
1090
  end
1087
1091
  end
1088
1092
  end
1093
+
1094
+ describe "video accessors" do
1095
+ context "when called on a page object" do
1096
+ it "should generate accessor methods" do
1097
+ watir_page_object.should respond_to(:movie_element)
1098
+ end
1099
+
1100
+ it "should call a block on the element method when present" do
1101
+ block_page_object.movie_element.should == "video"
1102
+ end
1103
+ end
1104
+ end
1089
1105
  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.2
4
+ version: 0.7.3
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-08-02 00:00:00.000000000 Z
12
+ date: 2012-08-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: watir-webdriver
@@ -144,6 +144,7 @@ files:
144
144
  - features/html/frame_2.html
145
145
  - features/html/frame_3.html
146
146
  - features/html/frames.html
147
+ - features/html/hover.html
147
148
  - features/html/iframes.html
148
149
  - features/html/images/circle.png
149
150
  - features/html/images/submit.gif
@@ -175,8 +176,12 @@ files:
175
176
  - features/page_level_actions.feature
176
177
  - features/paragraph.feature
177
178
  - features/radio_button.feature
179
+ - features/sample-app/public/04-Death_Becomes_Fur.mp4
180
+ - features/sample-app/public/04-Death_Becomes_Fur.oga
178
181
  - features/sample-app/public/jquery-1.3.2.js
179
182
  - features/sample-app/public/jquery.html
183
+ - features/sample-app/public/movie.mp4
184
+ - features/sample-app/public/movie.ogg
180
185
  - features/sample-app/public/prototype-1.6.0.3.js
181
186
  - features/sample-app/public/prototype.html
182
187
  - features/sample-app/sample_app.rb
@@ -218,6 +223,7 @@ files:
218
223
  - features/step_definitions/text_area_steps.rb
219
224
  - features/step_definitions/text_field_steps.rb
220
225
  - features/step_definitions/unordered_list_steps.rb
226
+ - features/step_definitions/video_steps.rb
221
227
  - features/support/ajax_text_environment.rb
222
228
  - features/support/env.rb
223
229
  - features/support/hooks.rb
@@ -229,6 +235,7 @@ files:
229
235
  - features/text_area.feature
230
236
  - features/text_field.feature
231
237
  - features/unordered_list.feature
238
+ - features/video.feature
232
239
  - lib/page-object.rb
233
240
  - lib/page-object/accessors.rb
234
241
  - lib/page-object/core_ext/string.rb
@@ -249,6 +256,7 @@ files:
249
256
  - lib/page-object/elements/label.rb
250
257
  - lib/page-object/elements/link.rb
251
258
  - lib/page-object/elements/list_item.rb
259
+ - lib/page-object/elements/media.rb
252
260
  - lib/page-object/elements/option.rb
253
261
  - lib/page-object/elements/ordered_list.rb
254
262
  - lib/page-object/elements/paragraph.rb
@@ -261,6 +269,7 @@ files:
261
269
  - lib/page-object/elements/text_area.rb
262
270
  - lib/page-object/elements/text_field.rb
263
271
  - lib/page-object/elements/unordered_list.rb
272
+ - lib/page-object/elements/video.rb
264
273
  - lib/page-object/indexed_properties.rb
265
274
  - lib/page-object/javascript/jquery.rb
266
275
  - lib/page-object/javascript/prototype.rb
@@ -361,7 +370,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
361
370
  version: '0'
362
371
  segments:
363
372
  - 0
364
- hash: -4250086403219071004
373
+ hash: 2357863127966397985
365
374
  required_rubygems_version: !ruby/object:Gem::Requirement
366
375
  none: false
367
376
  requirements:
@@ -370,7 +379,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
370
379
  version: '0'
371
380
  segments:
372
381
  - 0
373
- hash: -4250086403219071004
382
+ hash: 2357863127966397985
374
383
  requirements: []
375
384
  rubyforge_project: page-object
376
385
  rubygems_version: 1.8.24
@@ -397,6 +406,7 @@ test_files:
397
406
  - features/html/frame_2.html
398
407
  - features/html/frame_3.html
399
408
  - features/html/frames.html
409
+ - features/html/hover.html
400
410
  - features/html/iframes.html
401
411
  - features/html/images/circle.png
402
412
  - features/html/images/submit.gif
@@ -428,8 +438,12 @@ test_files:
428
438
  - features/page_level_actions.feature
429
439
  - features/paragraph.feature
430
440
  - features/radio_button.feature
441
+ - features/sample-app/public/04-Death_Becomes_Fur.mp4
442
+ - features/sample-app/public/04-Death_Becomes_Fur.oga
431
443
  - features/sample-app/public/jquery-1.3.2.js
432
444
  - features/sample-app/public/jquery.html
445
+ - features/sample-app/public/movie.mp4
446
+ - features/sample-app/public/movie.ogg
433
447
  - features/sample-app/public/prototype-1.6.0.3.js
434
448
  - features/sample-app/public/prototype.html
435
449
  - features/sample-app/sample_app.rb
@@ -471,6 +485,7 @@ test_files:
471
485
  - features/step_definitions/text_area_steps.rb
472
486
  - features/step_definitions/text_field_steps.rb
473
487
  - features/step_definitions/unordered_list_steps.rb
488
+ - features/step_definitions/video_steps.rb
474
489
  - features/support/ajax_text_environment.rb
475
490
  - features/support/env.rb
476
491
  - features/support/hooks.rb
@@ -482,6 +497,7 @@ test_files:
482
497
  - features/text_area.feature
483
498
  - features/text_field.feature
484
499
  - features/unordered_list.feature
500
+ - features/video.feature
485
501
  - spec/page-object/element_locators_spec.rb
486
502
  - spec/page-object/elements/area_spec.rb
487
503
  - spec/page-object/elements/button_spec.rb