selenium-webdriver 2.53.3 → 3.142.7
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.
- checksums.yaml +7 -0
- data/CHANGES +665 -8
- data/Gemfile +2 -0
- data/LICENSE +1 -1
- data/README.md +2 -3
- data/lib/selenium/server.rb +76 -73
- data/lib/selenium/webdriver/atoms/getAttribute.js +7 -0
- data/lib/selenium/webdriver/atoms/isDisplayed.js +102 -0
- data/lib/selenium/webdriver/{phantomjs.rb → atoms.rb} +10 -14
- data/lib/selenium/webdriver/chrome/bridge.rb +30 -101
- data/lib/selenium/webdriver/chrome/driver.rb +127 -0
- data/lib/selenium/webdriver/chrome/options.rb +190 -0
- data/lib/selenium/webdriver/chrome/profile.rb +21 -20
- data/lib/selenium/webdriver/chrome/service.rb +26 -93
- data/lib/selenium/webdriver/chrome.rb +15 -6
- data/lib/selenium/webdriver/common/action_builder.rb +52 -58
- data/lib/selenium/webdriver/common/alert.rb +7 -15
- data/lib/selenium/webdriver/common/bridge_helper.rb +18 -22
- data/lib/selenium/webdriver/common/driver.rb +72 -72
- data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +45 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +50 -0
- data/lib/selenium/webdriver/common/driver_extensions/{has_input_devices.rb → has_debugger.rb} +11 -27
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +6 -10
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +51 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +7 -8
- data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +51 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +2 -4
- data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +2 -4
- data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +3 -5
- data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +2 -5
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +6 -9
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +9 -7
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +3 -8
- data/lib/selenium/webdriver/common/element.rb +59 -39
- data/lib/selenium/webdriver/common/error.rb +259 -104
- data/lib/selenium/webdriver/common/file_reaper.rb +6 -14
- data/lib/selenium/webdriver/common/html5/local_storage.rb +8 -10
- data/lib/selenium/webdriver/common/html5/session_storage.rb +8 -10
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +8 -16
- data/lib/selenium/webdriver/common/interactions/input_device.rb +54 -0
- data/lib/selenium/webdriver/common/interactions/interaction.rb +53 -0
- data/lib/selenium/webdriver/{safari/browser.rb → common/interactions/interactions.rb} +17 -14
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +145 -0
- data/lib/selenium/webdriver/common/interactions/key_input.rb +66 -0
- data/lib/selenium/webdriver/{android.rb → common/interactions/none_input.rb} +14 -6
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +363 -0
- data/lib/selenium/webdriver/common/interactions/pointer_input.rb +139 -0
- data/lib/selenium/webdriver/common/keyboard.rb +10 -14
- data/lib/selenium/webdriver/common/keys.rb +102 -82
- data/lib/selenium/webdriver/common/log_entry.rb +7 -8
- data/lib/selenium/webdriver/common/logger.rb +115 -0
- data/lib/selenium/webdriver/common/logs.rb +4 -6
- data/lib/selenium/webdriver/common/manager.rb +177 -0
- data/lib/selenium/webdriver/common/mouse.rb +12 -14
- data/lib/selenium/webdriver/common/navigation.rb +4 -6
- data/lib/selenium/webdriver/common/options.rb +26 -127
- data/lib/selenium/webdriver/common/platform.rb +75 -101
- data/lib/selenium/webdriver/common/port_prober.rb +7 -19
- data/lib/selenium/webdriver/common/profile_helper.rb +8 -11
- data/lib/selenium/webdriver/common/proxy.rb +68 -74
- data/lib/selenium/webdriver/common/search_context.rb +28 -37
- data/lib/selenium/webdriver/common/service.rb +219 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +15 -16
- data/lib/selenium/webdriver/common/socket_poller.rb +30 -28
- data/lib/selenium/webdriver/common/target_locator.rb +16 -18
- data/lib/selenium/webdriver/common/timeouts.rb +6 -8
- data/lib/selenium/webdriver/common/touch_action_builder.rb +5 -10
- data/lib/selenium/webdriver/common/touch_screen.rb +22 -23
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +212 -0
- data/lib/selenium/webdriver/common/w3c_manager.rb +45 -0
- data/lib/selenium/webdriver/common/wait.rb +17 -16
- data/lib/selenium/webdriver/common/window.rb +50 -17
- data/lib/selenium/webdriver/common/zipper.rb +9 -13
- data/lib/selenium/webdriver/common.rb +21 -7
- data/lib/selenium/webdriver/edge/bridge.rb +34 -63
- data/lib/selenium/webdriver/edge/driver.rb +66 -0
- data/lib/selenium/webdriver/edge/options.rb +80 -0
- data/lib/selenium/webdriver/edge/service.rb +23 -95
- data/lib/selenium/webdriver/edge.rb +13 -13
- data/lib/selenium/webdriver/firefox/binary.rb +45 -60
- data/lib/selenium/webdriver/firefox/driver.rb +50 -0
- data/lib/selenium/webdriver/firefox/extension/prefs.json +3 -12
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/extension.rb +20 -10
- data/lib/selenium/webdriver/firefox/launcher.rb +16 -22
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +83 -0
- data/lib/selenium/webdriver/firefox/marionette/bridge.rb +49 -0
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +90 -0
- data/lib/selenium/webdriver/firefox/options.rb +162 -0
- data/lib/selenium/webdriver/firefox/profile.rb +47 -48
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +11 -18
- data/lib/selenium/webdriver/firefox/service.rb +24 -95
- data/lib/selenium/webdriver/firefox/util.rb +2 -4
- data/lib/selenium/webdriver/firefox.rb +27 -12
- data/lib/selenium/webdriver/ie/driver.rb +85 -0
- data/lib/selenium/webdriver/ie/options.rb +138 -0
- data/lib/selenium/webdriver/ie/service.rb +54 -0
- data/lib/selenium/webdriver/ie.rb +12 -10
- data/lib/selenium/webdriver/remote/bridge.rb +100 -564
- data/lib/selenium/webdriver/remote/capabilities.rb +98 -100
- data/lib/selenium/webdriver/remote/driver.rb +51 -0
- data/lib/selenium/webdriver/remote/http/common.rb +34 -22
- data/lib/selenium/webdriver/remote/http/curb.rb +13 -14
- data/lib/selenium/webdriver/remote/http/default.rb +62 -43
- data/lib/selenium/webdriver/remote/http/persistent.rb +12 -9
- data/lib/selenium/webdriver/remote/oss/bridge.rb +594 -0
- data/lib/selenium/webdriver/remote/oss/commands.rb +223 -0
- data/lib/selenium/webdriver/remote/response.rb +48 -28
- data/lib/selenium/webdriver/remote/server_error.rb +3 -5
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +605 -0
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +310 -0
- data/lib/selenium/webdriver/remote/w3c/commands.rb +157 -0
- data/lib/selenium/webdriver/remote.rb +10 -16
- data/lib/selenium/webdriver/safari/bridge.rb +17 -101
- data/lib/selenium/webdriver/{firefox/w3c_bridge.rb → safari/driver.rb} +27 -25
- data/lib/selenium/webdriver/safari/options.rb +29 -31
- data/lib/selenium/webdriver/safari/service.rb +38 -0
- data/lib/selenium/webdriver/safari.rb +27 -27
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +19 -4
- data/lib/selenium/webdriver/support/block_event_listener.rb +3 -5
- data/lib/selenium/webdriver/support/color.rb +60 -43
- data/lib/selenium/webdriver/support/escaper.rb +43 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +39 -41
- data/lib/selenium/webdriver/support/select.rb +45 -97
- data/lib/selenium/webdriver/support.rb +3 -2
- data/lib/selenium/webdriver/{iphone.rb → version.rb} +3 -7
- data/lib/selenium/webdriver.rb +36 -23
- data/lib/selenium-webdriver.rb +2 -2
- data/selenium-webdriver.gemspec +42 -29
- metadata +331 -262
- data/lib/selenium/client/base.rb +0 -151
- data/lib/selenium/client/driver.rb +0 -29
- data/lib/selenium/client/errors.rb +0 -28
- data/lib/selenium/client/extensions.rb +0 -132
- data/lib/selenium/client/idiomatic.rb +0 -507
- data/lib/selenium/client/javascript_expression_builder.rb +0 -135
- data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -32
- data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -32
- data/lib/selenium/client/legacy_driver.rb +0 -1722
- data/lib/selenium/client/protocol.rb +0 -123
- data/lib/selenium/client/selenium_helper.rb +0 -49
- data/lib/selenium/client.rb +0 -57
- data/lib/selenium/rake/server_task.rb +0 -176
- data/lib/selenium/webdriver/android/bridge.rb +0 -68
- data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -28
- data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -61
- data/lib/selenium/webdriver/common/html5/location.rb +0 -19
- data/lib/selenium/webdriver/common/w3c_error.rb +0 -194
- data/lib/selenium/webdriver/edge/legacy_support.rb +0 -117
- data/lib/selenium/webdriver/firefox/bridge.rb +0 -89
- data/lib/selenium/webdriver/ie/bridge.rb +0 -88
- data/lib/selenium/webdriver/ie/server.rb +0 -133
- data/lib/selenium/webdriver/iphone/bridge.rb +0 -64
- data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -78
- data/lib/selenium/webdriver/phantomjs/service.rb +0 -130
- data/lib/selenium/webdriver/remote/commands.rb +0 -211
- data/lib/selenium/webdriver/remote/w3c_bridge.rb +0 -668
- data/lib/selenium/webdriver/remote/w3c_capabilities.rb +0 -236
- data/lib/selenium/webdriver/remote/w3c_commands.rb +0 -132
- data/lib/selenium/webdriver/safari/resources/client.js +0 -7255
- data/lib/selenium/webdriver/safari/server.rb +0 -187
- data/lib/selenium-client.rb +0 -21
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
4
|
# or more contributor license agreements. See the NOTICE file
|
|
5
5
|
# distributed with this work for additional information
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
class Wait
|
|
23
|
-
|
|
24
23
|
DEFAULT_TIMEOUT = 5
|
|
25
24
|
DEFAULT_INTERVAL = 0.2
|
|
26
25
|
|
|
@@ -41,19 +40,18 @@ module Selenium
|
|
|
41
40
|
@ignored = Array(opts[:ignore] || Error::NoSuchElementError)
|
|
42
41
|
end
|
|
43
42
|
|
|
44
|
-
|
|
45
43
|
#
|
|
46
44
|
# Wait until the given block returns a true value.
|
|
47
45
|
#
|
|
48
|
-
# @raise [Error::
|
|
46
|
+
# @raise [Error::TimeoutError]
|
|
49
47
|
# @return [Object] the result of the block
|
|
50
48
|
#
|
|
51
49
|
|
|
52
|
-
def until
|
|
53
|
-
end_time =
|
|
50
|
+
def until
|
|
51
|
+
end_time = current_time + @timeout
|
|
54
52
|
last_error = nil
|
|
55
53
|
|
|
56
|
-
until
|
|
54
|
+
until current_time > end_time
|
|
57
55
|
begin
|
|
58
56
|
result = yield
|
|
59
57
|
return result if result
|
|
@@ -64,19 +62,22 @@ module Selenium
|
|
|
64
62
|
sleep @interval
|
|
65
63
|
end
|
|
66
64
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
end
|
|
65
|
+
msg = if @message
|
|
66
|
+
@message.dup
|
|
67
|
+
else
|
|
68
|
+
+"timed out after #{@timeout} seconds"
|
|
69
|
+
end
|
|
73
70
|
|
|
74
71
|
msg << " (#{last_error.message})" if last_error
|
|
75
72
|
|
|
76
|
-
raise Error::
|
|
73
|
+
raise Error::TimeoutError, msg
|
|
77
74
|
end
|
|
78
75
|
|
|
76
|
+
private
|
|
77
|
+
|
|
78
|
+
def current_time
|
|
79
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
80
|
+
end
|
|
79
81
|
end # Wait
|
|
80
82
|
end # WebDriver
|
|
81
83
|
end # Selenium
|
|
82
|
-
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
4
|
# or more contributor license agreements. See the NOTICE file
|
|
5
5
|
# distributed with this work for additional information
|
|
@@ -19,13 +19,11 @@
|
|
|
19
19
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
|
-
|
|
23
22
|
#
|
|
24
23
|
# @api beta This API may be changed or removed in a future release.
|
|
25
24
|
#
|
|
26
25
|
|
|
27
26
|
class Window
|
|
28
|
-
|
|
29
27
|
#
|
|
30
28
|
# @api private
|
|
31
29
|
#
|
|
@@ -42,11 +40,11 @@ module Selenium
|
|
|
42
40
|
|
|
43
41
|
def size=(dimension)
|
|
44
42
|
unless dimension.respond_to?(:width) && dimension.respond_to?(:height)
|
|
45
|
-
raise ArgumentError, "expected #{dimension.inspect}:#{dimension.class}"
|
|
46
|
-
|
|
43
|
+
raise ArgumentError, "expected #{dimension.inspect}:#{dimension.class}" \
|
|
44
|
+
' to respond to #width and #height'
|
|
47
45
|
end
|
|
48
46
|
|
|
49
|
-
@bridge.
|
|
47
|
+
@bridge.resize_window dimension.width, dimension.height
|
|
50
48
|
end
|
|
51
49
|
|
|
52
50
|
#
|
|
@@ -56,7 +54,7 @@ module Selenium
|
|
|
56
54
|
#
|
|
57
55
|
|
|
58
56
|
def size
|
|
59
|
-
@bridge.
|
|
57
|
+
@bridge.window_size
|
|
60
58
|
end
|
|
61
59
|
|
|
62
60
|
#
|
|
@@ -67,11 +65,11 @@ module Selenium
|
|
|
67
65
|
|
|
68
66
|
def position=(point)
|
|
69
67
|
unless point.respond_to?(:x) && point.respond_to?(:y)
|
|
70
|
-
raise ArgumentError, "expected #{point.inspect}:#{point.class}"
|
|
71
|
-
|
|
68
|
+
raise ArgumentError, "expected #{point.inspect}:#{point.class}" \
|
|
69
|
+
' to respond to #x and #y'
|
|
72
70
|
end
|
|
73
71
|
|
|
74
|
-
@bridge.
|
|
72
|
+
@bridge.reposition_window point.x, point.y
|
|
75
73
|
end
|
|
76
74
|
|
|
77
75
|
#
|
|
@@ -81,7 +79,35 @@ module Selenium
|
|
|
81
79
|
#
|
|
82
80
|
|
|
83
81
|
def position
|
|
84
|
-
@bridge.
|
|
82
|
+
@bridge.window_position
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
#
|
|
86
|
+
# Sets the current window rect to the given point and position.
|
|
87
|
+
#
|
|
88
|
+
# @param [Selenium::WebDriver::Rectangle, #x, #y, #width, #height] rectangle The new rect.
|
|
89
|
+
#
|
|
90
|
+
|
|
91
|
+
def rect=(rectangle)
|
|
92
|
+
unless %w[x y width height].all? { |val| rectangle.respond_to? val }
|
|
93
|
+
raise ArgumentError, "expected #{rectangle.inspect}:#{rectangle.class}" \
|
|
94
|
+
' to respond to #x, #y, #width, and #height'
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
@bridge.set_window_rect(x: rectangle.x,
|
|
98
|
+
y: rectangle.y,
|
|
99
|
+
width: rectangle.width,
|
|
100
|
+
height: rectangle.height)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
#
|
|
104
|
+
# Get the rect of the current window.
|
|
105
|
+
#
|
|
106
|
+
# @return [Selenium::WebDriver::Rectangle] The rectangle.
|
|
107
|
+
#
|
|
108
|
+
|
|
109
|
+
def rect
|
|
110
|
+
@bridge.window_rect
|
|
85
111
|
end
|
|
86
112
|
|
|
87
113
|
#
|
|
@@ -94,7 +120,7 @@ module Selenium
|
|
|
94
120
|
#
|
|
95
121
|
|
|
96
122
|
def resize_to(width, height)
|
|
97
|
-
@bridge.
|
|
123
|
+
@bridge.resize_window Integer(width), Integer(height)
|
|
98
124
|
end
|
|
99
125
|
|
|
100
126
|
#
|
|
@@ -106,7 +132,7 @@ module Selenium
|
|
|
106
132
|
#
|
|
107
133
|
|
|
108
134
|
def move_to(x, y)
|
|
109
|
-
@bridge.
|
|
135
|
+
@bridge.reposition_window Integer(x), Integer(y)
|
|
110
136
|
end
|
|
111
137
|
|
|
112
138
|
#
|
|
@@ -114,7 +140,15 @@ module Selenium
|
|
|
114
140
|
#
|
|
115
141
|
|
|
116
142
|
def maximize
|
|
117
|
-
@bridge.
|
|
143
|
+
@bridge.maximize_window
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
#
|
|
147
|
+
# Minimize the current window
|
|
148
|
+
#
|
|
149
|
+
|
|
150
|
+
def minimize
|
|
151
|
+
@bridge.minimize_window
|
|
118
152
|
end
|
|
119
153
|
|
|
120
154
|
#
|
|
@@ -122,9 +156,8 @@ module Selenium
|
|
|
122
156
|
#
|
|
123
157
|
|
|
124
158
|
def full_screen
|
|
125
|
-
@bridge.
|
|
159
|
+
@bridge.full_screen_window
|
|
126
160
|
end
|
|
127
|
-
|
|
128
161
|
end # Window
|
|
129
162
|
end # WebDriver
|
|
130
163
|
end # Selenium
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
4
|
# or more contributor license agreements. See the NOTICE file
|
|
5
5
|
# distributed with this work for additional information
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
require 'zip'
|
|
21
21
|
require 'tempfile'
|
|
22
22
|
require 'find'
|
|
23
|
+
require 'base64'
|
|
23
24
|
|
|
24
25
|
module Selenium
|
|
25
26
|
module WebDriver
|
|
@@ -28,13 +29,11 @@ module Selenium
|
|
|
28
29
|
#
|
|
29
30
|
|
|
30
31
|
module Zipper
|
|
31
|
-
|
|
32
|
-
EXTENSIONS = %w[.zip .xpi]
|
|
32
|
+
EXTENSIONS = %w[.zip .xpi].freeze
|
|
33
33
|
|
|
34
34
|
class << self
|
|
35
|
-
|
|
36
35
|
def unzip(path)
|
|
37
|
-
destination = Dir.mktmpdir(
|
|
36
|
+
destination = Dir.mktmpdir('webdriver-unzip')
|
|
38
37
|
FileReaper << destination
|
|
39
38
|
|
|
40
39
|
Zip::File.open(path) do |zip|
|
|
@@ -53,13 +52,11 @@ module Selenium
|
|
|
53
52
|
def zip(path)
|
|
54
53
|
with_tmp_zip do |zip|
|
|
55
54
|
::Find.find(path) do |file|
|
|
56
|
-
unless File.directory?(file)
|
|
57
|
-
add_zip_entry zip, file, file.sub("#{path}/", '')
|
|
58
|
-
end
|
|
55
|
+
add_zip_entry zip, file, file.sub("#{path}/", '') unless File.directory?(file)
|
|
59
56
|
end
|
|
60
57
|
|
|
61
58
|
zip.commit
|
|
62
|
-
File.open(zip.name,
|
|
59
|
+
File.open(zip.name, 'rb') { |io| Base64.strict_encode64 io.read }
|
|
63
60
|
end
|
|
64
61
|
end
|
|
65
62
|
|
|
@@ -68,7 +65,7 @@ module Selenium
|
|
|
68
65
|
add_zip_entry zip, path, File.basename(path)
|
|
69
66
|
|
|
70
67
|
zip.commit
|
|
71
|
-
File.open(zip.name,
|
|
68
|
+
File.open(zip.name, 'rb') { |io| Base64.strict_encode64 io.read }
|
|
72
69
|
end
|
|
73
70
|
end
|
|
74
71
|
|
|
@@ -78,7 +75,7 @@ module Selenium
|
|
|
78
75
|
# can't use Tempfile here since it doesn't support File::BINARY mode on 1.8
|
|
79
76
|
# can't use Dir.mktmpdir(&blk) because of http://jira.codehaus.org/browse/JRUBY-4082
|
|
80
77
|
tmp_dir = Dir.mktmpdir
|
|
81
|
-
zip_path = File.join(tmp_dir,
|
|
78
|
+
zip_path = File.join(tmp_dir, 'webdriver-zip')
|
|
82
79
|
|
|
83
80
|
begin
|
|
84
81
|
Zip::File.open(zip_path, Zip::File::CREATE, &blk)
|
|
@@ -94,7 +91,6 @@ module Selenium
|
|
|
94
91
|
|
|
95
92
|
zip.add entry, file
|
|
96
93
|
end
|
|
97
|
-
|
|
98
94
|
end
|
|
99
95
|
end # Zipper
|
|
100
96
|
end # WebDriver
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
4
|
# or more contributor license agreements. See the NOTICE file
|
|
5
5
|
# distributed with this work for additional information
|
|
@@ -17,14 +17,12 @@
|
|
|
17
17
|
# specific language governing permissions and limitations
|
|
18
18
|
# under the License.
|
|
19
19
|
|
|
20
|
-
require 'selenium/webdriver/common/core_ext/dir'
|
|
21
|
-
require 'selenium/webdriver/common/core_ext/base64'
|
|
22
|
-
require 'selenium/webdriver/common/w3c_error'
|
|
23
20
|
require 'selenium/webdriver/common/error'
|
|
24
21
|
require 'selenium/webdriver/common/platform'
|
|
25
22
|
require 'selenium/webdriver/common/proxy'
|
|
26
23
|
require 'selenium/webdriver/common/log_entry'
|
|
27
24
|
require 'selenium/webdriver/common/file_reaper'
|
|
25
|
+
require 'selenium/webdriver/common/service'
|
|
28
26
|
require 'selenium/webdriver/common/socket_lock'
|
|
29
27
|
require 'selenium/webdriver/common/socket_poller'
|
|
30
28
|
require 'selenium/webdriver/common/port_prober'
|
|
@@ -38,26 +36,42 @@ require 'selenium/webdriver/common/target_locator'
|
|
|
38
36
|
require 'selenium/webdriver/common/navigation'
|
|
39
37
|
require 'selenium/webdriver/common/timeouts'
|
|
40
38
|
require 'selenium/webdriver/common/window'
|
|
39
|
+
require 'selenium/webdriver/common/logger'
|
|
41
40
|
require 'selenium/webdriver/common/logs'
|
|
42
|
-
require 'selenium/webdriver/common/
|
|
41
|
+
require 'selenium/webdriver/common/manager'
|
|
42
|
+
require 'selenium/webdriver/common/w3c_manager'
|
|
43
43
|
require 'selenium/webdriver/common/search_context'
|
|
44
44
|
require 'selenium/webdriver/common/action_builder'
|
|
45
|
+
require 'selenium/webdriver/common/interactions/key_actions'
|
|
46
|
+
require 'selenium/webdriver/common/interactions/pointer_actions'
|
|
47
|
+
require 'selenium/webdriver/common/w3c_action_builder'
|
|
45
48
|
require 'selenium/webdriver/common/touch_action_builder'
|
|
46
49
|
require 'selenium/webdriver/common/html5/shared_web_storage'
|
|
47
50
|
require 'selenium/webdriver/common/html5/local_storage'
|
|
48
51
|
require 'selenium/webdriver/common/html5/session_storage'
|
|
49
52
|
require 'selenium/webdriver/common/driver_extensions/takes_screenshot'
|
|
50
53
|
require 'selenium/webdriver/common/driver_extensions/rotatable'
|
|
51
|
-
require 'selenium/webdriver/common/driver_extensions/has_input_devices'
|
|
52
54
|
require 'selenium/webdriver/common/driver_extensions/has_web_storage'
|
|
55
|
+
require 'selenium/webdriver/common/driver_extensions/downloads_files'
|
|
53
56
|
require 'selenium/webdriver/common/driver_extensions/has_location'
|
|
54
57
|
require 'selenium/webdriver/common/driver_extensions/has_session_id'
|
|
55
58
|
require 'selenium/webdriver/common/driver_extensions/has_touch_screen'
|
|
56
59
|
require 'selenium/webdriver/common/driver_extensions/has_remote_status'
|
|
60
|
+
require 'selenium/webdriver/common/driver_extensions/has_network_conditions'
|
|
57
61
|
require 'selenium/webdriver/common/driver_extensions/has_network_connection'
|
|
62
|
+
require 'selenium/webdriver/common/driver_extensions/has_permissions'
|
|
63
|
+
require 'selenium/webdriver/common/driver_extensions/has_debugger'
|
|
58
64
|
require 'selenium/webdriver/common/driver_extensions/uploads_files'
|
|
65
|
+
require 'selenium/webdriver/common/driver_extensions/has_addons'
|
|
66
|
+
require 'selenium/webdriver/common/interactions/interactions'
|
|
67
|
+
require 'selenium/webdriver/common/interactions/input_device'
|
|
68
|
+
require 'selenium/webdriver/common/interactions/interaction'
|
|
69
|
+
require 'selenium/webdriver/common/interactions/none_input'
|
|
70
|
+
require 'selenium/webdriver/common/interactions/key_input'
|
|
71
|
+
require 'selenium/webdriver/common/interactions/pointer_input'
|
|
59
72
|
require 'selenium/webdriver/common/keys'
|
|
60
73
|
require 'selenium/webdriver/common/bridge_helper'
|
|
61
74
|
require 'selenium/webdriver/common/profile_helper'
|
|
75
|
+
require 'selenium/webdriver/common/options'
|
|
62
76
|
require 'selenium/webdriver/common/driver'
|
|
63
77
|
require 'selenium/webdriver/common/element'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
4
|
# or more contributor license agreements. See the NOTICE file
|
|
5
5
|
# distributed with this work for additional information
|
|
@@ -20,83 +20,54 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Edge
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if
|
|
32
|
-
|
|
23
|
+
module Bridge
|
|
24
|
+
|
|
25
|
+
def commands(command)
|
|
26
|
+
unsupported = %i[execute_script execute_async_script submit_element double_click
|
|
27
|
+
mouse_down mouse_up mouse_move_to click
|
|
28
|
+
send_keys_to_active_element get_window_handles get_current_window_handle
|
|
29
|
+
get_window_size set_window_size get_window_position set_window_position
|
|
30
|
+
maximize_window get_alert_text accept_alert dismiss_alert]
|
|
31
|
+
if unsupported.include? command
|
|
32
|
+
Remote::OSS::Bridge::COMMANDS[command]
|
|
33
33
|
else
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if @service.instance_variable_get("@host") == "127.0.0.1"
|
|
37
|
-
@service.instance_variable_set("@host", 'localhost')
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
@service.start
|
|
41
|
-
|
|
42
|
-
url = @service.uri
|
|
34
|
+
super
|
|
43
35
|
end
|
|
44
|
-
|
|
45
|
-
caps = create_capabilities(opts)
|
|
46
|
-
|
|
47
|
-
remote_opts = {
|
|
48
|
-
:url => url,
|
|
49
|
-
:desired_capabilities => caps
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
remote_opts.merge!(:http_client => http_client) if http_client
|
|
53
|
-
super(remote_opts)
|
|
54
36
|
end
|
|
55
37
|
|
|
56
|
-
def
|
|
57
|
-
:
|
|
38
|
+
def send_keys_to_active_element(key)
|
|
39
|
+
execute :send_keys_to_active_element, {}, {value: key}
|
|
58
40
|
end
|
|
59
41
|
|
|
60
|
-
def
|
|
61
|
-
|
|
62
|
-
DriverExtensions::TakesScreenshot,
|
|
63
|
-
DriverExtensions::HasInputDevices
|
|
64
|
-
]
|
|
42
|
+
def window_handle
|
|
43
|
+
execute :get_current_window_handle
|
|
65
44
|
end
|
|
66
45
|
|
|
67
|
-
def
|
|
68
|
-
|
|
69
|
-
end
|
|
46
|
+
def window_size(handle = :current)
|
|
47
|
+
data = execute :get_window_size, window_handle: handle
|
|
70
48
|
|
|
71
|
-
|
|
72
|
-
super
|
|
73
|
-
ensure
|
|
74
|
-
@service.stop if @service
|
|
49
|
+
Dimension.new data['width'], data['height']
|
|
75
50
|
end
|
|
76
51
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
unless opts.empty?
|
|
84
|
-
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
|
85
|
-
end
|
|
52
|
+
def resize_window(width, height, handle = :current)
|
|
53
|
+
execute :set_window_size, {window_handle: handle},
|
|
54
|
+
{width: width,
|
|
55
|
+
height: height}
|
|
56
|
+
end
|
|
86
57
|
|
|
87
|
-
|
|
58
|
+
def window_position(handle = :current)
|
|
59
|
+
data = execute :get_window_position, window_handle: handle
|
|
88
60
|
|
|
89
|
-
|
|
61
|
+
Point.new data['x'], data['y']
|
|
90
62
|
end
|
|
91
63
|
|
|
92
|
-
def
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
args << "--log-path=#{opts.delete(:service_log_path)}"
|
|
97
|
-
end
|
|
64
|
+
def reposition_window(x, y, handle = :current)
|
|
65
|
+
execute :set_window_position, {window_handle: handle},
|
|
66
|
+
{x: x, y: y}
|
|
67
|
+
end
|
|
98
68
|
|
|
99
|
-
|
|
69
|
+
def maximize_window(handle = :current)
|
|
70
|
+
execute :maximize_window, window_handle: handle
|
|
100
71
|
end
|
|
101
72
|
|
|
102
73
|
end # Bridge
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
module Edge
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# Driver implementation for Microsoft Edge.
|
|
26
|
+
# @api private
|
|
27
|
+
#
|
|
28
|
+
|
|
29
|
+
class Driver < WebDriver::Driver
|
|
30
|
+
include DriverExtensions::TakesScreenshot
|
|
31
|
+
|
|
32
|
+
def initialize(opts = {})
|
|
33
|
+
opts[:desired_capabilities] ||= Remote::Capabilities.edge
|
|
34
|
+
|
|
35
|
+
opts[:url] ||= service_url(opts)
|
|
36
|
+
|
|
37
|
+
listener = opts.delete(:listener)
|
|
38
|
+
|
|
39
|
+
# Edge is mostly using W3C dialect, but a request to
|
|
40
|
+
# create session responds with OSS-like body,
|
|
41
|
+
# so we need to force W3C implementation.
|
|
42
|
+
desired_capabilities = opts.delete(:desired_capabilities)
|
|
43
|
+
bridge = Remote::Bridge.new(opts)
|
|
44
|
+
capabilities = bridge.create_session(desired_capabilities)
|
|
45
|
+
|
|
46
|
+
WebDriver.logger.info 'Forcing W3C dialect.'
|
|
47
|
+
@bridge = Remote::W3C::Bridge.new(capabilities, bridge.session_id, **opts)
|
|
48
|
+
@bridge.extend Edge::Bridge
|
|
49
|
+
|
|
50
|
+
super(@bridge, listener: listener)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def browser
|
|
54
|
+
:edge
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def quit
|
|
58
|
+
super
|
|
59
|
+
ensure
|
|
60
|
+
@service&.stop
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end # Driver
|
|
64
|
+
end # Edge
|
|
65
|
+
end # WebDriver
|
|
66
|
+
end # Selenium
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
module Edge
|
|
23
|
+
class Options
|
|
24
|
+
attr_accessor :in_private, :start_page
|
|
25
|
+
attr_reader :extension_paths
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Create a new Options instance for Edge.
|
|
29
|
+
#
|
|
30
|
+
# @example
|
|
31
|
+
# options = Selenium::WebDriver::Edge::Options.new(in_private: true)
|
|
32
|
+
# driver = Selenium::WebDriver.for :edge, options: options
|
|
33
|
+
#
|
|
34
|
+
# @param [Hash] opts the pre-defined options to create the Edge::Options with
|
|
35
|
+
# @option opts [Boolean] :in_private Start in private mode. Default is false
|
|
36
|
+
# @option opts [Array<String>] :extension_paths A list of full paths to extensions to install on startup
|
|
37
|
+
# @option opts [String] :start_page Default page to start with
|
|
38
|
+
#
|
|
39
|
+
# @see https://docs.microsoft.com/en-us/microsoft-edge/webdriver
|
|
40
|
+
#
|
|
41
|
+
|
|
42
|
+
def initialize(**opts)
|
|
43
|
+
@in_private = opts.delete(:in_private) || false
|
|
44
|
+
@extension_paths = opts.delete(:extension_paths) || []
|
|
45
|
+
@start_page = opts.delete(:start_page)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# Add an extension by local path.
|
|
50
|
+
#
|
|
51
|
+
# @example
|
|
52
|
+
# options = Selenium::WebDriver::Edge::Options.new
|
|
53
|
+
# options.add_extension_path('C:\path\to\extension')
|
|
54
|
+
#
|
|
55
|
+
# @param [String] path The local path to the extension folder
|
|
56
|
+
#
|
|
57
|
+
|
|
58
|
+
def add_extension_path(path)
|
|
59
|
+
raise Error::WebDriverError, "could not find extension at #{path.inspect}" unless File.directory?(path)
|
|
60
|
+
|
|
61
|
+
@extension_paths << path
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
#
|
|
65
|
+
# @api private
|
|
66
|
+
#
|
|
67
|
+
|
|
68
|
+
def as_json(*)
|
|
69
|
+
opts = {}
|
|
70
|
+
|
|
71
|
+
opts['ms:inPrivate'] = true if @in_private
|
|
72
|
+
opts['ms:extensionPaths'] = @extension_paths if @extension_paths.any?
|
|
73
|
+
opts['ms:startPage'] = @start_page if @start_page
|
|
74
|
+
|
|
75
|
+
opts
|
|
76
|
+
end
|
|
77
|
+
end # Options
|
|
78
|
+
end # Edge
|
|
79
|
+
end # WebDriver
|
|
80
|
+
end # Selenium
|