bbc-selenium-webdriver 1.17.0

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 (168) hide show
  1. data/CHANGES +473 -0
  2. data/README +31 -0
  3. data/lib/selenium-client.rb +2 -0
  4. data/lib/selenium-webdriver.rb +1 -0
  5. data/lib/selenium/client.rb +37 -0
  6. data/lib/selenium/client/base.rb +118 -0
  7. data/lib/selenium/client/driver.rb +10 -0
  8. data/lib/selenium/client/errors.rb +9 -0
  9. data/lib/selenium/client/extensions.rb +118 -0
  10. data/lib/selenium/client/idiomatic.rb +488 -0
  11. data/lib/selenium/client/javascript_expression_builder.rb +116 -0
  12. data/lib/selenium/client/javascript_frameworks/jquery.rb +13 -0
  13. data/lib/selenium/client/javascript_frameworks/prototype.rb +13 -0
  14. data/lib/selenium/client/legacy_driver.rb +1720 -0
  15. data/lib/selenium/client/protocol.rb +104 -0
  16. data/lib/selenium/client/selenium_helper.rb +34 -0
  17. data/lib/selenium/rake/server_task.rb +157 -0
  18. data/lib/selenium/server.rb +223 -0
  19. data/lib/selenium/webdriver.rb +64 -0
  20. data/lib/selenium/webdriver/android.rb +9 -0
  21. data/lib/selenium/webdriver/android/bridge.rb +51 -0
  22. data/lib/selenium/webdriver/chrome.rb +26 -0
  23. data/lib/selenium/webdriver/chrome/bridge.rb +106 -0
  24. data/lib/selenium/webdriver/chrome/profile.rb +83 -0
  25. data/lib/selenium/webdriver/chrome/service.rb +74 -0
  26. data/lib/selenium/webdriver/common.rb +30 -0
  27. data/lib/selenium/webdriver/common/action_builder.rb +352 -0
  28. data/lib/selenium/webdriver/common/alert.rb +26 -0
  29. data/lib/selenium/webdriver/common/bridge_helper.rb +67 -0
  30. data/lib/selenium/webdriver/common/core_ext/base64.rb +9 -0
  31. data/lib/selenium/webdriver/common/core_ext/dir.rb +42 -0
  32. data/lib/selenium/webdriver/common/core_ext/string.rb +5 -0
  33. data/lib/selenium/webdriver/common/driver.rb +301 -0
  34. data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +39 -0
  35. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +44 -0
  36. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +43 -0
  37. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +46 -0
  38. data/lib/selenium/webdriver/common/element.rb +262 -0
  39. data/lib/selenium/webdriver/common/error.rb +212 -0
  40. data/lib/selenium/webdriver/common/file_reaper.rb +47 -0
  41. data/lib/selenium/webdriver/common/keyboard.rb +52 -0
  42. data/lib/selenium/webdriver/common/keys.rb +109 -0
  43. data/lib/selenium/webdriver/common/mouse.rb +65 -0
  44. data/lib/selenium/webdriver/common/navigation.rb +43 -0
  45. data/lib/selenium/webdriver/common/options.rb +128 -0
  46. data/lib/selenium/webdriver/common/platform.rb +166 -0
  47. data/lib/selenium/webdriver/common/port_prober.rb +25 -0
  48. data/lib/selenium/webdriver/common/profile_helper.rb +67 -0
  49. data/lib/selenium/webdriver/common/proxy.rb +120 -0
  50. data/lib/selenium/webdriver/common/search_context.rb +92 -0
  51. data/lib/selenium/webdriver/common/socket_poller.rb +100 -0
  52. data/lib/selenium/webdriver/common/target_locator.rb +81 -0
  53. data/lib/selenium/webdriver/common/timeouts.rb +29 -0
  54. data/lib/selenium/webdriver/common/wait.rb +60 -0
  55. data/lib/selenium/webdriver/common/window.rb +96 -0
  56. data/lib/selenium/webdriver/common/zipper.rb +82 -0
  57. data/lib/selenium/webdriver/firefox.rb +37 -0
  58. data/lib/selenium/webdriver/firefox/binary.rb +161 -0
  59. data/lib/selenium/webdriver/firefox/bridge.rb +58 -0
  60. data/lib/selenium/webdriver/firefox/extension.rb +52 -0
  61. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  62. data/lib/selenium/webdriver/firefox/launcher.rb +104 -0
  63. data/lib/selenium/webdriver/firefox/native/linux/amd64/x_ignore_nofocus.so +0 -0
  64. data/lib/selenium/webdriver/firefox/native/linux/x86/x_ignore_nofocus.so +0 -0
  65. data/lib/selenium/webdriver/firefox/profile.rb +315 -0
  66. data/lib/selenium/webdriver/firefox/profiles_ini.rb +62 -0
  67. data/lib/selenium/webdriver/firefox/socket_lock.rb +61 -0
  68. data/lib/selenium/webdriver/firefox/util.rb +29 -0
  69. data/lib/selenium/webdriver/ie.rb +19 -0
  70. data/lib/selenium/webdriver/ie/bridge.rb +60 -0
  71. data/lib/selenium/webdriver/ie/native/win32/IEDriver.dll +0 -0
  72. data/lib/selenium/webdriver/ie/native/x64/IEDriver.dll +0 -0
  73. data/lib/selenium/webdriver/ie/server.rb +64 -0
  74. data/lib/selenium/webdriver/iphone.rb +9 -0
  75. data/lib/selenium/webdriver/iphone/bridge.rb +50 -0
  76. data/lib/selenium/webdriver/opera.rb +24 -0
  77. data/lib/selenium/webdriver/opera/bridge.rb +113 -0
  78. data/lib/selenium/webdriver/opera/service.rb +49 -0
  79. data/lib/selenium/webdriver/remote.rb +21 -0
  80. data/lib/selenium/webdriver/remote/bridge.rb +473 -0
  81. data/lib/selenium/webdriver/remote/capabilities.rb +241 -0
  82. data/lib/selenium/webdriver/remote/commands.rb +181 -0
  83. data/lib/selenium/webdriver/remote/http/common.rb +74 -0
  84. data/lib/selenium/webdriver/remote/http/curb.rb +79 -0
  85. data/lib/selenium/webdriver/remote/http/default.rb +102 -0
  86. data/lib/selenium/webdriver/remote/http/persistent.rb +38 -0
  87. data/lib/selenium/webdriver/remote/response.rb +99 -0
  88. data/lib/selenium/webdriver/remote/server_error.rb +17 -0
  89. data/lib/selenium/webdriver/support.rb +4 -0
  90. data/lib/selenium/webdriver/support/abstract_event_listener.rb +28 -0
  91. data/lib/selenium/webdriver/support/block_event_listener.rb +17 -0
  92. data/lib/selenium/webdriver/support/event_firing_bridge.rb +112 -0
  93. data/lib/selenium/webdriver/support/select.rb +293 -0
  94. data/spec/integration/selenium/client/api/backward_compatible_api_spec.rb +22 -0
  95. data/spec/integration/selenium/client/api/browser_xpath_library_spec.rb +17 -0
  96. data/spec/integration/selenium/client/api/click_spec.rb +39 -0
  97. data/spec/integration/selenium/client/api/cookie_spec.rb +39 -0
  98. data/spec/integration/selenium/client/api/element_spec.rb +14 -0
  99. data/spec/integration/selenium/client/api/highlight_located_element_spec.rb +19 -0
  100. data/spec/integration/selenium/client/api/retrieve_last_remote_control_logs_spec.rb +33 -0
  101. data/spec/integration/selenium/client/api/screenshot_spec.rb +29 -0
  102. data/spec/integration/selenium/client/api/select_window_spec.rb +46 -0
  103. data/spec/integration/selenium/client/api/start_stop_spec.rb +9 -0
  104. data/spec/integration/selenium/client/api/wait_for_ajax_spec.rb +27 -0
  105. data/spec/integration/selenium/client/api/wait_for_element_spec.rb +56 -0
  106. data/spec/integration/selenium/client/api/wait_for_field_value_spec.rb +52 -0
  107. data/spec/integration/selenium/client/api/wait_for_text_spec.rb +98 -0
  108. data/spec/integration/selenium/client/sample-app/public/jquery-1.3.2.js +4376 -0
  109. data/spec/integration/selenium/client/sample-app/public/jquery.html +55 -0
  110. data/spec/integration/selenium/client/sample-app/public/prototype-1.6.0.3.js +4320 -0
  111. data/spec/integration/selenium/client/sample-app/public/prototype.html +59 -0
  112. data/spec/integration/selenium/client/sample-app/sample_app.rb +32 -0
  113. data/spec/integration/selenium/client/spec_helper.rb +125 -0
  114. data/spec/integration/selenium/webdriver/chrome/driver_spec.rb +28 -0
  115. data/spec/integration/selenium/webdriver/chrome/profile_spec.rb +42 -0
  116. data/spec/integration/selenium/webdriver/driver_spec.rb +253 -0
  117. data/spec/integration/selenium/webdriver/element_spec.rb +185 -0
  118. data/spec/integration/selenium/webdriver/error_spec.rb +30 -0
  119. data/spec/integration/selenium/webdriver/firefox/driver_spec.rb +21 -0
  120. data/spec/integration/selenium/webdriver/firefox/profile_spec.rb +141 -0
  121. data/spec/integration/selenium/webdriver/keyboard_spec.rb +57 -0
  122. data/spec/integration/selenium/webdriver/mouse_spec.rb +55 -0
  123. data/spec/integration/selenium/webdriver/navigation_spec.rb +44 -0
  124. data/spec/integration/selenium/webdriver/opera/driver_spec.rb +47 -0
  125. data/spec/integration/selenium/webdriver/options_spec.rb +49 -0
  126. data/spec/integration/selenium/webdriver/remote/element_spec.rb +24 -0
  127. data/spec/integration/selenium/webdriver/spec_helper.rb +44 -0
  128. data/spec/integration/selenium/webdriver/spec_support.rb +13 -0
  129. data/spec/integration/selenium/webdriver/spec_support/guards.rb +86 -0
  130. data/spec/integration/selenium/webdriver/spec_support/helpers.rb +46 -0
  131. data/spec/integration/selenium/webdriver/spec_support/jruby_test_environment.rb +29 -0
  132. data/spec/integration/selenium/webdriver/spec_support/rack_server.rb +123 -0
  133. data/spec/integration/selenium/webdriver/spec_support/test_environment.rb +199 -0
  134. data/spec/integration/selenium/webdriver/target_locator_spec.rb +170 -0
  135. data/spec/integration/selenium/webdriver/timeout_spec.rb +56 -0
  136. data/spec/integration/selenium/webdriver/window_spec.rb +56 -0
  137. data/spec/integration/selenium/webdriver/zipper_spec.rb +66 -0
  138. data/spec/unit/selenium/client/base_spec.rb +239 -0
  139. data/spec/unit/selenium/client/extensions_spec.rb +174 -0
  140. data/spec/unit/selenium/client/idiomatic_spec.rb +500 -0
  141. data/spec/unit/selenium/client/javascript_expression_builder_spec.rb +79 -0
  142. data/spec/unit/selenium/client/javascript_frameworks/jquery_spec.rb +10 -0
  143. data/spec/unit/selenium/client/javascript_frameworks/prototype_spec.rb +10 -0
  144. data/spec/unit/selenium/client/protocol_spec.rb +124 -0
  145. data/spec/unit/selenium/client/selenium_helper_spec.rb +56 -0
  146. data/spec/unit/selenium/client/spec_helper.rb +24 -0
  147. data/spec/unit/selenium/rake/task_spec.rb +79 -0
  148. data/spec/unit/selenium/server_spec.rb +131 -0
  149. data/spec/unit/selenium/webdriver/action_builder_spec.rb +90 -0
  150. data/spec/unit/selenium/webdriver/android/bridge_spec.rb +31 -0
  151. data/spec/unit/selenium/webdriver/chrome/bridge_spec.rb +94 -0
  152. data/spec/unit/selenium/webdriver/chrome/profile_spec.rb +57 -0
  153. data/spec/unit/selenium/webdriver/chrome/service_spec.rb +44 -0
  154. data/spec/unit/selenium/webdriver/error_spec.rb +41 -0
  155. data/spec/unit/selenium/webdriver/firefox/bridge_spec.rb +17 -0
  156. data/spec/unit/selenium/webdriver/iphone/bridge_spec.rb +30 -0
  157. data/spec/unit/selenium/webdriver/proxy_spec.rb +87 -0
  158. data/spec/unit/selenium/webdriver/remote/bridge_spec.rb +16 -0
  159. data/spec/unit/selenium/webdriver/remote/capabilities_spec.rb +111 -0
  160. data/spec/unit/selenium/webdriver/remote/http/common_spec.rb +24 -0
  161. data/spec/unit/selenium/webdriver/remote/http/default_spec.rb +46 -0
  162. data/spec/unit/selenium/webdriver/search_context_spec.rb +61 -0
  163. data/spec/unit/selenium/webdriver/socket_poller_spec.rb +68 -0
  164. data/spec/unit/selenium/webdriver/spec_helper.rb +6 -0
  165. data/spec/unit/selenium/webdriver/support/event_firing_spec.rb +111 -0
  166. data/spec/unit/selenium/webdriver/support/select_spec.rb +290 -0
  167. data/spec/unit/selenium/webdriver/wait_spec.rb +40 -0
  168. metadata +215 -0
@@ -0,0 +1,42 @@
1
+ class Dir
2
+ # @api private
3
+ def self.mktmpdir(prefix_suffix=nil, tmpdir=nil)
4
+ case prefix_suffix
5
+ when nil
6
+ prefix = "d"
7
+ suffix = ""
8
+ when String
9
+ prefix = prefix_suffix
10
+ suffix = ""
11
+ when Array
12
+ prefix = prefix_suffix[0]
13
+ suffix = prefix_suffix[1]
14
+ else
15
+ raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
16
+ end
17
+ tmpdir ||= Dir.tmpdir
18
+ t = Time.now.strftime("%Y%m%d")
19
+ n = nil
20
+ begin
21
+ path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
22
+ path << "-#{n}" if n
23
+ path << suffix
24
+ Dir.mkdir(path, 0700)
25
+ rescue Errno::EEXIST
26
+ n ||= 0
27
+ n += 1
28
+ retry
29
+ end
30
+
31
+ if block_given?
32
+ begin
33
+ yield path
34
+ ensure
35
+ FileUtils.remove_entry_secure path
36
+ end
37
+ else
38
+ path
39
+ end
40
+ end unless respond_to? :mktmpdir # > 1.8.7
41
+ end
42
+
@@ -0,0 +1,5 @@
1
+ unless '1.9'.respond_to?(:bytesize)
2
+ class String
3
+ alias :bytesize :size
4
+ end
5
+ end
@@ -0,0 +1,301 @@
1
+ module Selenium
2
+ module WebDriver
3
+
4
+ #
5
+ # The main class through which you control the browser.
6
+ #
7
+ # @see SearchContext
8
+ # @see Navigation
9
+ # @see TargetLocator
10
+ # @see Options
11
+ #
12
+
13
+ class Driver
14
+ include SearchContext
15
+
16
+ class << self
17
+
18
+ #
19
+ # @api private
20
+ #
21
+ # @see Selenium::WebDriver.for
22
+ #
23
+ # @return [Driver]
24
+ #
25
+
26
+ def for(browser, opts = {})
27
+ listener = opts.delete(:listener)
28
+
29
+ bridge = case browser
30
+ when :firefox, :ff
31
+ Firefox::Bridge.new(opts)
32
+ when :remote
33
+ Remote::Bridge.new(opts)
34
+ when :ie, :internet_explorer
35
+ IE::Bridge.new(opts)
36
+ when :chrome
37
+ Chrome::Bridge.new(opts)
38
+ when :android
39
+ Android::Bridge.new(opts)
40
+ when :iphone
41
+ IPhone::Bridge.new(opts)
42
+ when :opera
43
+ Opera::Bridge.new(opts)
44
+ else
45
+ raise ArgumentError, "unknown driver: #{browser.inspect}"
46
+ end
47
+
48
+ bridge = Support::EventFiringBridge.new(bridge, listener) if listener
49
+
50
+ new(bridge)
51
+ end
52
+ end
53
+
54
+ #
55
+ # A new Driver instance with the given bridge.
56
+ # End users should use Selenium::WebDriver.for instead of using this directly.
57
+ #
58
+ # @api private
59
+ #
60
+
61
+ def initialize(bridge)
62
+ @bridge = bridge
63
+
64
+ # TODO: refactor this away
65
+ unless bridge.driver_extensions.empty?
66
+ extend(*bridge.driver_extensions)
67
+ end
68
+ end
69
+
70
+ def inspect
71
+ '#<%s:0x%x browser=%s>' % [self.class, hash*2, bridge.browser.inspect]
72
+ end
73
+
74
+ #
75
+ # @return [Navigation]
76
+ # @see Navigation
77
+ #
78
+
79
+ def navigate
80
+ @navigate ||= WebDriver::Navigation.new(bridge)
81
+ end
82
+
83
+ #
84
+ # @return [TargetLocator]
85
+ # @see TargetLocator
86
+ #
87
+
88
+ def switch_to
89
+ @switch_to ||= WebDriver::TargetLocator.new(bridge)
90
+ end
91
+
92
+ #
93
+ # @return [Options]
94
+ # @see Options
95
+ #
96
+
97
+ def manage
98
+ @manage ||= WebDriver::Options.new(bridge)
99
+ end
100
+
101
+ #
102
+ # Opens the specified URL in the browser.
103
+ #
104
+
105
+ def get(url)
106
+ navigate.to(url)
107
+ end
108
+
109
+ #
110
+ # Get the URL of the current page
111
+ #
112
+ # @return [String]
113
+ #
114
+
115
+ def current_url
116
+ bridge.getCurrentUrl
117
+ end
118
+
119
+ #
120
+ # Get the title of the current page
121
+ #
122
+ # @return [String]
123
+ #
124
+
125
+ def title
126
+ bridge.getTitle
127
+ end
128
+
129
+ #
130
+ # Get the source of the current page
131
+ #
132
+ # @return [String]
133
+ #
134
+
135
+ def page_source
136
+ bridge.getPageSource
137
+ end
138
+
139
+ #
140
+ # Get the visibility of the browser. Not applicable for all browsers.
141
+ #
142
+ # @return [Boolean]
143
+ #
144
+
145
+ def visible?
146
+ bridge.getBrowserVisible
147
+ end
148
+
149
+ #
150
+ # Set the visibility of the browser. Not applicable for all browsers.
151
+ #
152
+ # @param [Boolean]
153
+ #
154
+
155
+ def visible=(bool)
156
+ bridge.setBrowserVisible bool
157
+ end
158
+
159
+ #
160
+ # Quit the browser
161
+ #
162
+
163
+ def quit
164
+ bridge.quit
165
+ end
166
+
167
+ #
168
+ # Close the current window, or the browser if no windows are left.
169
+ #
170
+
171
+ def close
172
+ bridge.close
173
+ end
174
+
175
+ #
176
+ # Get the window handles of open browser windows.
177
+ #
178
+ # @return [Array]
179
+ # @see TargetLocator#window
180
+ #
181
+
182
+ def window_handles
183
+ bridge.getWindowHandles
184
+ end
185
+
186
+ #
187
+ # Get the current window handle
188
+ #
189
+ # @return [String]
190
+ #
191
+
192
+ def window_handle
193
+ bridge.getCurrentWindowHandle
194
+ end
195
+
196
+ def rotation(orientation)
197
+ bridge.setScreenOrientation(orientation)
198
+ end
199
+
200
+ #
201
+ # Execute the given JavaScript
202
+ #
203
+ # @param [String] script
204
+ # JavaScript source to execute
205
+ # @param [WebDriver::Element,Integer, Float, Boolean, NilClass, String, Array] *args
206
+ # Arguments will be available in the given script in the 'arguments' pseudo-array.
207
+ #
208
+ # @return [WebDriver::Element,Integer,Float,Boolean,NilClass,String,Array]
209
+ # The value returned from the script.
210
+ #
211
+
212
+ def execute_script(script, *args)
213
+ bridge.executeScript(script, *args)
214
+ end
215
+
216
+ # Execute an asynchronous piece of JavaScript in the context of the
217
+ # currently selected frame or window. Unlike executing
218
+ # execute_script (synchronous JavaScript), scripts
219
+ # executed with this method must explicitly signal they are finished by
220
+ # invoking the provided callback. This callback is always injected into the
221
+ # executed function as the last argument.
222
+ #
223
+ # @param [String] script
224
+ # JavaSCript source to execute
225
+ # @param [WebDriver::Element,Integer, Float, Boolean, NilClass, String, Array] *args
226
+ # Arguments to the script. May be empty.
227
+ #
228
+ # @return [WebDriver::Element,Integer,Float,Boolean,NilClass,String,Array]
229
+ #
230
+
231
+ def execute_async_script(script, *args)
232
+ bridge.executeAsyncScript(script, *args)
233
+ end
234
+
235
+
236
+ #-------------------------------- sugar --------------------------------
237
+
238
+ #
239
+ # driver.first(:id, 'foo')
240
+ #
241
+
242
+ alias_method :first, :find_element
243
+
244
+ #
245
+ # driver.all(:class, 'bar') #=> [#<WebDriver::Element:0x1011c3b88, ...]
246
+ #
247
+
248
+ alias_method :all, :find_elements
249
+
250
+ #
251
+ # driver.script('function() { ... };')
252
+ #
253
+
254
+ alias_method :script, :execute_script
255
+
256
+ # Get the first element matching the given selector. If given a
257
+ # String or Symbol, it will be used as the id of the element.
258
+ #
259
+ # @param [String,Hash] id or selector
260
+ # @return [WebDriver::Element]
261
+ #
262
+ # Examples:
263
+ #
264
+ # driver['someElementId'] #=> #<WebDriver::Element:0x1011c3b88>
265
+ # driver[:tag_name => 'div'] #=> #<WebDriver::Element:0x1011c3b88>
266
+ #
267
+
268
+ def [](sel)
269
+ if sel.kind_of?(String) || sel.kind_of?(Symbol)
270
+ sel = { :id => sel }
271
+ end
272
+
273
+ find_element sel
274
+ end
275
+
276
+ def browser
277
+ bridge.browser
278
+ end
279
+
280
+ def capabilities
281
+ bridge.capabilities
282
+ end
283
+
284
+ #
285
+ # @api private
286
+ # @see SearchContext
287
+ #
288
+
289
+ def ref
290
+ nil
291
+ end
292
+
293
+ private
294
+
295
+ def bridge
296
+ @bridge
297
+ end
298
+
299
+ end # Driver
300
+ end # WebDriver
301
+ end # Selenium
@@ -0,0 +1,39 @@
1
+ module Selenium
2
+ module WebDriver
3
+
4
+ #
5
+ # @api private
6
+ #
7
+
8
+ module DriverExtensions
9
+ module HasInputDevices
10
+
11
+ #
12
+ # @return [ActionBuilder]
13
+ # @api public
14
+ #
15
+
16
+ def action
17
+ ActionBuilder.new mouse, keyboard
18
+ end
19
+
20
+ #
21
+ # @api private
22
+ #
23
+
24
+ def mouse
25
+ Mouse.new @bridge
26
+ end
27
+
28
+ #
29
+ # @api private
30
+ #
31
+
32
+ def keyboard
33
+ Keyboard.new @bridge
34
+ end
35
+
36
+ end # HasInputDevices
37
+ end # DriverExtensions
38
+ end # WebDriver
39
+ end # Selenium
@@ -0,0 +1,44 @@
1
+ module Selenium
2
+ module WebDriver
3
+
4
+ #
5
+ # @api private
6
+ #
7
+
8
+ module DriverExtensions
9
+ module Rotatable
10
+
11
+ ORIENTATIONS = [:landscape, :portrait]
12
+
13
+ #
14
+ # Change the screen orientation
15
+ #
16
+ # @param [:landscape, :portrait] Orientation
17
+ #
18
+ # @api public
19
+ #
20
+
21
+ def rotate(orientation)
22
+ unless ORIENTATIONS.include?(orientation)
23
+ raise ArgumentError, "expected #{ORIENTATIONS.inspect}, got #{orientation.inspect}"
24
+ end
25
+
26
+ bridge.setScreenOrientation(orientation.to_s.upcase)
27
+ end
28
+
29
+ #
30
+ # Get the current screen orientation
31
+ #
32
+ # @return [:landscape, :portrait] orientation
33
+ #
34
+ # @api public
35
+ #
36
+
37
+ def orientation
38
+ bridge.getScreenOrientation.to_sym.downcase
39
+ end
40
+
41
+ end # Rotatable
42
+ end # DriverExtensions
43
+ end # WebDriver
44
+ end # Selenium
@@ -0,0 +1,43 @@
1
+ module Selenium
2
+ module WebDriver
3
+
4
+ #
5
+ # @api private
6
+ #
7
+
8
+ module DriverExtensions
9
+ module TakesScreenshot
10
+
11
+ #
12
+ # Save a PNG screenshot to the given path
13
+ #
14
+ # @api public
15
+ #
16
+
17
+ def save_screenshot(png_path)
18
+ File.open(png_path, 'wb') { |f| f << screenshot_as(:png) }
19
+ end
20
+
21
+ #
22
+ # Return a PNG screenshot in the given format as a string
23
+ #
24
+ # @param [:base64, :png] format
25
+ # @return String screenshot
26
+ #
27
+ # @api public
28
+
29
+ def screenshot_as(format)
30
+ case format
31
+ when :base64
32
+ bridge.getScreenshot
33
+ when :png
34
+ bridge.getScreenshot.unpack("m")[0]
35
+ else
36
+ raise Error::UnsupportedOperationError, "unsupported format: #{format.inspect}"
37
+ end
38
+ end
39
+
40
+ end # TakesScreenshot
41
+ end # DriverExtensions
42
+ end # WebDriver
43
+ end # Selenium