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,123 +0,0 @@
1
- # encoding: utf-8
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 Client
22
-
23
- HTTP_HEADERS = { 'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8' }
24
-
25
- # Module in charge of handling Selenium over-the-wire HTTP protocol
26
- module Protocol
27
- attr_reader :session_id
28
-
29
- def remote_control_command(verb, args=[])
30
- timeout(@default_timeout_in_seconds) do
31
- status, response = http_post(http_request_for(verb, args))
32
- raise CommandError, response unless status == "OK"
33
- response[3..-1] # strip "OK," from response
34
- end
35
- end
36
-
37
- def string_command(verb, args=[])
38
- remote_control_command(verb, args)
39
- end
40
-
41
- def string_array_command(verb, args=[])
42
- csv = string_command(verb, args)
43
- token = ""
44
- tokens = []
45
- escape = false
46
- csv.split(//).each do |letter|
47
- if escape
48
- token += letter
49
- escape = false
50
- next
51
- end
52
- case letter
53
- when '\\'
54
- escape = true
55
- when ','
56
- tokens << token
57
- token = ""
58
- else
59
- token += letter
60
- end
61
- end
62
- tokens << token
63
- return tokens
64
- end
65
-
66
- def number_command(verb, args)
67
- string_command verb, args
68
- end
69
-
70
- def number_array_command(verb, args)
71
- string_array_command verb, args
72
- end
73
-
74
- def boolean_command(verb, args=[])
75
- parse_boolean_value string_command(verb, args)
76
- end
77
-
78
- def boolean_array_command(verb, args)
79
- string_array_command(verb, args).collect {|value| parse_boolean_value(value)}
80
- end
81
-
82
- protected
83
-
84
- def parse_boolean_value(value)
85
- if ("true" == value)
86
- return true
87
- elsif ("false" == value)
88
- return false
89
- end
90
- raise ProtocolError, "Invalid Selenese boolean value that is neither 'true' nor 'false': got '#{value}'"
91
- end
92
-
93
- def http_request_for(verb, args)
94
- data = "cmd=#{CGI::escape(verb)}"
95
- args.each_with_index do |arg, index|
96
- data << "&#{index.succ}=#{CGI::escape(arg.to_s)}"
97
- end
98
- data << "&sessionId=#{session_id}" unless session_id.nil?
99
- data
100
- end
101
-
102
- def http_post(data)
103
- start = Time.now
104
- called_from = caller.detect{|line| line !~ /(selenium-client|vendor|usr\/lib\/ruby|\(eval\))/i}
105
- http = Net::HTTP.new(@host, @port)
106
- http.open_timeout = default_timeout_in_seconds
107
- http.read_timeout = default_timeout_in_seconds
108
- response = http.post('/selenium-server/driver/', data, HTTP_HEADERS)
109
- if response.body !~ /^OK/
110
- puts "#{start} selenium-client received failure from selenium server:"
111
- puts "requested:"
112
- puts "\t" + CGI::unescape(data.split('&').join("\n\t"))
113
- puts "received:"
114
- puts "\t#{response.body.inspect}"
115
- puts "\tcalled from #{called_from}"
116
- end
117
- [ response.body[0..1], response.body ]
118
- end
119
-
120
- end
121
-
122
- end
123
- end
@@ -1,49 +0,0 @@
1
- # encoding: utf-8
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 Client
22
-
23
- module SeleniumHelper
24
-
25
- # Overrides default open method to actually delegates to @selenium
26
- def open(url)
27
- @selenium.open url
28
- end
29
-
30
- # Overrides default type method to actually delegates to @selenium
31
- def type(locator, value)
32
- @selenium.type locator, value
33
- end
34
-
35
- # Overrides default select method to actually delegates to @selenium
36
- def select(input_locator, option_locator)
37
- @selenium.select input_locator, option_locator
38
- end
39
-
40
- # Delegates to @selenium on method missing
41
- def method_missing(method_name, *args)
42
- return super unless @selenium.respond_to?(method_name)
43
-
44
- @selenium.send(method_name, *args)
45
- end
46
- end
47
-
48
- end
49
- end
@@ -1,176 +0,0 @@
1
- # encoding: utf-8
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
- require 'selenium/server'
21
- require 'rake'
22
-
23
- module Selenium
24
- module Rake
25
-
26
- class MissingJarFileError < StandardError
27
- end
28
-
29
- #
30
- # Defines rake tasks for starting, stopping and restarting the Selenium server.
31
- #
32
- # Usage:
33
- #
34
- # require 'selenium/rake/server_task'
35
- #
36
- # Selenium::Rake::ServerTask.new do |t|
37
- # t.jar = "/path/to/selenium-server-standalone.jar"
38
- # t.port = 4444
39
- # t.opts = %w[-some options]
40
- # end
41
- #
42
- # Alternatively, you can have the task download a specific version of the server:
43
- #
44
- # Selenium::Rake::ServerTask.new(:server) do |t|
45
- # t.version = '2.6.0'
46
- # end
47
- #
48
- # or the latest version
49
- #
50
- # Selenium::Rake::ServerTask.new(:server) do |t|
51
- # t.version = :latest
52
- # end
53
- #
54
- #
55
- # Tasks defined:
56
- #
57
- # rake selenium:server:start
58
- # rake selenium:server:stop
59
- # rake selenium:server:restart
60
- #
61
-
62
- class ServerTask
63
- include ::Rake::DSL if defined?(::Rake::DSL)
64
-
65
- #
66
- # Path to the selenium server jar
67
- #
68
-
69
- attr_accessor :jar
70
-
71
- #
72
- # Port to use for the server.
73
- # Default: 4444
74
- #
75
- #
76
-
77
- attr_accessor :port
78
-
79
- #
80
- # Timeout in seconds for the server to start/stop.
81
- # Default: 30
82
- #
83
-
84
- attr_accessor :timeout
85
-
86
- #
87
- # Whether we should detach from the server process.
88
- # Default: true
89
- #
90
-
91
- attr_accessor :background
92
- alias_method :background?, :background
93
-
94
- #
95
- # Configure logging. Pass a log file path or a boolean.
96
- # Default: true
97
- #
98
- # true - log to stdout/stderr
99
- # false - no logging
100
- # String - log to the specified file
101
- #
102
-
103
- attr_accessor :log
104
-
105
- #
106
- # Add additional options passed to the server jar.
107
- #
108
-
109
- attr_accessor :opts
110
-
111
- #
112
- # Specify the version of the server jar to download
113
- #
114
-
115
- attr_accessor :version
116
-
117
-
118
- def initialize(prefix = "selenium:server")
119
- @jar = nil
120
- @prefix = prefix
121
- @port = 4444
122
- @timeout = 30
123
- @background = true
124
- @log = true
125
- @opts = []
126
- @version = nil
127
-
128
- yield self if block_given?
129
-
130
- if @version
131
- @jar = Selenium::Server.download(@version)
132
- end
133
-
134
- unless @jar
135
- raise MissingJarFileError, "must provide path to the selenium server jar"
136
- end
137
-
138
- @server = Selenium::Server.new(@jar, :port => @port,
139
- :timeout => @timeout,
140
- :background => @background,
141
- :log => @log )
142
-
143
- @server << @opts
144
-
145
- define_start_task
146
- define_stop_task
147
- define_restart_task
148
- end
149
-
150
- private
151
-
152
- def define_start_task
153
- desc "Start the Selenium server"
154
- task "#{@prefix}:start" do
155
- @server.start
156
- end
157
- end
158
-
159
- def define_stop_task
160
- desc 'Stop the Selenium server'
161
- task "#{@prefix}:stop" do
162
- @server.stop
163
- end
164
- end
165
-
166
- def define_restart_task
167
- desc 'Restart the Selenium server'
168
- task "#{@prefix}:restart" do
169
- @server.stop
170
- @server.start
171
- end
172
- end
173
-
174
- end # ServerTask
175
- end # Rake
176
- end # Selenium
@@ -1,68 +0,0 @@
1
- # encoding: utf-8
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
- module Android
23
-
24
- #
25
- # @api private
26
- #
27
-
28
- class Bridge < Remote::Bridge
29
-
30
- DEFAULT_URL = "http://#{Platform.localhost}:8080/wd/hub/"
31
-
32
- def initialize(opts = {})
33
- warn 'The Android driver is deprecated - please use either http://selendroid.io or http://appium.io instead.'
34
-
35
- remote_opts = {
36
- :url => opts.fetch(:url, DEFAULT_URL),
37
- :desired_capabilities => opts.fetch(:desired_capabilities, capabilities),
38
- }
39
-
40
- remote_opts[:http_client] = opts[:http_client] if opts.has_key?(:http_client)
41
-
42
- super remote_opts
43
- end
44
-
45
- def browser
46
- :android
47
- end
48
-
49
- def driver_extensions
50
- [
51
- DriverExtensions::TakesScreenshot,
52
- DriverExtensions::Rotatable,
53
- DriverExtensions::HasInputDevices,
54
- DriverExtensions::HasWebStorage,
55
- DriverExtensions::HasLocation,
56
- DriverExtensions::HasNetworkConnection,
57
- DriverExtensions::HasTouchScreen
58
- ]
59
- end
60
-
61
- def capabilities
62
- @capabilities ||= Remote::Capabilities.android
63
- end
64
-
65
- end # Bridge
66
- end # Android
67
- end # WebDriver
68
- end # Selenium
@@ -1,139 +0,0 @@
1
- # encoding: utf-8
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
- module Chrome
23
-
24
- # @api private
25
- class Bridge < Remote::Bridge
26
-
27
- def initialize(opts = {})
28
- http_client = opts.delete(:http_client)
29
-
30
- if opts.has_key?(:url)
31
- url = opts.delete(:url)
32
- else
33
- @service = Service.default_service(*extract_service_args(opts))
34
- @service.start
35
-
36
- url = @service.uri
37
- end
38
-
39
- caps = create_capabilities(opts)
40
-
41
- remote_opts = {
42
- :url => url,
43
- :desired_capabilities => caps
44
- }
45
-
46
- remote_opts.merge!(:http_client => http_client) if http_client
47
-
48
- super(remote_opts)
49
- end
50
-
51
- def browser
52
- :chrome
53
- end
54
-
55
- def driver_extensions
56
- [
57
- DriverExtensions::TakesScreenshot,
58
- DriverExtensions::HasInputDevices,
59
- DriverExtensions::HasWebStorage
60
- ]
61
- end
62
-
63
- def capabilities
64
- @capabilities ||= Remote::Capabilities.chrome
65
- end
66
-
67
- def quit
68
- super
69
- ensure
70
- @service.stop if @service
71
- end
72
-
73
- private
74
-
75
- def create_capabilities(opts)
76
- caps = opts.delete(:desired_capabilities) { Remote::Capabilities.chrome }
77
- args = opts.delete(:args) || opts.delete(:switches)
78
- native_events = opts.delete(:native_events)
79
- verbose = opts.delete(:verbose)
80
- profile = opts.delete(:profile)
81
- detach = opts.delete(:detach)
82
- proxy = opts.delete(:proxy)
83
- no_website_testing_defaults = opts.delete(:no_website_testing_defaults)
84
- prefs = opts.delete(:prefs)
85
-
86
- unless opts.empty?
87
- raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
88
- end
89
-
90
- chrome_options = caps['chromeOptions'] || {}
91
-
92
- if args
93
- unless args.kind_of? Array
94
- raise ArgumentError, ":args must be an Array of Strings"
95
- end
96
-
97
- chrome_options['args'] = args.map { |e| e.to_s }
98
- end
99
-
100
- if profile
101
- data = profile.as_json
102
-
103
- chrome_options.merge! 'profile' => data['zip'],
104
- 'extensions' => data['extensions']
105
- end
106
-
107
- chrome_options['binary'] = Chrome.path if Chrome.path
108
- chrome_options['nativeEvents'] = true if native_events
109
- chrome_options['verbose'] = true if verbose
110
- chrome_options['detach'] = detach.nil? || !!detach
111
- chrome_options['noWebsiteTestingDefaults'] = true if no_website_testing_defaults
112
- chrome_options['prefs'] = prefs if prefs
113
-
114
- caps['chromeOptions'] = chrome_options
115
- caps['proxy'] = proxy if proxy
116
-
117
- # legacy options - for chromedriver < 17.0.963.0
118
- caps["chrome.switches"] = chrome_options['args'] if chrome_options.member?('args')
119
- %w[binary detach extensions nativeEvents noWebsiteTestingDefaults prefs profile verbose].each do |key|
120
- caps["chrome.#{key}"] = chrome_options[key] if chrome_options.member?(key)
121
- end
122
-
123
- caps
124
- end
125
-
126
- def extract_service_args(opts)
127
- args = []
128
-
129
- if opts.has_key?(:service_log_path)
130
- args << "--log-path=#{opts.delete(:service_log_path)}"
131
- end
132
-
133
- args
134
- end
135
-
136
- end # Bridge
137
- end # Chrome
138
- end # WebDriver
139
- end # Selenium