selenium-webdriver 3.141.0 → 3.142.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +150 -0
  3. data/Gemfile +2 -0
  4. data/LICENSE +1 -1
  5. data/lib/selenium/server.rb +9 -7
  6. data/lib/selenium/webdriver/atoms/getAttribute.js +6 -7
  7. data/lib/selenium/webdriver/atoms/isDisplayed.js +60 -59
  8. data/lib/selenium/webdriver/atoms.rb +20 -1
  9. data/lib/selenium/webdriver/chrome/bridge.rb +23 -3
  10. data/lib/selenium/webdriver/chrome/driver.rb +30 -20
  11. data/lib/selenium/webdriver/chrome/options.rb +11 -7
  12. data/lib/selenium/webdriver/chrome/profile.rb +6 -5
  13. data/lib/selenium/webdriver/chrome/service.rb +13 -13
  14. data/lib/selenium/webdriver/chrome.rb +10 -4
  15. data/lib/selenium/webdriver/common/action_builder.rb +2 -0
  16. data/lib/selenium/webdriver/common/alert.rb +2 -0
  17. data/lib/selenium/webdriver/common/bridge_helper.rb +8 -5
  18. data/lib/selenium/webdriver/common/driver.rb +22 -7
  19. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +2 -0
  20. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +2 -0
  21. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +2 -0
  22. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +3 -3
  23. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +2 -0
  24. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +3 -1
  25. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +2 -0
  26. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +2 -0
  27. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +2 -0
  28. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +2 -0
  29. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +2 -0
  30. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +3 -1
  31. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +2 -0
  32. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +3 -3
  33. data/lib/selenium/webdriver/common/element.rb +3 -1
  34. data/lib/selenium/webdriver/common/error.rb +74 -18
  35. data/lib/selenium/webdriver/common/file_reaper.rb +3 -3
  36. data/lib/selenium/webdriver/common/html5/local_storage.rb +2 -0
  37. data/lib/selenium/webdriver/common/html5/session_storage.rb +2 -0
  38. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +4 -1
  39. data/lib/selenium/webdriver/common/interactions/input_device.rb +3 -0
  40. data/lib/selenium/webdriver/common/interactions/interaction.rb +3 -0
  41. data/lib/selenium/webdriver/common/interactions/interactions.rb +3 -1
  42. data/lib/selenium/webdriver/common/interactions/key_actions.rb +2 -0
  43. data/lib/selenium/webdriver/common/interactions/key_input.rb +4 -0
  44. data/lib/selenium/webdriver/common/interactions/none_input.rb +3 -0
  45. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +2 -0
  46. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +7 -0
  47. data/lib/selenium/webdriver/common/keyboard.rb +4 -1
  48. data/lib/selenium/webdriver/common/keys.rb +3 -0
  49. data/lib/selenium/webdriver/common/log_entry.rb +4 -2
  50. data/lib/selenium/webdriver/common/logger.rb +15 -40
  51. data/lib/selenium/webdriver/common/logs.rb +2 -0
  52. data/lib/selenium/webdriver/common/manager.rb +177 -0
  53. data/lib/selenium/webdriver/common/mouse.rb +3 -0
  54. data/lib/selenium/webdriver/common/navigation.rb +2 -0
  55. data/lib/selenium/webdriver/common/options.rb +28 -126
  56. data/lib/selenium/webdriver/common/platform.rb +26 -30
  57. data/lib/selenium/webdriver/common/port_prober.rb +6 -19
  58. data/lib/selenium/webdriver/common/profile_helper.rb +2 -0
  59. data/lib/selenium/webdriver/common/proxy.rb +13 -5
  60. data/lib/selenium/webdriver/common/search_context.rb +6 -8
  61. data/lib/selenium/webdriver/common/service.rb +87 -29
  62. data/lib/selenium/webdriver/common/socket_lock.rb +10 -3
  63. data/lib/selenium/webdriver/common/socket_poller.rb +26 -18
  64. data/lib/selenium/webdriver/common/target_locator.rb +6 -4
  65. data/lib/selenium/webdriver/common/timeouts.rb +2 -0
  66. data/lib/selenium/webdriver/common/touch_action_builder.rb +5 -6
  67. data/lib/selenium/webdriver/common/touch_screen.rb +4 -1
  68. data/lib/selenium/webdriver/common/w3c_action_builder.rb +3 -0
  69. data/lib/selenium/webdriver/common/{w3c_options.rb → w3c_manager.rb} +3 -1
  70. data/lib/selenium/webdriver/common/wait.rb +13 -5
  71. data/lib/selenium/webdriver/common/window.rb +2 -0
  72. data/lib/selenium/webdriver/common/zipper.rb +3 -3
  73. data/lib/selenium/webdriver/common.rb +5 -2
  74. data/lib/selenium/webdriver/edge/bridge.rb +2 -0
  75. data/lib/selenium/webdriver/edge/driver.rb +6 -13
  76. data/lib/selenium/webdriver/edge/options.rb +3 -0
  77. data/lib/selenium/webdriver/edge/service.rb +8 -12
  78. data/lib/selenium/webdriver/edge.rb +11 -5
  79. data/lib/selenium/webdriver/firefox/binary.rb +9 -8
  80. data/lib/selenium/webdriver/firefox/driver.rb +2 -0
  81. data/lib/selenium/webdriver/firefox/extension.rb +4 -4
  82. data/lib/selenium/webdriver/firefox/launcher.rb +3 -0
  83. data/lib/selenium/webdriver/firefox/legacy/driver.rb +7 -3
  84. data/lib/selenium/webdriver/firefox/marionette/bridge.rb +4 -2
  85. data/lib/selenium/webdriver/firefox/marionette/driver.rb +6 -12
  86. data/lib/selenium/webdriver/firefox/options.rb +22 -9
  87. data/lib/selenium/webdriver/firefox/profile.rb +7 -8
  88. data/lib/selenium/webdriver/firefox/profiles_ini.rb +3 -0
  89. data/lib/selenium/webdriver/firefox/service.rb +8 -19
  90. data/lib/selenium/webdriver/firefox/util.rb +2 -0
  91. data/lib/selenium/webdriver/firefox.rb +10 -4
  92. data/lib/selenium/webdriver/ie/driver.rb +5 -11
  93. data/lib/selenium/webdriver/ie/options.rb +6 -4
  94. data/lib/selenium/webdriver/ie/service.rb +8 -12
  95. data/lib/selenium/webdriver/ie.rb +10 -4
  96. data/lib/selenium/webdriver/remote/bridge.rb +8 -6
  97. data/lib/selenium/webdriver/remote/capabilities.rb +23 -10
  98. data/lib/selenium/webdriver/remote/driver.rb +2 -0
  99. data/lib/selenium/webdriver/remote/http/common.rb +11 -4
  100. data/lib/selenium/webdriver/remote/http/curb.rb +4 -2
  101. data/lib/selenium/webdriver/remote/http/default.rb +31 -25
  102. data/lib/selenium/webdriver/remote/http/persistent.rb +3 -1
  103. data/lib/selenium/webdriver/remote/oss/bridge.rb +5 -2
  104. data/lib/selenium/webdriver/remote/oss/commands.rb +106 -104
  105. data/lib/selenium/webdriver/remote/response.rb +11 -3
  106. data/lib/selenium/webdriver/remote/server_error.rb +2 -0
  107. data/lib/selenium/webdriver/remote/w3c/bridge.rb +28 -13
  108. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +37 -21
  109. data/lib/selenium/webdriver/remote/w3c/commands.rb +61 -58
  110. data/lib/selenium/webdriver/remote.rb +2 -0
  111. data/lib/selenium/webdriver/safari/bridge.rb +5 -3
  112. data/lib/selenium/webdriver/safari/driver.rb +9 -11
  113. data/lib/selenium/webdriver/safari/options.rb +2 -0
  114. data/lib/selenium/webdriver/safari/service.rb +6 -25
  115. data/lib/selenium/webdriver/safari.rb +11 -4
  116. data/lib/selenium/webdriver/support/abstract_event_listener.rb +2 -0
  117. data/lib/selenium/webdriver/support/block_event_listener.rb +3 -1
  118. data/lib/selenium/webdriver/support/color.rb +11 -9
  119. data/lib/selenium/webdriver/support/escaper.rb +2 -0
  120. data/lib/selenium/webdriver/support/event_firing_bridge.rb +3 -1
  121. data/lib/selenium/webdriver/support/select.rb +19 -18
  122. data/lib/selenium/webdriver/support.rb +2 -0
  123. data/lib/selenium/webdriver/version.rb +3 -1
  124. data/lib/selenium/webdriver.rb +3 -1
  125. data/lib/selenium-webdriver.rb +2 -0
  126. data/selenium-webdriver.gemspec +15 -8
  127. metadata +86 -27
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -34,6 +36,7 @@ module Selenium
34
36
 
35
37
  def encode
36
38
  return nil if no_actions?
39
+
37
40
  output = {type: type, id: name, actions: @actions.map(&:encode)}
38
41
  output[:parameters] = {pointerType: kind}
39
42
  output
@@ -41,6 +44,7 @@ module Selenium
41
44
 
42
45
  def assert_kind(pointer)
43
46
  raise TypeError, "#{pointer.inspect} is not a valid pointer type" unless KIND.key? pointer
47
+
44
48
  KIND[pointer]
45
49
  end
46
50
 
@@ -78,14 +82,17 @@ module Selenium
78
82
  def assert_button(button)
79
83
  if button.is_a? Symbol
80
84
  raise TypeError, "#{button.inspect} is not a valid button!" unless BUTTONS.key? button
85
+
81
86
  button = BUTTONS[button]
82
87
  end
83
88
  raise ArgumentError, 'Button number cannot be negative!' unless button >= 0
89
+
84
90
  button
85
91
  end
86
92
 
87
93
  def assert_direction(direction)
88
94
  raise TypeError, "#{direction.inspect} is not a valid button direction" unless DIRECTIONS.key? direction
95
+
89
96
  DIRECTIONS[direction]
90
97
  end
91
98
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -56,10 +58,11 @@ module Selenium
56
58
 
57
59
  private
58
60
 
59
- MODIFIERS = [:control, :shift, :alt, :command, :meta].freeze
61
+ MODIFIERS = %i[control shift alt command meta].freeze
60
62
 
61
63
  def assert_modifier(key)
62
64
  return if MODIFIERS.include? key
65
+
63
66
  raise ArgumentError, "#{key.inspect} is not a modifier key, expected one of #{MODIFIERS.inspect}"
64
67
  end
65
68
  end # Keyboard
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -110,6 +112,7 @@ module Selenium
110
112
 
111
113
  def self.[](key)
112
114
  return KEYS[key] if KEYS[key]
115
+
113
116
  raise Error::UnsupportedOperationError, "no such key #{key.inspect}"
114
117
  end
115
118
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -28,9 +30,9 @@ module Selenium
28
30
 
29
31
  def as_json(*)
30
32
  {
31
- 'level' => level,
33
+ 'level' => level,
32
34
  'timestamp' => timestamp,
33
- 'message' => message
35
+ 'message' => message
34
36
  }
35
37
  end
36
38
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -33,54 +35,27 @@ module Selenium
33
35
  #
34
36
  class Logger
35
37
  extend Forwardable
36
- include ::Logger::Severity
37
38
 
38
- def_delegators :@logger, :debug, :debug?,
39
+ def_delegators :@logger,
40
+ :close,
41
+ :debug, :debug?,
39
42
  :info, :info?,
40
43
  :warn, :warn?,
41
44
  :error, :error?,
42
45
  :fatal, :fatal?,
43
- :level
46
+ :level, :level=
44
47
 
45
48
  def initialize
46
49
  @logger = create_logger($stdout)
47
50
  end
48
51
 
49
- def output=(io)
50
- # `Logger#reopen` was added in Ruby 2.3
51
- if @logger.respond_to?(:reopen)
52
- @logger.reopen(io)
53
- else
54
- @logger = create_logger(io)
55
- end
56
- end
57
-
58
52
  #
59
- # For Ruby < 2.3 compatibility
60
- # Based on https://github.com/ruby/ruby/blob/ruby_2_3/lib/logger.rb#L250
53
+ # Changes logger output to a new IO.
61
54
  #
62
-
63
- def level=(severity)
64
- if severity.is_a?(Integer)
65
- @logger.level = severity
66
- else
67
- case severity.to_s.downcase
68
- when 'debug'.freeze
69
- @logger.level = DEBUG
70
- when 'info'.freeze
71
- @logger.level = INFO
72
- when 'warn'.freeze
73
- @logger.level = WARN
74
- when 'error'.freeze
75
- @logger.level = ERROR
76
- when 'fatal'.freeze
77
- @logger.level = FATAL
78
- when 'unknown'.freeze
79
- @logger.level = UNKNOWN
80
- else
81
- raise ArgumentError, "invalid log level: #{severity}"
82
- end
83
- end
55
+ # @param [String] io
56
+ #
57
+ def output=(io)
58
+ @logger.reopen(io)
84
59
  end
85
60
 
86
61
  #
@@ -95,7 +70,7 @@ module Selenium
95
70
  # @api private
96
71
  #
97
72
  def io
98
- @logger.instance_variable_get(:@logdev).instance_variable_get(:@dev)
73
+ @logger.instance_variable_get(:@logdev).dev
99
74
  end
100
75
 
101
76
  #
@@ -105,7 +80,7 @@ module Selenium
105
80
  # @param [String, nil] new
106
81
  #
107
82
  def deprecate(old, new = nil)
108
- message = "[DEPRECATION] #{old} is deprecated"
83
+ message = +"[DEPRECATION] #{old} is deprecated"
109
84
  message << if new
110
85
  ". Use #{new} instead."
111
86
  else
@@ -130,9 +105,9 @@ module Selenium
130
105
 
131
106
  def default_level
132
107
  if $DEBUG || ENV.key?('DEBUG')
133
- DEBUG
108
+ :debug
134
109
  else
135
- WARN
110
+ :warn
136
111
  end
137
112
  end
138
113
  end # Logger
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -0,0 +1,177 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
20
+ module Selenium
21
+ module WebDriver
22
+ class Manager
23
+ #
24
+ # @api private
25
+ #
26
+
27
+ def initialize(bridge)
28
+ @bridge = bridge
29
+ end
30
+
31
+ #
32
+ # Add a cookie to the browser
33
+ #
34
+ # @param [Hash] opts the options to create a cookie with.
35
+ # @option opts [String] :name A name
36
+ # @option opts [String] :value A value
37
+ # @option opts [String] :path ('/') A path
38
+ # @option opts [String] :secure (false) A boolean
39
+ # @option opts [Time,DateTime,Numeric,nil] :expires (nil) Expiry date, either as a Time, DateTime, or seconds since epoch.
40
+ #
41
+ # @raise [ArgumentError] if :name or :value is not specified
42
+ #
43
+
44
+ def add_cookie(opts = {})
45
+ raise ArgumentError, 'name is required' unless opts[:name]
46
+ raise ArgumentError, 'value is required' unless opts[:value]
47
+
48
+ opts[:path] ||= '/'
49
+ opts[:secure] ||= false
50
+
51
+ obj = opts.delete(:expires)
52
+ opts[:expiry] = seconds_from(obj).to_i if obj
53
+
54
+ @bridge.add_cookie opts
55
+ end
56
+
57
+ #
58
+ # Get the cookie with the given name
59
+ #
60
+ # @param [String] name the name of the cookie
61
+ # @return [Hash, nil] the cookie, or nil if it wasn't found.
62
+ #
63
+
64
+ def cookie_named(name)
65
+ all_cookies.find { |c| c[:name] == name }
66
+ end
67
+
68
+ #
69
+ # Delete the cookie with the given name
70
+ #
71
+ # @param [String] name the name of the cookie to delete
72
+ #
73
+
74
+ def delete_cookie(name)
75
+ @bridge.delete_cookie name
76
+ end
77
+
78
+ #
79
+ # Delete all cookies
80
+ #
81
+
82
+ def delete_all_cookies
83
+ @bridge.delete_all_cookies
84
+ end
85
+
86
+ #
87
+ # Get all cookies
88
+ #
89
+ # @return [Array<Hash>] list of cookies
90
+ #
91
+
92
+ def all_cookies
93
+ @bridge.cookies.map { |cookie| convert_cookie(cookie) }
94
+ end
95
+
96
+ def timeouts
97
+ @timeouts ||= Timeouts.new(@bridge)
98
+ end
99
+
100
+ #
101
+ # @api beta This API may be changed or removed in a future release.
102
+ #
103
+
104
+ def logs
105
+ @logs ||= Logs.new(@bridge)
106
+ end
107
+
108
+ #
109
+ # Create a new top-level browsing context
110
+ # https://w3c.github.io/webdriver/#new-window
111
+ # @param type [Symbol] Supports two values: :tab and :window.
112
+ # Use :tab if you'd like the new window to share an OS-level window
113
+ # with the current browsing context.
114
+ # Use :window otherwise
115
+ # @return [String] The value of the window handle
116
+ #
117
+ def new_window(type = :tab)
118
+ case type
119
+ when :tab, :window
120
+ result = @bridge.new_window(type)
121
+ unless result.key?('handle')
122
+ raise UnknownError, "the driver did not return a handle. " \
123
+ "The returned result: #{result.inspect}"
124
+ end
125
+ result['handle']
126
+ else
127
+ raise ArgumentError, "invalid argument for type. Got: '#{type.inspect}'. " \
128
+ "Try :tab or :window"
129
+ end
130
+ end
131
+
132
+ #
133
+ # @api beta This API may be changed or removed in a future release.
134
+ #
135
+
136
+ def window
137
+ @window ||= Window.new(@bridge)
138
+ end
139
+
140
+ private
141
+
142
+ SECONDS_PER_DAY = 86_400.0
143
+
144
+ def datetime_at(int)
145
+ DateTime.civil(1970) + (int / SECONDS_PER_DAY)
146
+ end
147
+
148
+ def seconds_from(obj)
149
+ case obj
150
+ when Time
151
+ obj.to_f
152
+ when DateTime
153
+ (obj - DateTime.civil(1970)) * SECONDS_PER_DAY
154
+ when Numeric
155
+ obj
156
+ else
157
+ raise ArgumentError, "invalid value for expiration date: #{obj.inspect}"
158
+ end
159
+ end
160
+
161
+ def strip_port(str)
162
+ str.split(':', 2).first
163
+ end
164
+
165
+ def convert_cookie(cookie)
166
+ {
167
+ name: cookie['name'],
168
+ value: cookie['value'],
169
+ path: cookie['path'],
170
+ domain: cookie['domain'] && strip_port(cookie['domain']),
171
+ expires: cookie['expiry'] && datetime_at(cookie['expiry']),
172
+ secure: cookie['secure']
173
+ }
174
+ end
175
+ end # Options
176
+ end # WebDriver
177
+ end # Selenium
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -79,6 +81,7 @@ module Selenium
79
81
 
80
82
  def assert_element(element)
81
83
  return if element.is_a? Element
84
+
82
85
  raise TypeError, "expected #{Element}, got #{element.inspect}:#{element.class}"
83
86
  end
84
87
  end # Mouse
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -17,135 +19,35 @@
17
19
 
18
20
  module Selenium
19
21
  module WebDriver
20
- class Options
21
- #
22
- # @api private
23
- #
24
-
25
- def initialize(bridge)
26
- @bridge = bridge
27
- end
28
-
29
- #
30
- # Add a cookie to the browser
31
- #
32
- # @param [Hash] opts the options to create a cookie with.
33
- # @option opts [String] :name A name
34
- # @option opts [String] :value A value
35
- # @option opts [String] :path ('/') A path
36
- # @option opts [String] :secure (false) A boolean
37
- # @option opts [Time,DateTime,Numeric,nil] :expires (nil) Expiry date, either as a Time, DateTime, or seconds since epoch.
38
- #
39
- # @raise [ArgumentError] if :name or :value is not specified
40
- #
41
-
42
- def add_cookie(opts = {})
43
- raise ArgumentError, 'name is required' unless opts[:name]
44
- raise ArgumentError, 'value is required' unless opts[:value]
45
-
46
- opts[:path] ||= '/'
47
- opts[:secure] ||= false
48
-
49
- obj = opts.delete(:expires)
50
- opts[:expiry] = seconds_from(obj).to_i if obj
51
-
52
- @bridge.add_cookie opts
53
- end
54
-
55
- #
56
- # Get the cookie with the given name
57
- #
58
- # @param [String] name the name of the cookie
59
- # @return [Hash, nil] the cookie, or nil if it wasn't found.
60
- #
61
-
62
- def cookie_named(name)
63
- all_cookies.find { |c| c[:name] == name }
64
- end
65
-
66
- #
67
- # Delete the cookie with the given name
68
- #
69
- # @param [String] name the name of the cookie to delete
70
- #
71
-
72
- def delete_cookie(name)
73
- @bridge.delete_cookie name
74
- end
75
-
76
- #
77
- # Delete all cookies
78
- #
79
-
80
- def delete_all_cookies
81
- @bridge.delete_all_cookies
82
- end
83
-
84
- #
85
- # Get all cookies
86
- #
87
- # @return [Array<Hash>] list of cookies
88
- #
89
-
90
- def all_cookies
91
- @bridge.cookies.map { |cookie| convert_cookie(cookie) }
92
- end
93
-
94
- def timeouts
95
- @timeouts ||= Timeouts.new(@bridge)
96
- end
97
-
98
- #
99
- # @api beta This API may be changed or removed in a future release.
100
- #
101
-
102
- def logs
103
- @logs ||= Logs.new(@bridge)
104
- end
105
-
106
- #
107
- # @api beta This API may be changed or removed in a future release.
108
- #
109
-
110
- def window
111
- @window ||= Window.new(@bridge)
112
- end
113
-
114
- private
115
-
116
- SECONDS_PER_DAY = 86_400.0
22
+ module Common
23
+ class Options
24
+ private
25
+
26
+ def generate_as_json(value)
27
+ if value.respond_to?(:as_json)
28
+ value.as_json
29
+ elsif value.is_a?(Hash)
30
+ value.each_with_object({}) { |(key, val), hash| hash[convert_json_key(key)] = generate_as_json(val) }
31
+ elsif value.is_a?(Array)
32
+ value.map(&method(:generate_as_json))
33
+ elsif value.is_a?(Symbol)
34
+ value.to_s
35
+ else
36
+ value
37
+ end
38
+ end
117
39
 
118
- def datetime_at(int)
119
- DateTime.civil(1970) + (int / SECONDS_PER_DAY)
120
- end
40
+ def convert_json_key(key)
41
+ key = camel_case(key) if key.is_a?(Symbol)
42
+ return key if key.is_a?(String)
121
43
 
122
- def seconds_from(obj)
123
- case obj
124
- when Time
125
- obj.to_f
126
- when DateTime
127
- (obj - DateTime.civil(1970)) * SECONDS_PER_DAY
128
- when Numeric
129
- obj
130
- else
131
- raise ArgumentError, "invalid value for expiration date: #{obj.inspect}"
44
+ raise TypeError, "expected String or Symbol, got #{key.inspect}:#{key.class}"
132
45
  end
133
- end
134
-
135
- def strip_port(str)
136
- str.split(':', 2).first
137
- end
138
46
 
139
- def convert_cookie(cookie)
140
- {
141
- name: cookie['name'],
142
- value: cookie['value'],
143
- path: cookie['path'],
144
- domain: cookie['domain'] && strip_port(cookie['domain']),
145
- expires: cookie['expiry'] && datetime_at(cookie['expiry']),
146
- secure: cookie['secure']
147
- }
148
- end
149
- end # Options
47
+ def camel_case(str)
48
+ str.to_s.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
49
+ end
50
+ end # Options
51
+ end # Common
150
52
  end # WebDriver
151
53
  end # Selenium
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -25,12 +27,11 @@ module Selenium
25
27
  module_function
26
28
 
27
29
  def home
28
- # jruby has an issue with ENV['HOME'] on Windows
29
- @home ||= jruby? ? ENV_JAVA['user.home'] : ENV['HOME']
30
+ @home ||= Dir.home
30
31
  end
31
32
 
32
33
  def engine
33
- @engine ||= defined?(RUBY_ENGINE) ? RUBY_ENGINE.to_sym : :ruby
34
+ @engine ||= RUBY_ENGINE.to_sym
34
35
  end
35
36
 
36
37
  def os
@@ -50,8 +51,13 @@ module Selenium
50
51
  end
51
52
 
52
53
  def ci
53
- return :travis if ENV['TRAVIS']
54
- :jenkins if ENV['JENKINS']
54
+ if ENV['TRAVIS']
55
+ :travis
56
+ elsif ENV['JENKINS']
57
+ :jenkins
58
+ elsif ENV['APPVEYOR']
59
+ :appveyor
60
+ end
55
61
  end
56
62
 
57
63
  def bitsize
@@ -70,10 +76,6 @@ module Selenium
70
76
  engine == :jruby
71
77
  end
72
78
 
73
- def ironruby?
74
- engine == :ironruby
75
- end
76
-
77
79
  def ruby_version
78
80
  RUBY_VERSION
79
81
  end
@@ -92,6 +94,7 @@ module Selenium
92
94
 
93
95
  def wsl?
94
96
  return false unless linux?
97
+
95
98
  File.read('/proc/version').include?('Microsoft')
96
99
  end
97
100
 
@@ -101,30 +104,35 @@ module Selenium
101
104
  end
102
105
 
103
106
  def null_device
104
- @null_device ||= if defined?(File::NULL)
105
- File::NULL
106
- else
107
- Platform.windows? ? 'NUL' : '/dev/null'
108
- end
107
+ File::NULL
109
108
  end
110
109
 
111
110
  def wrap_in_quotes_if_necessary(str)
112
111
  windows? && !cygwin? ? %("#{str}") : str
113
112
  end
114
113
 
115
- def cygwin_path(path, opts = {})
114
+ def cygwin_path(path, **opts)
116
115
  flags = []
117
116
  opts.each { |k, v| flags << "--#{k}" if v }
118
117
 
119
118
  `cygpath #{flags.join ' '} "#{path}"`.strip
120
119
  end
121
120
 
121
+ def unix_path(path)
122
+ path.tr(File::ALT_SEPARATOR, File::SEPARATOR)
123
+ end
124
+
125
+ def windows_path(path)
126
+ path.tr(File::SEPARATOR, File::ALT_SEPARATOR)
127
+ end
128
+
122
129
  def make_writable(file)
123
130
  File.chmod 0o766, file
124
131
  end
125
132
 
126
133
  def assert_file(path)
127
134
  return if File.file? path
135
+
128
136
  raise Error::WebDriverError, "not a file: #{path.inspect}"
129
137
  end
130
138
 
@@ -132,6 +140,7 @@ module Selenium
132
140
  assert_file(path)
133
141
 
134
142
  return if File.executable? path
143
+
135
144
  raise Error::WebDriverError, "not executable: #{path.inspect}"
136
145
  end
137
146
 
@@ -152,7 +161,7 @@ module Selenium
152
161
  binary_names.each do |binary_name|
153
162
  paths.each do |path|
154
163
  full_path = File.join(path, binary_name)
155
- full_path.tr!('\\', '/') if windows?
164
+ full_path = unix_path(full_path) if windows?
156
165
  exe = Dir.glob(full_path).find { |f| File.executable?(f) }
157
166
  return exe if exe
158
167
  end
@@ -182,6 +191,7 @@ module Selenium
182
191
  info = Socket.getaddrinfo 'localhost', 80, Socket::AF_INET, Socket::SOCK_STREAM
183
192
 
184
193
  return info[0][3] unless info.empty?
194
+
185
195
  raise Error::WebDriverError, "unable to translate 'localhost' for TCP + IPv4"
186
196
  end
187
197
 
@@ -210,17 +220,3 @@ module Selenium
210
220
  end # Platform
211
221
  end # WebDriver
212
222
  end # Selenium
213
-
214
- if $PROGRAM_NAME == __FILE__
215
- p engine: Selenium::WebDriver::Platform.engine,
216
- os: Selenium::WebDriver::Platform.os,
217
- ruby_version: Selenium::WebDriver::Platform.ruby_version,
218
- jruby?: Selenium::WebDriver::Platform.jruby?,
219
- windows?: Selenium::WebDriver::Platform.windows?,
220
- home: Selenium::WebDriver::Platform.home,
221
- bitsize: Selenium::WebDriver::Platform.bitsize,
222
- localhost: Selenium::WebDriver::Platform.localhost,
223
- ip: Selenium::WebDriver::Platform.ip,
224
- interfaces: Selenium::WebDriver::Platform.interfaces,
225
- null_device: Selenium::WebDriver::Platform.null_device
226
- end