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
@@ -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