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
@@ -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
@@ -19,32 +17,32 @@
19
17
 
20
18
  module Selenium
21
19
  module WebDriver
22
- module Firefox
20
+ module Safari
23
21
 
22
+ #
23
+ # Driver implementation for Safari.
24
24
  # @api private
25
- class W3CBridge < Remote::W3CBridge
25
+ #
26
+
27
+ class Driver < WebDriver::Driver
28
+ include DriverExtensions::TakesScreenshot
26
29
 
27
30
  def initialize(opts = {})
28
- caps = opts[:desired_capabilities] ||= Remote::W3CCapabilities.firefox
29
- Binary.path = caps[:firefox_binary] if caps[:firefox_binary]
31
+ opts[:desired_capabilities] ||= Remote::Capabilities.safari
30
32
 
31
- @service = Service.default_service(*extract_service_args(opts))
32
- @service.start
33
- opts[:url] = @service.uri
33
+ unless opts.key?(:url)
34
+ driver_path = opts.delete(:driver_path) || Safari.driver_path
35
+ driver_opts = opts.delete(:driver_opts) || {}
36
+ port = opts.delete(:port) || Service::DEFAULT_PORT
34
37
 
35
- super
36
- end
38
+ @service = Service.new(driver_path, port, driver_opts)
39
+ @service.start
40
+ opts[:url] = @service.uri
41
+ end
37
42
 
38
- def browser
39
- :firefox
40
- end
41
-
42
- def driver_extensions
43
- [
44
- DriverExtensions::TakesScreenshot,
45
- DriverExtensions::HasInputDevices,
46
- DriverExtensions::HasWebStorage
47
- ]
43
+ listener = opts.delete(:listener)
44
+ @bridge = Remote::Bridge.handshake(opts)
45
+ super(@bridge, listener: listener)
48
46
  end
49
47
 
50
48
  def quit
@@ -53,14 +51,7 @@ module Selenium
53
51
  @service.stop if @service
54
52
  end
55
53
 
56
- private
57
-
58
- def extract_service_args(opts)
59
- service_log_path = opts.delete(:service_log_path)
60
- service_log_path ? ["--log-path=#{service_log_path}"] : []
61
- end
62
-
63
- end # W3CBridge
64
- end # Firefox
54
+ end # Driver
55
+ end # Safari
65
56
  end # WebDriver
66
57
  end # Selenium
@@ -0,0 +1,57 @@
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 Safari
21
+ #
22
+ # @api private
23
+ #
24
+
25
+ class Service < WebDriver::Service
26
+ DEFAULT_PORT = 7050
27
+ @executable = '/usr/bin/safaridriver'.freeze
28
+ @missing_text = <<-ERROR.gsub(/\n +| {2,}/, ' ').freeze
29
+ Unable to find Apple's safaridriver which comes with Safari 10.
30
+ More info at https://webkit.org/blog/6900/webdriver-support-in-safari-10/
31
+ ERROR
32
+
33
+ def stop
34
+ stop_process
35
+ end
36
+
37
+ private
38
+
39
+ def binary_path(path)
40
+ path = self.class.executable if path.nil?
41
+ raise Error::WebDriverError, self.class.missing_text unless path
42
+ Platform.assert_executable path
43
+ path
44
+ end
45
+
46
+ def start_process
47
+ @process = build_process(@executable_path, "--port=#{@port}", *@extra_args)
48
+ @process.start
49
+ end
50
+
51
+ def cannot_connect_error_text
52
+ "unable to connect to safaridriver #{@host}:#{@port}"
53
+ end
54
+ end # Service
55
+ end # Safari
56
+ end # WebDriver
57
+ 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
@@ -20,5 +18,6 @@
20
18
  require 'selenium/webdriver/support/event_firing_bridge'
21
19
  require 'selenium/webdriver/support/abstract_event_listener'
22
20
  require 'selenium/webdriver/support/block_event_listener'
21
+ require 'selenium/webdriver/support/escaper'
23
22
  require 'selenium/webdriver/support/select'
24
23
  require 'selenium/webdriver/support/color'
@@ -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
@@ -20,7 +18,6 @@
20
18
  module Selenium
21
19
  module WebDriver
22
20
  module Support
23
-
24
21
  #
25
22
  # Subclass and override methods from this class
26
23
  # to implement your own event listener.
@@ -48,24 +45,40 @@ module Selenium
48
45
 
49
46
  class AbstractEventListener
50
47
  def before_navigate_to(url, driver) end
48
+
51
49
  def after_navigate_to(url, driver) end
50
+
52
51
  def before_navigate_back(driver) end
52
+
53
53
  def after_navigate_back(driver) end
54
+
54
55
  def before_navigate_forward(driver) end
56
+
55
57
  def after_navigate_forward(driver) end
58
+
56
59
  def before_find(by, what, driver) end
60
+
57
61
  def after_find(by, what, driver) end
62
+
58
63
  def before_click(element, driver) end
64
+
59
65
  def after_click(element, driver) end
66
+
60
67
  def before_change_value_of(element, driver) end
68
+
61
69
  def after_change_value_of(element, driver) end
70
+
62
71
  def before_execute_script(script, driver) end
72
+
63
73
  def after_execute_script(script, driver) end
74
+
64
75
  def before_quit(driver) end
76
+
65
77
  def after_quit(driver) end
78
+
66
79
  def before_close(driver) end
67
- def after_close(driver) end
68
80
 
81
+ def after_close(driver) end
69
82
  end # AbstractEventListener
70
83
  end # Support
71
84
  end # WebDriver
@@ -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
@@ -20,16 +18,14 @@
20
18
  module Selenium
21
19
  module WebDriver
22
20
  module Support
23
-
24
21
  class BlockEventListener
25
22
  def initialize(callback)
26
23
  @callback = callback
27
24
  end
28
25
 
29
- def method_missing(meth, *args, &blk)
26
+ def method_missing(meth, *args)
30
27
  @callback.call meth, *args
31
28
  end
32
-
33
29
  end # BlockEventListener
34
30
  end # Support
35
31
  end # WebDriver
@@ -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
@@ -21,33 +19,52 @@ module Selenium
21
19
  module WebDriver
22
20
  module Support
23
21
  class Color
24
- RGB_PATTERN = /^\s*rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)\s*$/
25
- RGB_PCT_PATTERN = /^\s*rgb\(\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*\)\s*$/
26
- RGBA_PATTERN = /^\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0|1|0\.\d+)\s*\)\s*$/
27
- RGBA_PCT_PATTERN = /^\s*rgba\(\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(0|1|0\.\d+)\s*\)\s*$/
28
- HEX_PATTERN = /#([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})/ # \p{XDigit} or \h only works on Ruby 1.9
29
- HEX3_PATTERN = /#([A-Fa-f0-9])([A-Fa-f0-9])([A-Fa-f0-9])/ # \p{XDigit} or \h only works on Ruby 1.9
30
- HSL_PATTERN = /^\s*hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)\s*$/
31
- HSLA_PATTERN = /^\s*hsla\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*,\s*(0|1|0\.\d+)\s*\)\s*$/
22
+ RGB_PATTERN = %r{^\s*rgb\(\s*(\d{1,3})\s*,
23
+ \s*(\d{1,3})\s*,
24
+ \s*(\d{1,3})\s*\)\s*$}x
25
+ RGB_PCT_PATTERN = %r{^\s*rgb\(\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,
26
+ \s*(\d{1,3}|\d{1,2}\.\d+)%\s*,
27
+ \s*(\d{1,3}|\d{1,2}\.\d+)%\s*\)\s*$}x
28
+ RGBA_PATTERN = %r{^\s*rgba\(\s*(\d{1,3})\s*,
29
+ \s*(\d{1,3})\s*,
30
+ \s*(\d{1,3})\s*,
31
+ \s*(0|1|0\.\d+)\s*\)\s*$}x
32
+ RGBA_PCT_PATTERN = %r{^\s*rgba\(\s*(\d{1,3}|\d{1,2}\.\d+)
33
+ %\s*,\s*(\d{1,3}|\d{1,2}\.\d+)
34
+ %\s*,\s*(\d{1,3}|\d{1,2}\.\d+)
35
+ %\s*,\s*(0|1|0\.\d+)\s*\)\s*$}x
36
+ HEX_PATTERN = /#(\h{2})(\h{2})(\h{2})/
37
+ HEX3_PATTERN = /#(\h)(\h)(\h)/
38
+ HSL_PATTERN = %r{^\s*hsl\(\s*(\d{1,3})\s*,
39
+ \s*(\d{1,3})%\s*,
40
+ \s*(\d{1,3})%\s*\)\s*$}x
41
+ HSLA_PATTERN = %r{^\s*hsla\(\s*(\d{1,3})\s*,
42
+ \s*(\d{1,3})%\s*,
43
+ \s*(\d{1,3})%\s*,
44
+ \s*(0|1|0\.\d+)\s*\)\s*$}x
32
45
 
33
46
  attr_reader :red, :green, :blue, :alpha
34
47
 
35
48
  def self.from_string(str)
36
49
  case str
37
50
  when RGB_PATTERN
38
- new $1, $2, $3
51
+ new Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)
39
52
  when RGB_PCT_PATTERN
40
- new(*[$1, $2, $3].map { |e| Float(e) / 100 * 255 })
53
+ array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
54
+ new(*array.map { |e| Float(e) / 100 * 255 })
41
55
  when RGBA_PATTERN
42
- new $1, $2, $3, $4
56
+ new Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3), Regexp.last_match(4)
43
57
  when RGBA_PCT_PATTERN
44
- new(*[$1, $2, $3].map { |e| Float(e) / 100 * 255 } << $4)
58
+ array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
59
+ new(*array.map { |e| Float(e) / 100 * 255 } << Regexp.last_match(4))
45
60
  when HEX_PATTERN
46
- new(*[$1, $2, $3].map { |e| e.to_i(16) })
61
+ array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
62
+ new(*array.map { |e| e.to_i(16) })
47
63
  when HEX3_PATTERN
48
- new(*[$1, $2, $3].map { |e| (e * 2).to_i(16) })
64
+ array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
65
+ new(*array.map { |e| (e * 2).to_i(16) })
49
66
  when HSL_PATTERN, HSLA_PATTERN
50
- from_hsl($1, $2, $3, $4)
67
+ from_hsl(Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3), Regexp.last_match(4))
51
68
  else
52
69
  raise ArgumentError, "could not convert #{str.inspect} into color"
53
70
  end
@@ -59,48 +76,47 @@ module Selenium
59
76
  l = Float(l) / 100
60
77
  a = Float(a || 1)
61
78
 
62
- if s == 0
79
+ if s.zero?
63
80
  r = l
64
81
  g = r
65
82
  b = r
66
83
  else
67
- luminocity2 = (l < 0.5) ? l * (1 + s) : l + s - l * s
84
+ luminocity2 = l < 0.5 ? l * (1 + s) : l + s - l * s
68
85
  luminocity1 = 2 * l - luminocity2
69
86
 
70
- hue_to_rgb = lambda do |lum1, lum2, hue|
71
- hue += 1 if hue < 0.0
72
- hue -= 1 if hue > 1.0
73
-
74
- if hue < 1.0 / 6.0
75
- (lum1 + (lum2 - lum1) * 6.0 * hue)
76
- elsif hue < 1.0 / 2.0
77
- lum2
78
- elsif hue < 2.0 / 3.0
79
- lum1 + (lum2 - lum1) * ((2.0 / 3.0) - hue) * 6.0
80
- else
81
- lum1
82
- end
83
- end
84
-
85
- r = hue_to_rgb.call(luminocity1, luminocity2, h + 1.0 / 3.0)
86
- g = hue_to_rgb.call(luminocity1, luminocity2, h)
87
- b = hue_to_rgb.call(luminocity1, luminocity2, h - 1.0 / 3.0)
87
+ r = hue_to_rgb(luminocity1, luminocity2, h + 1.0 / 3.0)
88
+ g = hue_to_rgb(luminocity1, luminocity2, h)
89
+ b = hue_to_rgb(luminocity1, luminocity2, h - 1.0 / 3.0)
88
90
  end
89
91
 
90
92
  new (r * 255).round, (g * 255).round, (b * 255).round, a
91
93
  end
92
94
 
95
+ def self.hue_to_rgb(lum1, lum2, hue)
96
+ hue += 1 if hue < 0.0
97
+ hue -= 1 if hue > 1.0
98
+
99
+ if hue < 1.0 / 6.0
100
+ (lum1 + (lum2 - lum1) * 6.0 * hue)
101
+ elsif hue < 1.0 / 2.0
102
+ lum2
103
+ elsif hue < 2.0 / 3.0
104
+ lum1 + (lum2 - lum1) * ((2.0 / 3.0) - hue) * 6.0
105
+ else
106
+ lum1
107
+ end
108
+ end
93
109
 
94
110
  def initialize(red, green, blue, alpha = 1)
95
- @red = Integer(red)
111
+ @red = Integer(red)
96
112
  @green = Integer(green)
97
- @blue = Integer(blue)
113
+ @blue = Integer(blue)
98
114
  @alpha = Float(alpha)
99
115
  end
100
116
 
101
117
  def ==(other)
102
118
  return true if equal?(other)
103
- return false unless other.kind_of?(self.class)
119
+ return false unless other.is_a?(self.class)
104
120
 
105
121
  [red, green, blue, alpha] == [other.red, other.green, other.blue, other.alpha]
106
122
  end
@@ -120,9 +136,8 @@ module Selenium
120
136
  end
121
137
 
122
138
  def hex
123
- "#%02x%02x%02x" % [red, green, blue]
139
+ format '#%02x%02x%02x', red, green, blue
124
140
  end
125
-
126
141
  end # Color
127
142
  end # Support
128
143
  end # WebDriver
@@ -0,0 +1,41 @@
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 Support
21
+ module Escaper
22
+ def self.escape(str)
23
+ if str.include?('"') && str.include?("'")
24
+ parts = str.split('"', -1).map { |part| %("#{part}") }
25
+
26
+ quoted = parts.join(%(, '"', ))
27
+ .gsub(/^"", |, ""$/, '')
28
+
29
+ "concat(#{quoted})"
30
+ elsif str.include?('"')
31
+ # escape string with just a quote into being single quoted: f"oo -> 'f"oo'
32
+ "'#{str}'"
33
+ else
34
+ # otherwise return the quoted string
35
+ %("#{str}")
36
+ end
37
+ end
38
+ end # Escaper
39
+ end # Support
40
+ end # WebDriver
41
+ 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
@@ -20,7 +18,6 @@
20
18
  module Selenium
21
19
  module WebDriver
22
20
  module Support
23
-
24
21
  #
25
22
  # @api private
26
23
  #
@@ -29,69 +26,69 @@ module Selenium
29
26
  def initialize(delegate, listener)
30
27
  @delegate = delegate
31
28
 
32
- if listener.respond_to? :call
33
- @listener = BlockEventListener.new(listener)
34
- else
35
- @listener = listener
36
- end
29
+ @listener = if listener.respond_to? :call
30
+ BlockEventListener.new(listener)
31
+ else
32
+ listener
33
+ end
37
34
  end
38
35
 
39
36
  def get(url)
40
- dispatch(:navigate_to, url, driver) {
37
+ dispatch(:navigate_to, url, driver) do
41
38
  @delegate.get(url)
42
- }
39
+ end
43
40
  end
44
41
 
45
- def goForward
46
- dispatch(:navigate_forward, driver) {
47
- @delegate.goForward
48
- }
42
+ def go_forward
43
+ dispatch(:navigate_forward, driver) do
44
+ @delegate.go_forward
45
+ end
49
46
  end
50
47
 
51
- def goBack
52
- dispatch(:navigate_back, driver) {
53
- @delegate.goBack
54
- }
48
+ def go_back
49
+ dispatch(:navigate_back, driver) do
50
+ @delegate.go_back
51
+ end
55
52
  end
56
53
 
57
- def clickElement(ref)
58
- dispatch(:click, create_element(ref), driver) {
59
- @delegate.clickElement(ref)
60
- }
54
+ def click_element(ref)
55
+ dispatch(:click, create_element(ref), driver) do
56
+ @delegate.click_element(ref)
57
+ end
61
58
  end
62
59
 
63
- def clearElement(ref)
64
- dispatch(:change_value_of, create_element(ref), driver) {
65
- @delegate.clearElement(ref)
66
- }
60
+ def clear_element(ref)
61
+ dispatch(:change_value_of, create_element(ref), driver) do
62
+ @delegate.clear_element(ref)
63
+ end
67
64
  end
68
65
 
69
- def sendKeysToElement(ref, keys)
70
- dispatch(:change_value_of, create_element(ref), driver) {
71
- @delegate.sendKeysToElement(ref, keys)
72
- }
66
+ def send_keys_to_element(ref, keys)
67
+ dispatch(:change_value_of, create_element(ref), driver) do
68
+ @delegate.send_keys_to_element(ref, keys)
69
+ end
73
70
  end
74
71
 
75
72
  def find_element_by(how, what, parent = nil)
76
- e = dispatch(:find, how, what, driver) {
73
+ e = dispatch(:find, how, what, driver) do
77
74
  @delegate.find_element_by how, what, parent
78
- }
75
+ end
79
76
 
80
77
  Element.new self, e.ref
81
78
  end
82
79
 
83
80
  def find_elements_by(how, what, parent = nil)
84
- es = dispatch(:find, how, what, driver) {
81
+ es = dispatch(:find, how, what, driver) do
85
82
  @delegate.find_elements_by(how, what, parent)
86
- }
83
+ end
87
84
 
88
85
  es.map { |e| Element.new self, e.ref }
89
86
  end
90
87
 
91
- def executeScript(script, *args)
92
- dispatch(:execute_script, script, driver) {
93
- @delegate.executeScript(script, *args)
94
- }
88
+ def execute_script(script, *args)
89
+ dispatch(:execute_script, script, driver) do
90
+ @delegate.execute_script(script, *args)
91
+ end
95
92
  end
96
93
 
97
94
  def quit
@@ -113,7 +110,7 @@ module Selenium
113
110
  @driver ||= Driver.new(self)
114
111
  end
115
112
 
116
- def dispatch(name, *args, &blk)
113
+ def dispatch(name, *args)
117
114
  @listener.__send__("before_#{name}", *args)
118
115
  returned = yield
119
116
  @listener.__send__("after_#{name}", *args)
@@ -125,7 +122,6 @@ module Selenium
125
122
  @delegate.__send__(meth, *args, &blk)
126
123
  end
127
124
  end # EventFiringBridge
128
-
129
125
  end # Support
130
126
  end # WebDriver
131
127
  end # Selenium