selenium-webdriver 3.0.1 → 3.0.2

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 (36) hide show
  1. data/CHANGES +17 -0
  2. data/lib/selenium/webdriver/chrome.rb +13 -13
  3. data/lib/selenium/webdriver/chrome/bridge.rb +4 -3
  4. data/lib/selenium/webdriver/chrome/service.rb +6 -4
  5. data/lib/selenium/webdriver/common.rb +1 -0
  6. data/lib/selenium/webdriver/common/driver.rb +1 -1
  7. data/lib/selenium/webdriver/common/element.rb +14 -0
  8. data/lib/selenium/webdriver/common/options.rb +12 -10
  9. data/lib/selenium/webdriver/common/port_prober.rb +2 -1
  10. data/lib/selenium/webdriver/common/service.rb +23 -8
  11. data/lib/selenium/webdriver/common/w3c_options.rb +45 -0
  12. data/lib/selenium/webdriver/edge.rb +13 -13
  13. data/lib/selenium/webdriver/edge/bridge.rb +98 -1
  14. data/lib/selenium/webdriver/edge/service.rb +6 -4
  15. data/lib/selenium/webdriver/firefox.rb +13 -13
  16. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  17. data/lib/selenium/webdriver/firefox/service.rb +10 -4
  18. data/lib/selenium/webdriver/firefox/w3c_bridge.rb +2 -1
  19. data/lib/selenium/webdriver/ie.rb +13 -13
  20. data/lib/selenium/webdriver/ie/bridge.rb +3 -1
  21. data/lib/selenium/webdriver/ie/service.rb +6 -4
  22. data/lib/selenium/webdriver/phantomjs.rb +13 -9
  23. data/lib/selenium/webdriver/phantomjs/bridge.rb +2 -1
  24. data/lib/selenium/webdriver/phantomjs/service.rb +2 -4
  25. data/lib/selenium/webdriver/remote/bridge.rb +102 -108
  26. data/lib/selenium/webdriver/remote/commands.rb +188 -185
  27. data/lib/selenium/webdriver/remote/w3c_bridge.rb +75 -94
  28. data/lib/selenium/webdriver/remote/w3c_capabilities.rb +3 -3
  29. data/lib/selenium/webdriver/remote/w3c_commands.rb +108 -104
  30. data/lib/selenium/webdriver/safari.rb +14 -13
  31. data/lib/selenium/webdriver/safari/bridge.rb +2 -1
  32. data/lib/selenium/webdriver/safari/service.rb +16 -4
  33. data/selenium-webdriver.gemspec +1 -1
  34. metadata +3 -4
  35. data/Gemfile.lock +0 -53
  36. data/lib/selenium/webdriver/edge/legacy_support.rb +0 -117
@@ -26,13 +26,15 @@ module Selenium
26
26
 
27
27
  class Service < WebDriver::Service
28
28
  DEFAULT_PORT = 17556
29
+ @executable = 'MicrosoftWebDriver'.freeze
30
+ @missing_text = <<-ERROR.gsub(/\n +| {2,}/, ' ').freeze
31
+ Unable to find MicrosoftWebDriver. Please download the server from
32
+ https://www.microsoft.com/en-us/download/details.aspx?id=48212 and place it somewhere on your PATH.
33
+ More info at https://github.com/SeleniumHQ/selenium/wiki/MicrosoftWebDriver.
34
+ ERROR
29
35
 
30
36
  private
31
37
 
32
- def stop_server
33
- connect_to_server { |http| http.head('/shutdown') }
34
- end
35
-
36
38
  def start_process
37
39
  server_command = [@executable_path, "--port=#{@port}", *@extra_args]
38
40
  @process = ChildProcess.build(*server_command)
@@ -41,25 +41,25 @@ module Selenium
41
41
  DEFAULT_ASSUME_UNTRUSTED_ISSUER = true
42
42
  DEFAULT_LOAD_NO_FOCUS_LIB = false
43
43
 
44
- MISSING_TEXT = <<-ERROR.tr("\n", '').freeze
45
- Unable to find Mozilla geckodriver. Please download the server from
46
- https://github.com/mozilla/geckodriver/releases and place it
47
- somewhere on your PATH. More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver.
48
- ERROR
49
-
50
44
  def self.driver_path=(path)
45
+ warn <<-DEPRECATE.gsub(/\n +| {2,}/, ' ').freeze
46
+ [DEPRECATION] `driver_path=` is deprecated. Pass the driver path as an option instead.
47
+ e.g. Selenium::WebDriver.for :firefox, driver_path: '/path'
48
+ DEPRECATE
49
+
51
50
  Platform.assert_executable path
52
51
  @driver_path = path
53
52
  end
54
53
 
55
- def self.driver_path
56
- @driver_path ||= begin
57
- path = Platform.find_binary('geckodriver*')
58
- raise Error::WebDriverError, MISSING_TEXT unless path
59
- Platform.assert_executable path
60
-
61
- path
54
+ def self.driver_path(warning = true)
55
+ if warning
56
+ warn <<-DEPRECATE.gsub(/\n +| {2,}/, ' ').freeze
57
+ [DEPRECATION] `driver_path` is deprecated. Pass the driver path as an option instead.
58
+ e.g. Selenium::WebDriver.for :firefox, driver_path: '/path'
59
+ DEPRECATE
62
60
  end
61
+
62
+ @driver_path ||= nil
63
63
  end
64
64
 
65
65
  def self.path=(path)
@@ -26,6 +26,16 @@ module Selenium
26
26
 
27
27
  class Service < WebDriver::Service
28
28
  DEFAULT_PORT = 4444
29
+ @executable = 'geckodriver*'.freeze
30
+ @missing_text = <<-ERROR.gsub(/\n +| {2,}/, ' ').freeze
31
+ Unable to find Mozilla geckodriver. Please download the server from
32
+ https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH.
33
+ More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver.
34
+ ERROR
35
+
36
+ def stop
37
+ stop_process
38
+ end
29
39
 
30
40
  private
31
41
 
@@ -54,10 +64,6 @@ module Selenium
54
64
  end
55
65
  end
56
66
 
57
- def stop_server
58
- connect_to_server { |http| http.head('/shutdown') }
59
- end
60
-
61
67
  def cannot_connect_error_text
62
68
  "unable to connect to Mozilla geckodriver #{@host}:#{@port}"
63
69
  end
@@ -27,7 +27,8 @@ module Selenium
27
27
  opts[:desired_capabilities] = create_capabilities(opts)
28
28
  service_args = opts.delete(:service_args) || {}
29
29
 
30
- @service = Service.new(Firefox.driver_path, port, *extract_service_args(service_args))
30
+ driver_path = opts.delete(:driver_path) || Firefox.driver_path(false)
31
+ @service = Service.new(driver_path, port, *extract_service_args(service_args))
31
32
  @service.start
32
33
  opts[:url] = @service.uri
33
34
 
@@ -23,25 +23,25 @@ require 'selenium/webdriver/ie/service'
23
23
  module Selenium
24
24
  module WebDriver
25
25
  module IE
26
- MISSING_TEXT = <<-ERROR.tr("\n", '').freeze
27
- Unable to find IEDriverServer. Please download the server from
28
- http://selenium-release.storage.googleapis.com/index.html and place it
29
- somewhere on your PATH. More info at https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver.
30
- ERROR
31
-
32
26
  def self.driver_path=(path)
27
+ warn <<-DEPRECATE.gsub(/\n +| {2,}/, ' ').freeze
28
+ [DEPRECATION] `driver_path=` is deprecated. Pass the driver path as an option instead.
29
+ e.g. Selenium::WebDriver.for :ie, driver_path: '/path'
30
+ DEPRECATE
31
+
33
32
  Platform.assert_executable path
34
33
  @driver_path = path
35
34
  end
36
35
 
37
- def self.driver_path
38
- @driver_path ||= begin
39
- path = Platform.find_binary('IEDriverServer')
40
- raise Error::WebDriverError, MISSING_TEXT unless path
41
- Platform.assert_executable path
42
-
43
- path
36
+ def self.driver_path(warning = true)
37
+ if warning
38
+ warn <<-DEPRECATE.gsub(/\n +| {2,}/, ' ').freeze
39
+ [DEPRECATION] `driver_path` is deprecated. Pass the driver path as an option instead.
40
+ e.g. Selenium::WebDriver.for :ie, driver_path: '/path'
41
+ DEPRECATE
44
42
  end
43
+
44
+ @driver_path ||= nil
45
45
  end
46
46
  end # IE
47
47
  end # WebDriver
@@ -29,7 +29,9 @@ module Selenium
29
29
  port = opts.delete(:port) || Service::DEFAULT_PORT
30
30
  service_args = opts.delete(:service_args) || {}
31
31
  service_args = match_legacy(opts, service_args)
32
- @service = Service.new(IE.driver_path, port, *extract_service_args(service_args))
32
+ driver_path = opts.delete(:driver_path) || IE.driver_path(false)
33
+
34
+ @service = Service.new(driver_path, port, *extract_service_args(service_args))
33
35
  @service.start
34
36
  opts[:url] = @service.uri
35
37
 
@@ -26,13 +26,15 @@ module Selenium
26
26
 
27
27
  class Service < WebDriver::Service
28
28
  DEFAULT_PORT = 5555
29
+ @executable = 'IEDriverServer'.freeze
30
+ @missing_text = <<-ERROR.gsub(/\n +| {2,}/, ' ').freeze
31
+ Unable to find IEDriverServer. Please download the server from
32
+ http://selenium-release.storage.googleapis.com/index.html and place it somewhere on your PATH.
33
+ More info at https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver.
34
+ ERROR
29
35
 
30
36
  private
31
37
 
32
- def stop_server
33
- # server can only be stopped as process
34
- end
35
-
36
38
  def start_process
37
39
  server_command = [@executable_path, "--port=#{@port}", *@extra_args]
38
40
  @process = ChildProcess.new(*server_command)
@@ -25,21 +25,25 @@ require 'selenium/webdriver/phantomjs/bridge'
25
25
  module Selenium
26
26
  module WebDriver
27
27
  module PhantomJS
28
- MISSING_TEXT = 'Unable to find phantomjs executable.'.freeze
29
-
30
28
  def self.path=(path)
29
+ warn <<-DEPRECATE.gsub(/\n +| {2,}/, ' ').freeze
30
+ [DEPRECATION] `path=` is deprecated. Pass the driver path as an option instead.
31
+ e.g. Selenium::WebDriver.for :phantomjs, driver_path: '/path'
32
+ DEPRECATE
33
+
31
34
  Platform.assert_executable path
32
35
  @path = path
33
36
  end
34
37
 
35
- def self.path
36
- @path ||= begin
37
- path = Platform.find_binary('phantomjs')
38
- raise Error::WebDriverError, MISSING_TEXT unless path
39
- Platform.assert_executable path
40
-
41
- path
38
+ def self.path(warning = true)
39
+ if warning
40
+ warn <<-DEPRECATE.gsub(/\n +| {2,}/, ' ').freeze
41
+ [DEPRECATION] `path` is deprecated. Pass the driver path as an option instead.
42
+ e.g. Selenium::WebDriver.for :phantomjs, driver_path: '/path'
43
+ DEPRECATE
42
44
  end
45
+
46
+ @path ||= nil
43
47
  end
44
48
  end # PhantomJS
45
49
  end # WebDriver
@@ -30,8 +30,9 @@ module Selenium
30
30
  opts[:desired_capabilities] ||= Remote::Capabilities.phantomjs
31
31
 
32
32
  unless opts.key?(:url)
33
+ driver_path = opts.delete(:driver_path) || PhantomJS.path(false)
33
34
  args = opts.delete(:args) || opts[:desired_capabilities]['phantomjs.cli.args']
34
- @service = Service.new(PhantomJS.path, port, *args)
35
+ @service = Service.new(driver_path, port, *args)
35
36
  @service.start
36
37
  opts[:url] = @service.uri
37
38
  end
@@ -26,6 +26,8 @@ module Selenium
26
26
 
27
27
  class Service < WebDriver::Service
28
28
  DEFAULT_PORT = 8910
29
+ @executable = 'phantomjs'.freeze
30
+ @missing_text = 'Unable to find phantomjs. Please download from http://phantomjs.org/download.html'.freeze
29
31
 
30
32
  private
31
33
 
@@ -53,10 +55,6 @@ module Selenium
53
55
  end
54
56
  end
55
57
 
56
- def stop_server
57
- connect_to_server { |http| http.get('/shutdown') }
58
- end
59
-
60
58
  def cannot_connect_error_text
61
59
  "unable to connect to phantomjs @ #{uri} after #{START_TIMEOUT} seconds"
62
60
  end
@@ -29,25 +29,6 @@ module Selenium
29
29
  class Bridge
30
30
  include BridgeHelper
31
31
 
32
- # TODO: constant shouldn't be modified in class
33
- COMMANDS = {}
34
-
35
- #
36
- # Defines a wrapper method for a command, which ultimately calls #execute.
37
- #
38
- # @param name [Symbol]
39
- # name of the resulting method
40
- # @param url [String]
41
- # a URL template, which can include some arguments, much like the definitions on the server.
42
- # the :session_id parameter is implicitly handled, but the remainder will become required method arguments.
43
- # @param verb [Symbol]
44
- # the appropriate http verb, such as :get, :post, or :delete
45
- #
46
-
47
- def self.command(name, verb, url)
48
- COMMANDS[name] = [verb, url.freeze]
49
- end
50
-
51
32
  attr_accessor :context, :http, :file_detector
52
33
  attr_reader :capabilities
53
34
 
@@ -112,6 +93,10 @@ module Selenium
112
93
  ]
113
94
  end
114
95
 
96
+ def commands(command)
97
+ COMMANDS[command]
98
+ end
99
+
115
100
  #
116
101
  # Returns the current session ID.
117
102
  #
@@ -121,7 +106,7 @@ module Selenium
121
106
  end
122
107
 
123
108
  def create_session(desired_capabilities)
124
- resp = raw_execute :newSession, {}, {desiredCapabilities: desired_capabilities}
109
+ resp = raw_execute :new_session, {}, {desiredCapabilities: desired_capabilities}
125
110
  @session_id = resp['sessionId']
126
111
  return Capabilities.json_create resp['value'] if @session_id
127
112
 
@@ -137,19 +122,19 @@ module Selenium
137
122
  end
138
123
 
139
124
  def session_capabilities
140
- Capabilities.json_create execute(:getCapabilities)
125
+ Capabilities.json_create execute(:get_capabilities)
141
126
  end
142
127
 
143
128
  def implicit_wait_timeout=(milliseconds)
144
- execute :implicitlyWait, {}, {ms: milliseconds}
129
+ execute :implicitly_wait, {}, {ms: milliseconds}
145
130
  end
146
131
 
147
132
  def script_timeout=(milliseconds)
148
- execute :setScriptTimeout, {}, {ms: milliseconds}
133
+ execute :set_script_timeout, {}, {ms: milliseconds}
149
134
  end
150
135
 
151
136
  def timeout(type, milliseconds)
152
- execute :setTimeout, {}, {type: type, ms: milliseconds}
137
+ execute :set_timeout, {}, {type: type, ms: milliseconds}
153
138
  end
154
139
 
155
140
  #
@@ -157,23 +142,23 @@ module Selenium
157
142
  #
158
143
 
159
144
  def accept_alert
160
- execute :acceptAlert
145
+ execute :accept_alert
161
146
  end
162
147
 
163
148
  def dismiss_alert
164
- execute :dismissAlert
149
+ execute :dismiss_alert
165
150
  end
166
151
 
167
152
  def alert=(keys)
168
- execute :setAlertValue, {}, {text: keys.to_s}
153
+ execute :set_alert_value, {}, {text: keys.to_s}
169
154
  end
170
155
 
171
156
  def alert_text
172
- execute :getAlertText
157
+ execute :get_alert_text
173
158
  end
174
159
 
175
160
  def authentication(credentials)
176
- execute :setAuthentication, {}, credentials
161
+ execute :set_authentication, {}, credentials
177
162
  end
178
163
 
179
164
  #
@@ -181,35 +166,35 @@ module Selenium
181
166
  #
182
167
 
183
168
  def go_back
184
- execute :goBack
169
+ execute :go_back
185
170
  end
186
171
 
187
172
  def go_forward
188
- execute :goForward
173
+ execute :go_forward
189
174
  end
190
175
 
191
176
  def url
192
- execute :getCurrentUrl
177
+ execute :get_current_url
193
178
  end
194
179
 
195
180
  def title
196
- execute :getTitle
181
+ execute :get_title
197
182
  end
198
183
 
199
184
  def page_source
200
- execute :getPageSource
185
+ execute :get_page_source
201
186
  end
202
187
 
203
188
  def switch_to_window(name)
204
- execute :switchToWindow, {}, {name: name}
189
+ execute :switch_to_window, {}, {name: name}
205
190
  end
206
191
 
207
192
  def switch_to_frame(id)
208
- execute :switchToFrame, {}, {id: id}
193
+ execute :switch_to_frame, {}, {id: id}
209
194
  end
210
195
 
211
196
  def switch_to_parent_frame
212
- execute :switchToParentFrame
197
+ execute :switch_to_parent_frame
213
198
  end
214
199
 
215
200
  def switch_to_default_content
@@ -237,36 +222,36 @@ module Selenium
237
222
  #
238
223
 
239
224
  def window_handles
240
- execute :getWindowHandles
225
+ execute :get_window_handles
241
226
  end
242
227
 
243
228
  def window_handle
244
- execute :getCurrentWindowHandle
229
+ execute :get_current_window_handle
245
230
  end
246
231
 
247
232
  def resize_window(width, height, handle = :current)
248
- execute :setWindowSize, {window_handle: handle},
233
+ execute :set_window_size, {window_handle: handle},
249
234
  {width: width,
250
235
  height: height}
251
236
  end
252
237
 
253
238
  def maximize_window(handle = :current)
254
- execute :maximizeWindow, window_handle: handle
239
+ execute :maximize_window, window_handle: handle
255
240
  end
256
241
 
257
242
  def window_size(handle = :current)
258
- data = execute :getWindowSize, window_handle: handle
243
+ data = execute :get_window_size, window_handle: handle
259
244
 
260
245
  Dimension.new data['width'], data['height']
261
246
  end
262
247
 
263
248
  def reposition_window(x, y, handle = :current)
264
- execute :setWindowPosition, {window_handle: handle},
249
+ execute :set_window_position, {window_handle: handle},
265
250
  {x: x, y: y}
266
251
  end
267
252
 
268
253
  def window_position(handle = :current)
269
- data = execute :getWindowPosition, window_handle: handle
254
+ data = execute :get_window_position, window_handle: handle
270
255
 
271
256
  Point.new data['x'], data['y']
272
257
  end
@@ -281,68 +266,68 @@ module Selenium
281
266
 
282
267
  def local_storage_item(key, value = nil)
283
268
  if value
284
- execute :setLocalStorageItem, {}, {key: key, value: value}
269
+ execute :set_local_storage_item, {}, {key: key, value: value}
285
270
  else
286
- execute :getLocalStorageItem, key: key
271
+ execute :get_local_storage_item, key: key
287
272
  end
288
273
  end
289
274
 
290
275
  def remove_local_storage_item(key)
291
- execute :removeLocalStorageItem, key: key
276
+ execute :remove_local_storage_item, key: key
292
277
  end
293
278
 
294
279
  def local_storage_keys
295
- execute :getLocalStorageKeys
280
+ execute :get_local_storage_keys
296
281
  end
297
282
 
298
283
  def clear_local_storage
299
- execute :clearLocalStorage
284
+ execute :clear_local_storage
300
285
  end
301
286
 
302
287
  def local_storage_size
303
- execute :getLocalStorageSize
288
+ execute :get_local_storage_size
304
289
  end
305
290
 
306
291
  def session_storage_item(key, value = nil)
307
292
  if value
308
- execute :setSessionStorageItem, {}, {key: key, value: value}
293
+ execute :set_session_storage_item, {}, {key: key, value: value}
309
294
  else
310
- execute :getSessionStorageItem, key: key
295
+ execute :get_session_storage_item, key: key
311
296
  end
312
297
  end
313
298
 
314
299
  def remove_session_storage_item(key)
315
- execute :removeSessionStorageItem, key: key
300
+ execute :remove_session_storage_item, key: key
316
301
  end
317
302
 
318
303
  def session_storage_keys
319
- execute :getSessionStorageKeys
304
+ execute :get_session_storage_keys
320
305
  end
321
306
 
322
307
  def clear_session_storage
323
- execute :clearSessionStorage
308
+ execute :clear_session_storage
324
309
  end
325
310
 
326
311
  def session_storage_size
327
- execute :getSessionStorageSize
312
+ execute :get_session_storage_size
328
313
  end
329
314
 
330
315
  def location
331
- obj = execute(:getLocation) || {}
316
+ obj = execute(:get_location) || {}
332
317
  Location.new obj['latitude'], obj['longitude'], obj['altitude']
333
318
  end
334
319
 
335
320
  def set_location(lat, lon, alt)
336
321
  loc = {latitude: lat, longitude: lon, altitude: alt}
337
- execute :setLocation, {}, {location: loc}
322
+ execute :set_location, {}, {location: loc}
338
323
  end
339
324
 
340
325
  def network_connection
341
- execute :getNetworkConnection
326
+ execute :get_network_connection
342
327
  end
343
328
 
344
329
  def network_connection=(type)
345
- execute :setNetworkConnection, {}, {parameters: {type: type}}
330
+ execute :set_network_connection, {}, {parameters: {type: type}}
346
331
  end
347
332
 
348
333
  #
@@ -352,14 +337,14 @@ module Selenium
352
337
  def execute_script(script, *args)
353
338
  assert_javascript_enabled
354
339
 
355
- result = execute :executeScript, {}, {script: script, args: args}
340
+ result = execute :execute_script, {}, {script: script, args: args}
356
341
  unwrap_script_result result
357
342
  end
358
343
 
359
344
  def execute_async_script(script, *args)
360
345
  assert_javascript_enabled
361
346
 
362
- result = execute :executeAsyncScript, {}, {script: script, args: args}
347
+ result = execute :execute_async_script, {}, {script: script, args: args}
363
348
  unwrap_script_result result
364
349
  end
365
350
 
@@ -367,20 +352,24 @@ module Selenium
367
352
  # cookies
368
353
  #
369
354
 
355
+ def options
356
+ @options ||= WebDriver::Options.new(self)
357
+ end
358
+
370
359
  def add_cookie(cookie)
371
- execute :addCookie, {}, {cookie: cookie}
360
+ execute :add_cookie, {}, {cookie: cookie}
372
361
  end
373
362
 
374
363
  def delete_cookie(name)
375
- execute :deleteCookie, name: name
364
+ execute :delete_cookie, name: name
376
365
  end
377
366
 
378
367
  def cookies
379
- execute :getCookies
368
+ execute :get_cookies
380
369
  end
381
370
 
382
371
  def delete_all_cookies
383
- execute :deleteAllCookies
372
+ execute :delete_all_cookies
384
373
  end
385
374
 
386
375
  #
@@ -388,7 +377,7 @@ module Selenium
388
377
  #
389
378
 
390
379
  def click_element(element)
391
- execute :clickElement, id: element
380
+ execute :click_element, id: element
392
381
  end
393
382
 
394
383
  def click
@@ -396,7 +385,7 @@ module Selenium
396
385
  end
397
386
 
398
387
  def double_click
399
- execute :doubleClick
388
+ execute :double_click
400
389
  end
401
390
 
402
391
  def context_click
@@ -404,11 +393,11 @@ module Selenium
404
393
  end
405
394
 
406
395
  def mouse_down
407
- execute :mouseDown
396
+ execute :mouse_down
408
397
  end
409
398
 
410
399
  def mouse_up
411
- execute :mouseUp
400
+ execute :mouse_up
412
401
  end
413
402
 
414
403
  def mouse_move_to(element, x = nil, y = nil)
@@ -419,11 +408,11 @@ module Selenium
419
408
  params[:yoffset] = y
420
409
  end
421
410
 
422
- execute :mouseMoveTo, {}, params
411
+ execute :mouse_move_to, {}, params
423
412
  end
424
413
 
425
414
  def send_keys_to_active_element(key)
426
- execute :sendKeysToActiveElement, {}, {value: key}
415
+ execute :send_keys_to_active_element, {}, {value: key}
427
416
  end
428
417
 
429
418
  def send_keys_to_element(element, keys)
@@ -432,7 +421,7 @@ module Selenium
432
421
  keys = upload(local_file) if local_file
433
422
  end
434
423
 
435
- execute :sendKeysToElement, {id: element}, {value: Array(keys)}
424
+ execute :send_keys_to_element, {id: element}, {value: Array(keys)}
436
425
  end
437
426
 
438
427
  def upload(local_file)
@@ -440,72 +429,72 @@ module Selenium
440
429
  raise Error::WebDriverError, "you may only upload files: #{local_file.inspect}"
441
430
  end
442
431
 
443
- execute :uploadFile, {}, {file: Zipper.zip_file(local_file)}
432
+ execute :upload_file, {}, {file: Zipper.zip_file(local_file)}
444
433
  end
445
434
 
446
435
  def clear_element(element)
447
- execute :clearElement, id: element
436
+ execute :clear_element, id: element
448
437
  end
449
438
 
450
439
  def submit_element(element)
451
- execute :submitElement, id: element
440
+ execute :submit_element, id: element
452
441
  end
453
442
 
454
443
  def drag_element(element, right_by, down_by)
455
- execute :dragElement, {id: element}, {x: right_by, y: down_by}
444
+ execute :drag_element, {id: element}, {x: right_by, y: down_by}
456
445
  end
457
446
 
458
447
  def touch_single_tap(element)
459
- execute :touchSingleTap, {}, {element: element}
448
+ execute :touch_single_tap, {}, {element: element}
460
449
  end
461
450
 
462
451
  def touch_double_tap(element)
463
- execute :touchDoubleTap, {}, {element: element}
452
+ execute :touch_double_tap, {}, {element: element}
464
453
  end
465
454
 
466
455
  def touch_long_press(element)
467
- execute :touchLongPress, {}, {element: element}
456
+ execute :touch_long_press, {}, {element: element}
468
457
  end
469
458
 
470
459
  def touch_down(x, y)
471
- execute :touchDown, {}, {x: x, y: y}
460
+ execute :touch_down, {}, {x: x, y: y}
472
461
  end
473
462
 
474
463
  def touch_up(x, y)
475
- execute :touchUp, {}, {x: x, y: y}
464
+ execute :touch_up, {}, {x: x, y: y}
476
465
  end
477
466
 
478
467
  def touch_move(x, y)
479
- execute :touchMove, {}, {x: x, y: y}
468
+ execute :touch_move, {}, {x: x, y: y}
480
469
  end
481
470
 
482
471
  def touch_scroll(element, x, y)
483
472
  if element
484
- execute :touchScroll, {}, {element: element,
473
+ execute :touch_scroll, {}, {element: element,
485
474
  xoffset: x,
486
475
  yoffset: y}
487
476
  else
488
- execute :touchScroll, {}, {xoffset: x, yoffset: y}
477
+ execute :touch_scroll, {}, {xoffset: x, yoffset: y}
489
478
  end
490
479
  end
491
480
 
492
481
  def touch_flick(xspeed, yspeed)
493
- execute :touchFlick, {}, {xspeed: xspeed, yspeed: yspeed}
482
+ execute :touch_flick, {}, {xspeed: xspeed, yspeed: yspeed}
494
483
  end
495
484
 
496
485
  def touch_element_flick(element, right_by, down_by, speed)
497
- execute :touchFlick, {}, {element: element,
486
+ execute :touch_flick, {}, {element: element,
498
487
  xoffset: right_by,
499
488
  yoffset: down_by,
500
489
  speed: speed}
501
490
  end
502
491
 
503
492
  def screen_orientation=(orientation)
504
- execute :setScreenOrientation, {}, {orientation: orientation}
493
+ execute :set_screen_orientation, {}, {orientation: orientation}
505
494
  end
506
495
 
507
496
  def screen_orientation
508
- execute :getScreenOrientation
497
+ execute :get_screen_orientation
509
498
  end
510
499
 
511
500
  #
@@ -513,12 +502,12 @@ module Selenium
513
502
  #
514
503
 
515
504
  def available_log_types
516
- types = execute :getAvailableLogTypes
505
+ types = execute :get_available_log_types
517
506
  Array(types).map(&:to_sym)
518
507
  end
519
508
 
520
509
  def log(type)
521
- data = execute :getLog, {}, {type: type.to_s}
510
+ data = execute :get_log, {}, {type: type.to_s}
522
511
 
523
512
  Array(data).map do |l|
524
513
  begin
@@ -534,53 +523,58 @@ module Selenium
534
523
  #
535
524
 
536
525
  def element_tag_name(element)
537
- execute :getElementTagName, id: element
526
+ execute :get_element_tag_name, id: element
538
527
  end
539
528
 
540
529
  def element_attribute(element, name)
541
- execute :getElementAttribute, id: element.ref, name: name
530
+ execute :get_element_attribute, id: element.ref, name: name
531
+ end
532
+
533
+ # Backwards compatibility for w3c
534
+ def element_property(element, name)
535
+ execute_script 'return arguments[0][arguments[1]]', element, name
542
536
  end
543
537
 
544
538
  def element_value(element)
545
- execute :getElementValue, id: element
539
+ execute :get_element_value, id: element
546
540
  end
547
541
 
548
542
  def element_text(element)
549
- execute :getElementText, id: element
543
+ execute :get_element_text, id: element
550
544
  end
551
545
 
552
546
  def element_location(element)
553
- data = execute :getElementLocation, id: element
547
+ data = execute :get_element_location, id: element
554
548
 
555
549
  Point.new data['x'], data['y']
556
550
  end
557
551
 
558
552
  def element_location_once_scrolled_into_view(element)
559
- data = execute :getElementLocationOnceScrolledIntoView, id: element
553
+ data = execute :get_element_location_once_scrolled_into_view, id: element
560
554
 
561
555
  Point.new data['x'], data['y']
562
556
  end
563
557
 
564
558
  def element_size(element)
565
- data = execute :getElementSize, id: element
559
+ data = execute :get_element_size, id: element
566
560
 
567
561
  Dimension.new data['width'], data['height']
568
562
  end
569
563
 
570
564
  def element_enabled?(element)
571
- execute :isElementEnabled, id: element
565
+ execute :is_element_enabled, id: element
572
566
  end
573
567
 
574
568
  def element_selected?(element)
575
- execute :isElementSelected, id: element
569
+ execute :is_element_selected, id: element
576
570
  end
577
571
 
578
572
  def element_displayed?(element)
579
- execute :isElementDisplayed, id: element
573
+ execute :is_element_displayed, id: element
580
574
  end
581
575
 
582
576
  def element_value_of_css_property(element, prop)
583
- execute :getElementValueOfCssProperty, id: element, property_name: prop
577
+ execute :get_element_value_of_css_property, id: element, property_name: prop
584
578
  end
585
579
 
586
580
  #
@@ -588,16 +582,16 @@ module Selenium
588
582
  #
589
583
 
590
584
  def active_element
591
- Element.new self, element_id_from(execute(:getActiveElement))
585
+ Element.new self, element_id_from(execute(:get_active_element))
592
586
  end
593
587
 
594
588
  alias_method :switch_to_active_element, :active_element
595
589
 
596
590
  def find_element_by(how, what, parent = nil)
597
591
  id = if parent
598
- execute :findChildElement, {id: parent}, {using: how, value: what}
592
+ execute :find_child_element, {id: parent}, {using: how, value: what}
599
593
  else
600
- execute :findElement, {}, {using: how, value: what}
594
+ execute :find_element, {}, {using: how, value: what}
601
595
  end
602
596
 
603
597
  Element.new self, element_id_from(id)
@@ -605,9 +599,9 @@ module Selenium
605
599
 
606
600
  def find_elements_by(how, what, parent = nil)
607
601
  ids = if parent
608
- execute :findChildElements, {id: parent}, {using: how, value: what}
602
+ execute :find_child_elements, {id: parent}, {using: how, value: what}
609
603
  else
610
- execute :findElements, {}, {using: how, value: what}
604
+ execute :find_elements, {}, {using: how, value: what}
611
605
  end
612
606
 
613
607
  ids.map { |id| Element.new self, element_id_from(id) }
@@ -638,7 +632,7 @@ module Selenium
638
632
  #
639
633
 
640
634
  def raw_execute(command, opts = {}, command_hash = nil)
641
- verb, path = COMMANDS[command] || raise(ArgumentError, "unknown command: #{command.inspect}")
635
+ verb, path = commands(command) || raise(ArgumentError, "unknown command: #{command.inspect}")
642
636
  path = path.dup
643
637
 
644
638
  path[':session_id'] = @session_id if path.include?(':session_id')