selenium-webdriver 2.53.4 → 3.8.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 (152) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +363 -10
  3. data/LICENSE +1 -1
  4. data/README.md +2 -3
  5. data/lib/selenium-webdriver.rb +0 -2
  6. data/lib/selenium/server.rb +69 -70
  7. data/lib/selenium/webdriver.rb +32 -23
  8. data/lib/selenium/webdriver/atoms.rb +18 -0
  9. data/lib/selenium/webdriver/atoms/getAttribute.js +8 -0
  10. data/lib/selenium/webdriver/chrome.rb +8 -6
  11. data/lib/selenium/webdriver/chrome/driver.rb +112 -0
  12. data/lib/selenium/webdriver/chrome/options.rb +168 -0
  13. data/lib/selenium/webdriver/chrome/profile.rb +17 -17
  14. data/lib/selenium/webdriver/chrome/service.rb +22 -89
  15. data/lib/selenium/webdriver/common.rb +13 -6
  16. data/lib/selenium/webdriver/common/action_builder.rb +49 -57
  17. data/lib/selenium/webdriver/common/alert.rb +5 -15
  18. data/lib/selenium/webdriver/common/bridge_helper.rb +10 -17
  19. data/lib/selenium/webdriver/common/driver.rb +53 -68
  20. data/lib/selenium/webdriver/common/driver_extensions/{has_input_devices.rb → has_addons.rb} +13 -23
  21. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +4 -8
  22. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +4 -7
  23. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +0 -4
  24. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +0 -4
  25. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +1 -5
  26. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +0 -5
  27. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +4 -9
  28. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +7 -7
  29. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +2 -7
  30. data/lib/selenium/webdriver/common/element.rb +57 -39
  31. data/lib/selenium/webdriver/common/error.rb +204 -106
  32. data/lib/selenium/webdriver/common/file_reaper.rb +3 -11
  33. data/lib/selenium/webdriver/common/html5/local_storage.rb +6 -10
  34. data/lib/selenium/webdriver/common/html5/session_storage.rb +6 -10
  35. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +7 -18
  36. data/lib/selenium/webdriver/{safari/options.rb → common/interactions/input_device.rb} +20 -31
  37. data/lib/selenium/webdriver/common/interactions/interaction.rb +50 -0
  38. data/lib/selenium/webdriver/{safari/browser.rb → common/interactions/interactions.rb} +16 -15
  39. data/lib/selenium/webdriver/common/interactions/key_actions.rb +143 -0
  40. data/lib/selenium/webdriver/common/interactions/key_input.rb +62 -0
  41. data/lib/selenium/webdriver/{android.rb → common/interactions/none_input.rb} +11 -6
  42. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +353 -0
  43. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +132 -0
  44. data/lib/selenium/webdriver/common/keyboard.rb +7 -14
  45. data/lib/selenium/webdriver/common/keys.rb +99 -82
  46. data/lib/selenium/webdriver/common/log_entry.rb +3 -6
  47. data/lib/selenium/webdriver/common/logger.rb +140 -0
  48. data/lib/selenium/webdriver/common/logs.rb +2 -6
  49. data/lib/selenium/webdriver/common/mouse.rb +9 -14
  50. data/lib/selenium/webdriver/common/navigation.rb +2 -6
  51. data/lib/selenium/webdriver/common/options.rb +20 -23
  52. data/lib/selenium/webdriver/common/platform.rb +70 -97
  53. data/lib/selenium/webdriver/common/port_prober.rb +3 -4
  54. data/lib/selenium/webdriver/common/profile_helper.rb +6 -11
  55. data/lib/selenium/webdriver/common/proxy.rb +58 -72
  56. data/lib/selenium/webdriver/common/search_context.rb +22 -29
  57. data/lib/selenium/webdriver/common/service.rb +161 -0
  58. data/lib/selenium/webdriver/common/socket_lock.rb +6 -14
  59. data/lib/selenium/webdriver/common/socket_poller.rb +5 -12
  60. data/lib/selenium/webdriver/common/target_locator.rb +11 -15
  61. data/lib/selenium/webdriver/common/timeouts.rb +4 -8
  62. data/lib/selenium/webdriver/common/touch_action_builder.rb +2 -6
  63. data/lib/selenium/webdriver/common/touch_screen.rb +19 -23
  64. data/lib/selenium/webdriver/common/w3c_action_builder.rb +209 -0
  65. data/lib/selenium/webdriver/{phantomjs.rb → common/w3c_options.rb} +16 -14
  66. data/lib/selenium/webdriver/common/wait.rb +6 -13
  67. data/lib/selenium/webdriver/common/window.rb +48 -17
  68. data/lib/selenium/webdriver/common/zipper.rb +6 -10
  69. data/lib/selenium/webdriver/edge.rb +5 -12
  70. data/lib/selenium/webdriver/edge/bridge.rb +32 -63
  71. data/lib/selenium/webdriver/edge/driver.rb +73 -0
  72. data/lib/selenium/webdriver/edge/service.rb +18 -87
  73. data/lib/selenium/webdriver/firefox.rb +20 -11
  74. data/lib/selenium/webdriver/firefox/binary.rb +40 -56
  75. data/lib/selenium/webdriver/firefox/driver.rb +48 -0
  76. data/lib/selenium/webdriver/firefox/extension.rb +18 -8
  77. data/lib/selenium/webdriver/firefox/extension/prefs.json +3 -11
  78. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  79. data/lib/selenium/webdriver/firefox/launcher.rb +13 -22
  80. data/lib/selenium/webdriver/firefox/legacy/driver.rb +79 -0
  81. data/lib/selenium/webdriver/{iphone.rb → firefox/marionette/bridge.rb} +25 -6
  82. data/lib/selenium/webdriver/firefox/marionette/driver.rb +96 -0
  83. data/lib/selenium/webdriver/firefox/options.rb +149 -0
  84. data/lib/selenium/webdriver/firefox/profile.rb +46 -46
  85. data/lib/selenium/webdriver/firefox/profiles_ini.rb +8 -18
  86. data/lib/selenium/webdriver/firefox/service.rb +23 -83
  87. data/lib/selenium/webdriver/firefox/util.rb +0 -4
  88. data/lib/selenium/webdriver/ie.rb +4 -8
  89. data/lib/selenium/webdriver/ie/driver.rb +90 -0
  90. data/lib/selenium/webdriver/ie/options.rb +136 -0
  91. data/lib/selenium/webdriver/ie/service.rb +58 -0
  92. data/lib/selenium/webdriver/remote.rb +8 -16
  93. data/lib/selenium/webdriver/remote/bridge.rb +96 -565
  94. data/lib/selenium/webdriver/remote/capabilities.rb +76 -94
  95. data/lib/selenium/webdriver/remote/driver.rb +49 -0
  96. data/lib/selenium/webdriver/remote/http/common.rb +22 -20
  97. data/lib/selenium/webdriver/remote/http/curb.rb +9 -12
  98. data/lib/selenium/webdriver/remote/http/default.rb +54 -41
  99. data/lib/selenium/webdriver/remote/http/persistent.rb +9 -8
  100. data/lib/selenium/webdriver/remote/oss/bridge.rb +586 -0
  101. data/lib/selenium/webdriver/remote/oss/commands.rb +221 -0
  102. data/lib/selenium/webdriver/remote/response.rb +39 -27
  103. data/lib/selenium/webdriver/remote/server_error.rb +1 -5
  104. data/lib/selenium/webdriver/remote/w3c/bridge.rb +573 -0
  105. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +290 -0
  106. data/lib/selenium/webdriver/remote/w3c/commands.rb +148 -0
  107. data/lib/selenium/webdriver/safari.rb +20 -29
  108. data/lib/selenium/webdriver/{firefox/w3c_bridge.rb → safari/driver.rb} +21 -30
  109. data/lib/selenium/webdriver/safari/service.rb +57 -0
  110. data/lib/selenium/webdriver/support.rb +1 -2
  111. data/lib/selenium/webdriver/support/abstract_event_listener.rb +17 -4
  112. data/lib/selenium/webdriver/support/block_event_listener.rb +1 -5
  113. data/lib/selenium/webdriver/support/color.rb +57 -42
  114. data/lib/selenium/webdriver/support/escaper.rb +41 -0
  115. data/lib/selenium/webdriver/support/event_firing_bridge.rb +36 -40
  116. data/lib/selenium/webdriver/support/select.rb +33 -86
  117. data/selenium-webdriver.gemspec +22 -25
  118. metadata +254 -261
  119. data/lib/selenium-client.rb +0 -21
  120. data/lib/selenium/client.rb +0 -57
  121. data/lib/selenium/client/base.rb +0 -151
  122. data/lib/selenium/client/driver.rb +0 -29
  123. data/lib/selenium/client/errors.rb +0 -28
  124. data/lib/selenium/client/extensions.rb +0 -132
  125. data/lib/selenium/client/idiomatic.rb +0 -507
  126. data/lib/selenium/client/javascript_expression_builder.rb +0 -135
  127. data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -32
  128. data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -32
  129. data/lib/selenium/client/legacy_driver.rb +0 -1722
  130. data/lib/selenium/client/protocol.rb +0 -123
  131. data/lib/selenium/client/selenium_helper.rb +0 -49
  132. data/lib/selenium/rake/server_task.rb +0 -176
  133. data/lib/selenium/webdriver/android/bridge.rb +0 -68
  134. data/lib/selenium/webdriver/chrome/bridge.rb +0 -139
  135. data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -28
  136. data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -61
  137. data/lib/selenium/webdriver/common/html5/location.rb +0 -19
  138. data/lib/selenium/webdriver/common/w3c_error.rb +0 -194
  139. data/lib/selenium/webdriver/edge/legacy_support.rb +0 -117
  140. data/lib/selenium/webdriver/firefox/bridge.rb +0 -89
  141. data/lib/selenium/webdriver/ie/bridge.rb +0 -88
  142. data/lib/selenium/webdriver/ie/server.rb +0 -133
  143. data/lib/selenium/webdriver/iphone/bridge.rb +0 -64
  144. data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -78
  145. data/lib/selenium/webdriver/phantomjs/service.rb +0 -130
  146. data/lib/selenium/webdriver/remote/commands.rb +0 -211
  147. data/lib/selenium/webdriver/remote/w3c_bridge.rb +0 -668
  148. data/lib/selenium/webdriver/remote/w3c_capabilities.rb +0 -236
  149. data/lib/selenium/webdriver/remote/w3c_commands.rb +0 -132
  150. data/lib/selenium/webdriver/safari/bridge.rb +0 -135
  151. data/lib/selenium/webdriver/safari/resources/client.js +0 -7255
  152. data/lib/selenium/webdriver/safari/server.rb +0 -187
@@ -0,0 +1,290 @@
1
+ # Licensed to the Software Freedom Conservancy (SFC) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The SFC licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ module Selenium
19
+ module WebDriver
20
+ module Remote
21
+ module W3C
22
+
23
+ #
24
+ # Specification of the desired and/or actual capabilities of the browser that the
25
+ # server is being asked to create.
26
+ #
27
+ # @api private
28
+ #
29
+
30
+ class Capabilities
31
+
32
+ EXTENSION_CAPABILITY_PATTERN = /\A[\w-]+:.*\z/
33
+
34
+ KNOWN = [
35
+ :browser_name,
36
+ :browser_version,
37
+ :platform_name,
38
+ :accept_insecure_certs,
39
+ :page_load_strategy,
40
+ :proxy,
41
+ :set_window_rect,
42
+ :timeouts,
43
+ :unhandled_prompt_behavior,
44
+
45
+ # remote-specific
46
+ :remote_session_id,
47
+
48
+ # TODO (alex): deprecate in favor of Firefox::Options?
49
+ :accessibility_checks,
50
+ :device,
51
+
52
+ # TODO (alex): deprecate compatibility with OSS-capabilities
53
+ :implicit_timeout,
54
+ :page_load_timeout,
55
+ :script_timeout,
56
+ ].freeze
57
+
58
+ KNOWN.each do |key|
59
+ define_method key do
60
+ @capabilities.fetch(key)
61
+ end
62
+
63
+ define_method "#{key}=" do |value|
64
+ @capabilities[key] = value
65
+ end
66
+ end
67
+
68
+ #
69
+ # Backward compatibility
70
+ #
71
+
72
+ alias_method :version, :browser_version
73
+ alias_method :version=, :browser_version=
74
+ alias_method :platform, :platform_name
75
+ alias_method :platform=, :platform_name=
76
+
77
+ #
78
+ # Convenience methods for the common choices.
79
+ #
80
+
81
+ class << self
82
+ def edge(opts = {})
83
+ new({
84
+ browser_name: 'MicrosoftEdge',
85
+ platform: :windows
86
+ }.merge(opts))
87
+ end
88
+
89
+ def firefox(opts = {})
90
+ opts[:browser_version] = opts.delete(:version) if opts.key?(:version)
91
+ opts[:platform_name] = opts.delete(:platform) if opts.key?(:platform)
92
+ opts[:timeouts] = {}
93
+ opts[:timeouts]['implicit'] = opts.delete(:implicit_timeout) if opts.key?(:implicit_timeout)
94
+ opts[:timeouts]['pageLoad'] = opts.delete(:page_load_timeout) if opts.key?(:page_load_timeout)
95
+ opts[:timeouts]['script'] = opts.delete(:script_timeout) if opts.key?(:script_timeout)
96
+ new({browser_name: 'firefox', marionette: true}.merge(opts))
97
+ end
98
+
99
+ alias_method :ff, :firefox
100
+
101
+ #
102
+ # @api private
103
+ #
104
+
105
+ def json_create(data)
106
+ data = data.dup
107
+
108
+ caps = new
109
+ caps.browser_name = data.delete('browserName')
110
+ caps.browser_version = data.delete('browserVersion')
111
+ caps.platform_name = data.delete('platformName')
112
+ caps.accept_insecure_certs = data.delete('acceptInsecureCerts') if data.key?('acceptInsecureCerts')
113
+ caps.page_load_strategy = data.delete('pageLoadStrategy')
114
+ timeouts = data.delete('timeouts')
115
+ caps.implicit_timeout = timeouts['implicit'] if timeouts
116
+ caps.page_load_timeout = timeouts['pageLoad'] if timeouts
117
+ caps.script_timeout = timeouts['script'] if timeouts
118
+
119
+ proxy = data.delete('proxy')
120
+ caps.proxy = Proxy.json_create(proxy) unless proxy.nil? || proxy.empty?
121
+
122
+ # Remote Server Specific
123
+ caps[:remote_session_id] = data.delete('webdriver.remote.sessionid')
124
+
125
+ # Marionette Specific
126
+ caps[:accessibility_checks] = data.delete('moz:accessibilityChecks')
127
+ caps[:profile] = data.delete('moz:profile')
128
+ caps[:rotatable] = data.delete('rotatable')
129
+ caps[:device] = data.delete('device')
130
+
131
+ # any remaining pairs will be added as is, with no conversion
132
+ caps.merge!(data)
133
+
134
+ caps
135
+ end
136
+
137
+ #
138
+ # Creates W3C compliant capabilities from OSS ones.
139
+ # @param oss_capabilities [Hash, Remote::Capabilities]
140
+ #
141
+
142
+ def from_oss(oss_capabilities)
143
+ w3c_capabilities = new
144
+
145
+ # TODO (alex): make capabilities enumerable?
146
+ oss_capabilities = oss_capabilities.__send__(:capabilities) unless oss_capabilities.is_a?(Hash)
147
+ oss_capabilities.each do |name, value|
148
+ next if value.nil?
149
+ next if value.is_a?(String) && value.empty?
150
+
151
+ capability_name = name.to_s
152
+
153
+ snake_cased_capability_names = KNOWN.map(&:to_s)
154
+ camel_cased_capability_names = snake_cased_capability_names.map(&w3c_capabilities.method(:camel_case))
155
+
156
+ next unless snake_cased_capability_names.include?(capability_name) ||
157
+ camel_cased_capability_names.include?(capability_name) ||
158
+ capability_name.match(EXTENSION_CAPABILITY_PATTERN)
159
+
160
+ w3c_capabilities[name] = value
161
+ end
162
+
163
+ # User can pass :firefox_options or :firefox_profile.
164
+ #
165
+ # TODO (alex): Refactor this whole method into converter class.
166
+ firefox_options = oss_capabilities['firefoxOptions'] || oss_capabilities['firefox_options'] || oss_capabilities[:firefox_options]
167
+ firefox_profile = oss_capabilities['firefox_profile'] || oss_capabilities[:firefox_profile]
168
+ firefox_binary = oss_capabilities['firefox_binary'] || oss_capabilities[:firefox_binary]
169
+
170
+ if firefox_profile && firefox_options
171
+ second_profile = firefox_options['profile'] || firefox_options[:profile]
172
+ if second_profile && firefox_profile != second_profile
173
+ raise Error::WebDriverError, 'You cannot pass 2 different Firefox profiles'
174
+ end
175
+ end
176
+
177
+ if firefox_options || firefox_profile || firefox_binary
178
+ options = WebDriver::Firefox::Options.new(firefox_options || {})
179
+ options.binary = firefox_binary if firefox_binary
180
+ options.profile = firefox_profile if firefox_profile
181
+ w3c_capabilities.merge!(options.as_json)
182
+ end
183
+
184
+ w3c_capabilities
185
+ end
186
+ end
187
+
188
+ #
189
+ # @param [Hash] opts
190
+ # @option :browser_name [String] required browser name
191
+ # @option :browser_version [String] required browser version number
192
+ # @option :platform_name [Symbol] one of :any, :win, :mac, or :x
193
+ # @option :accept_insecure_certs [Boolean] does the driver accept insecure SSL certifications?
194
+ # @option :proxy [Selenium::WebDriver::Proxy, Hash] proxy configuration
195
+ #
196
+ # @api public
197
+ #
198
+
199
+ def initialize(opts = {})
200
+ @capabilities = opts
201
+ self.proxy = opts.delete(:proxy)
202
+ end
203
+
204
+ #
205
+ # Allows setting arbitrary capabilities.
206
+ #
207
+
208
+ def []=(key, value)
209
+ @capabilities[key] = value
210
+ end
211
+
212
+ def [](key)
213
+ @capabilities[key]
214
+ end
215
+
216
+ def merge!(other)
217
+ if other.respond_to?(:capabilities, true) && other.capabilities.is_a?(Hash)
218
+ @capabilities.merge! other.capabilities
219
+ elsif other.is_a? Hash
220
+ @capabilities.merge! other
221
+ else
222
+ raise ArgumentError, 'argument should be a Hash or implement #capabilities'
223
+ end
224
+ end
225
+
226
+ def proxy=(proxy)
227
+ case proxy
228
+ when Hash
229
+ @capabilities[:proxy] = Proxy.new(proxy)
230
+ when Proxy, nil
231
+ @capabilities[:proxy] = proxy
232
+ else
233
+ raise TypeError, "expected Hash or #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}"
234
+ end
235
+ end
236
+
237
+ #
238
+ # @api private
239
+ #
240
+
241
+ def as_json(*)
242
+ hash = {}
243
+
244
+ @capabilities.each do |key, value|
245
+ case key
246
+ when :platform
247
+ hash['platform'] = value.to_s.upcase
248
+ when :proxy
249
+ if value
250
+ hash['proxy'] = value.as_json
251
+ hash['proxy']['proxyType'] &&= hash['proxy']['proxyType'].downcase
252
+ end
253
+ when String, :firefox_binary
254
+ hash[key.to_s] = value
255
+ when Symbol
256
+ hash[camel_case(key.to_s)] = value
257
+ else
258
+ raise TypeError, "expected String or Symbol, got #{key.inspect}:#{key.class} / #{value.inspect}"
259
+ end
260
+ end
261
+
262
+ hash
263
+ end
264
+
265
+ def to_json(*)
266
+ JSON.generate as_json
267
+ end
268
+
269
+ def ==(other)
270
+ return false unless other.is_a? self.class
271
+ as_json == other.as_json
272
+ end
273
+
274
+ alias_method :eql?, :==
275
+
276
+ protected
277
+
278
+ attr_reader :capabilities
279
+
280
+ private
281
+
282
+ def camel_case(str)
283
+ str.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
284
+ end
285
+
286
+ end # Capabilities
287
+ end # W3c
288
+ end # Remote
289
+ end # WebDriver
290
+ end # Selenium
@@ -0,0 +1,148 @@
1
+ # Licensed to the Software Freedom Conservancy (SFC) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The SFC licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ module Selenium
19
+ module WebDriver
20
+ module Remote
21
+ module W3C
22
+
23
+ #
24
+ # http://www.w3.org/TR/2015/WD-webdriver-20150918/#list-of-endpoints
25
+ # @api private
26
+ #
27
+
28
+ class Bridge
29
+ COMMANDS = {
30
+
31
+ #
32
+ # session handling
33
+ #
34
+
35
+ new_session: [:post, 'session'.freeze],
36
+ delete_session: [:delete, 'session/:session_id'.freeze],
37
+
38
+ #
39
+ # basic driver
40
+ #
41
+
42
+ get: [:post, 'session/:session_id/url'.freeze],
43
+ get_current_url: [:get, 'session/:session_id/url'.freeze],
44
+ back: [:post, 'session/:session_id/back'.freeze],
45
+ forward: [:post, 'session/:session_id/forward'.freeze],
46
+ refresh: [:post, 'session/:session_id/refresh'.freeze],
47
+ get_title: [:get, 'session/:session_id/title'.freeze],
48
+
49
+ #
50
+ # window and Frame handling
51
+ #
52
+
53
+ get_window_handle: [:get, 'session/:session_id/window'.freeze],
54
+ close_window: [:delete, 'session/:session_id/window'.freeze],
55
+ switch_to_window: [:post, 'session/:session_id/window'.freeze],
56
+ get_window_handles: [:get, 'session/:session_id/window/handles'.freeze],
57
+ fullscreen_window: [:post, 'session/:session_id/window/fullscreen'.freeze],
58
+ minimize_window: [:post, 'session/:session_id/window/minimize'.freeze],
59
+ maximize_window: [:post, 'session/:session_id/window/maximize'.freeze],
60
+ set_window_size: [:post, 'session/:session_id/window/size'.freeze],
61
+ get_window_size: [:get, 'session/:session_id/window/size'.freeze],
62
+ set_window_position: [:post, 'session/:session_id/window/position'.freeze],
63
+ get_window_position: [:get, 'session/:session_id/window/position'.freeze],
64
+ set_window_rect: [:post, 'session/:session_id/window/rect'.freeze],
65
+ get_window_rect: [:get, 'session/:session_id/window/rect'.freeze],
66
+ switch_to_frame: [:post, 'session/:session_id/frame'.freeze],
67
+ switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'.freeze],
68
+
69
+ #
70
+ # element
71
+ #
72
+
73
+ find_element: [:post, 'session/:session_id/element'.freeze],
74
+ find_elements: [:post, 'session/:session_id/elements'.freeze],
75
+ find_child_element: [:post, 'session/:session_id/element/:id/element'.freeze],
76
+ find_child_elements: [:post, 'session/:session_id/element/:id/elements'.freeze],
77
+ get_active_element: [:get, 'session/:session_id/element/active'.freeze],
78
+ is_element_selected: [:get, 'session/:session_id/element/:id/selected'.freeze],
79
+ get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'.freeze],
80
+ get_element_property: [:get, 'session/:session_id/element/:id/property/:name'.freeze],
81
+ get_element_css_value: [:get, 'session/:session_id/element/:id/css/:property_name'.freeze],
82
+ get_element_text: [:get, 'session/:session_id/element/:id/text'.freeze],
83
+ get_element_tag_name: [:get, 'session/:session_id/element/:id/name'.freeze],
84
+ get_element_rect: [:get, 'session/:session_id/element/:id/rect'.freeze],
85
+ is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'.freeze],
86
+
87
+ #
88
+ # document handling
89
+ #
90
+
91
+ get_page_source: [:get, '/session/:session_id/source'.freeze],
92
+ execute_script: [:post, 'session/:session_id/execute/sync'.freeze],
93
+ execute_async_script: [:post, 'session/:session_id/execute/async'.freeze],
94
+
95
+ #
96
+ # cookies
97
+ #
98
+
99
+ get_all_cookies: [:get, 'session/:session_id/cookie'.freeze],
100
+ get_cookie: [:get, 'session/:session_id/cookie/:name'.freeze],
101
+ add_cookie: [:post, 'session/:session_id/cookie'.freeze],
102
+ delete_cookie: [:delete, 'session/:session_id/cookie/:name'.freeze],
103
+ delete_all_cookies: [:delete, 'session/:session_id/cookie'.freeze],
104
+
105
+ #
106
+ # timeouts
107
+ #
108
+
109
+ set_timeout: [:post, 'session/:session_id/timeouts'.freeze],
110
+
111
+ #
112
+ # actions
113
+ #
114
+
115
+ actions: [:post, 'session/:session_id/actions'.freeze],
116
+ release_actions: [:delete, 'session/:session_id/actions'.freeze],
117
+
118
+ #
119
+ # Element Operations
120
+ #
121
+
122
+ element_click: [:post, 'session/:session_id/element/:id/click'.freeze],
123
+ element_tap: [:post, 'session/:session_id/element/:id/tap'.freeze],
124
+ element_clear: [:post, 'session/:session_id/element/:id/clear'.freeze],
125
+ element_send_keys: [:post, 'session/:session_id/element/:id/value'.freeze],
126
+
127
+ #
128
+ # alerts
129
+ #
130
+
131
+ dismiss_alert: [:post, 'session/:session_id/alert/dismiss'.freeze],
132
+ accept_alert: [:post, 'session/:session_id/alert/accept'.freeze],
133
+ get_alert_text: [:get, 'session/:session_id/alert/text'.freeze],
134
+ send_alert_text: [:post, 'session/:session_id/alert/text'.freeze],
135
+
136
+ #
137
+ # screenshot
138
+ #
139
+
140
+ take_screenshot: [:get, 'session/:session_id/screenshot'.freeze],
141
+ take_element_screenshot: [:get, 'session/:session_id/element/:id/screenshot'.freeze]
142
+ }.freeze
143
+
144
+ end # Bridge
145
+ end # W3C
146
+ end # Remote
147
+ end # WebDriver
148
+ end # Selenium
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
- #
3
1
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
2
  # or more contributor license agreements. See the NOTICE file
5
3
  # distributed with this work for additional information
@@ -17,49 +15,42 @@
17
15
  # specific language governing permissions and limitations
18
16
  # under the License.
19
17
 
20
- require 'websocket'
21
- require 'pathname'
18
+ require 'selenium/webdriver/safari/driver'
19
+ require 'selenium/webdriver/safari/service'
22
20
 
23
21
  module Selenium
24
22
  module WebDriver
25
23
  module Safari
26
-
27
24
  class << self
25
+ def technology_preview
26
+ "/Applications/Safari\ Technology\ Preview.app/Contents/MacOS/safaridriver"
27
+ end
28
+
29
+ def technology_preview!
30
+ self.driver_path = technology_preview
31
+ end
32
+
28
33
  def path=(path)
29
34
  Platform.assert_executable(path)
30
35
  @path = path
31
36
  end
32
37
 
33
38
  def path
34
- @path ||= (
35
- path = case Platform.os
36
- when :windows
37
- Platform.find_in_program_files("Safari\\Safari.exe")
38
- when :macosx
39
- "/Applications/Safari.app/Contents/MacOS/Safari"
40
- else
41
- Platform.find_binary("Safari")
42
- end
43
-
44
- unless File.file?(path) && File.executable?(path)
45
- raise Error::WebDriverError, "unable to find the Safari executable, please set Selenium::WebDriver::Safari.path= or add it to your PATH."
46
- end
39
+ @path ||= '/Applications/Safari.app/Contents/MacOS/Safari'
40
+ return @path if File.file?(@path) && File.executable?(@path)
41
+ raise Error::WebDriverError, 'Safari is only supported on Mac' unless Platform.os.mac?
42
+ raise Error::WebDriverError, 'Unable to find Safari'
43
+ end
47
44
 
48
- path
49
- )
45
+ def driver_path=(path)
46
+ Platform.assert_executable path
47
+ @driver_path = path
50
48
  end
51
49
 
52
- def resource_path
53
- @resource_path ||= Pathname.new(File.expand_path("../safari/resources", __FILE__))
50
+ def driver_path
51
+ @driver_path ||= nil
54
52
  end
55
53
  end
56
-
57
54
  end # Safari
58
55
  end # WebDriver
59
56
  end # Selenium
60
-
61
- require 'selenium/webdriver/safari/browser'
62
- require 'selenium/webdriver/safari/server'
63
- require 'selenium/webdriver/safari/options'
64
- require 'selenium/webdriver/safari/bridge'
65
-