selenium-webdriver 2.53.4 → 3.8.0

Sign up to get free protection for your applications and to get access to all the features.
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
-