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.
- checksums.yaml +4 -4
- data/CHANGES +150 -0
- data/Gemfile +2 -0
- data/LICENSE +1 -1
- data/lib/selenium/server.rb +9 -7
- data/lib/selenium/webdriver/atoms/getAttribute.js +6 -7
- data/lib/selenium/webdriver/atoms/isDisplayed.js +60 -59
- data/lib/selenium/webdriver/atoms.rb +20 -1
- data/lib/selenium/webdriver/chrome/bridge.rb +23 -3
- data/lib/selenium/webdriver/chrome/driver.rb +30 -20
- data/lib/selenium/webdriver/chrome/options.rb +11 -7
- data/lib/selenium/webdriver/chrome/profile.rb +6 -5
- data/lib/selenium/webdriver/chrome/service.rb +13 -13
- data/lib/selenium/webdriver/chrome.rb +10 -4
- data/lib/selenium/webdriver/common/action_builder.rb +2 -0
- data/lib/selenium/webdriver/common/alert.rb +2 -0
- data/lib/selenium/webdriver/common/bridge_helper.rb +8 -5
- data/lib/selenium/webdriver/common/driver.rb +22 -7
- data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +3 -3
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +3 -1
- data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +3 -1
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +3 -3
- data/lib/selenium/webdriver/common/element.rb +3 -1
- data/lib/selenium/webdriver/common/error.rb +74 -18
- data/lib/selenium/webdriver/common/file_reaper.rb +3 -3
- data/lib/selenium/webdriver/common/html5/local_storage.rb +2 -0
- data/lib/selenium/webdriver/common/html5/session_storage.rb +2 -0
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +4 -1
- data/lib/selenium/webdriver/common/interactions/input_device.rb +3 -0
- data/lib/selenium/webdriver/common/interactions/interaction.rb +3 -0
- data/lib/selenium/webdriver/common/interactions/interactions.rb +3 -1
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +2 -0
- data/lib/selenium/webdriver/common/interactions/key_input.rb +4 -0
- data/lib/selenium/webdriver/common/interactions/none_input.rb +3 -0
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +2 -0
- data/lib/selenium/webdriver/common/interactions/pointer_input.rb +7 -0
- data/lib/selenium/webdriver/common/keyboard.rb +4 -1
- data/lib/selenium/webdriver/common/keys.rb +3 -0
- data/lib/selenium/webdriver/common/log_entry.rb +4 -2
- data/lib/selenium/webdriver/common/logger.rb +15 -40
- data/lib/selenium/webdriver/common/logs.rb +2 -0
- data/lib/selenium/webdriver/common/manager.rb +177 -0
- data/lib/selenium/webdriver/common/mouse.rb +3 -0
- data/lib/selenium/webdriver/common/navigation.rb +2 -0
- data/lib/selenium/webdriver/common/options.rb +28 -126
- data/lib/selenium/webdriver/common/platform.rb +26 -30
- data/lib/selenium/webdriver/common/port_prober.rb +6 -19
- data/lib/selenium/webdriver/common/profile_helper.rb +2 -0
- data/lib/selenium/webdriver/common/proxy.rb +13 -5
- data/lib/selenium/webdriver/common/search_context.rb +6 -8
- data/lib/selenium/webdriver/common/service.rb +87 -29
- data/lib/selenium/webdriver/common/socket_lock.rb +10 -3
- data/lib/selenium/webdriver/common/socket_poller.rb +26 -18
- data/lib/selenium/webdriver/common/target_locator.rb +6 -4
- data/lib/selenium/webdriver/common/timeouts.rb +2 -0
- data/lib/selenium/webdriver/common/touch_action_builder.rb +5 -6
- data/lib/selenium/webdriver/common/touch_screen.rb +4 -1
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +3 -0
- data/lib/selenium/webdriver/common/{w3c_options.rb → w3c_manager.rb} +3 -1
- data/lib/selenium/webdriver/common/wait.rb +13 -5
- data/lib/selenium/webdriver/common/window.rb +2 -0
- data/lib/selenium/webdriver/common/zipper.rb +3 -3
- data/lib/selenium/webdriver/common.rb +5 -2
- data/lib/selenium/webdriver/edge/bridge.rb +2 -0
- data/lib/selenium/webdriver/edge/driver.rb +6 -13
- data/lib/selenium/webdriver/edge/options.rb +3 -0
- data/lib/selenium/webdriver/edge/service.rb +8 -12
- data/lib/selenium/webdriver/edge.rb +11 -5
- data/lib/selenium/webdriver/firefox/binary.rb +9 -8
- data/lib/selenium/webdriver/firefox/driver.rb +2 -0
- data/lib/selenium/webdriver/firefox/extension.rb +4 -4
- data/lib/selenium/webdriver/firefox/launcher.rb +3 -0
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +7 -3
- data/lib/selenium/webdriver/firefox/marionette/bridge.rb +4 -2
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +6 -12
- data/lib/selenium/webdriver/firefox/options.rb +22 -9
- data/lib/selenium/webdriver/firefox/profile.rb +7 -8
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +3 -0
- data/lib/selenium/webdriver/firefox/service.rb +8 -19
- data/lib/selenium/webdriver/firefox/util.rb +2 -0
- data/lib/selenium/webdriver/firefox.rb +10 -4
- data/lib/selenium/webdriver/ie/driver.rb +5 -11
- data/lib/selenium/webdriver/ie/options.rb +6 -4
- data/lib/selenium/webdriver/ie/service.rb +8 -12
- data/lib/selenium/webdriver/ie.rb +10 -4
- data/lib/selenium/webdriver/remote/bridge.rb +8 -6
- data/lib/selenium/webdriver/remote/capabilities.rb +23 -10
- data/lib/selenium/webdriver/remote/driver.rb +2 -0
- data/lib/selenium/webdriver/remote/http/common.rb +11 -4
- data/lib/selenium/webdriver/remote/http/curb.rb +4 -2
- data/lib/selenium/webdriver/remote/http/default.rb +31 -25
- data/lib/selenium/webdriver/remote/http/persistent.rb +3 -1
- data/lib/selenium/webdriver/remote/oss/bridge.rb +5 -2
- data/lib/selenium/webdriver/remote/oss/commands.rb +106 -104
- data/lib/selenium/webdriver/remote/response.rb +11 -3
- data/lib/selenium/webdriver/remote/server_error.rb +2 -0
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +28 -13
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +37 -21
- data/lib/selenium/webdriver/remote/w3c/commands.rb +61 -58
- data/lib/selenium/webdriver/remote.rb +2 -0
- data/lib/selenium/webdriver/safari/bridge.rb +5 -3
- data/lib/selenium/webdriver/safari/driver.rb +9 -11
- data/lib/selenium/webdriver/safari/options.rb +2 -0
- data/lib/selenium/webdriver/safari/service.rb +6 -25
- data/lib/selenium/webdriver/safari.rb +11 -4
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +2 -0
- data/lib/selenium/webdriver/support/block_event_listener.rb +3 -1
- data/lib/selenium/webdriver/support/color.rb +11 -9
- data/lib/selenium/webdriver/support/escaper.rb +2 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +3 -1
- data/lib/selenium/webdriver/support/select.rb +19 -18
- data/lib/selenium/webdriver/support.rb +2 -0
- data/lib/selenium/webdriver/version.rb +3 -1
- data/lib/selenium/webdriver.rb +3 -1
- data/lib/selenium-webdriver.rb +2 -0
- data/selenium-webdriver.gemspec +15 -8
- 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
|
@@ -28,190 +30,190 @@ module Selenium
|
|
28
30
|
class Bridge
|
29
31
|
|
30
32
|
COMMANDS = {
|
31
|
-
get_capabilities: [:get, 'session/:session_id'
|
32
|
-
status: [:get, 'status'
|
33
|
+
get_capabilities: [:get, 'session/:session_id'],
|
34
|
+
status: [:get, 'status'],
|
33
35
|
|
34
36
|
#
|
35
37
|
# basic driver
|
36
38
|
#
|
37
39
|
|
38
|
-
get_current_url: [:get, 'session/:session_id/url'
|
39
|
-
get: [:post, 'session/:session_id/url'
|
40
|
-
go_forward: [:post, 'session/:session_id/forward'
|
41
|
-
go_back: [:post, 'session/:session_id/back'
|
42
|
-
refresh: [:post, 'session/:session_id/refresh'
|
43
|
-
quit: [:delete, 'session/:session_id'
|
44
|
-
close: [:delete, 'session/:session_id/window'
|
45
|
-
get_page_source: [:get, 'session/:session_id/source'
|
46
|
-
get_title: [:get, 'session/:session_id/title'
|
47
|
-
find_element: [:post, 'session/:session_id/element'
|
48
|
-
find_elements: [:post, 'session/:session_id/elements'
|
49
|
-
get_active_element: [:post, 'session/:session_id/element/active'
|
40
|
+
get_current_url: [:get, 'session/:session_id/url'],
|
41
|
+
get: [:post, 'session/:session_id/url'],
|
42
|
+
go_forward: [:post, 'session/:session_id/forward'],
|
43
|
+
go_back: [:post, 'session/:session_id/back'],
|
44
|
+
refresh: [:post, 'session/:session_id/refresh'],
|
45
|
+
quit: [:delete, 'session/:session_id'],
|
46
|
+
close: [:delete, 'session/:session_id/window'],
|
47
|
+
get_page_source: [:get, 'session/:session_id/source'],
|
48
|
+
get_title: [:get, 'session/:session_id/title'],
|
49
|
+
find_element: [:post, 'session/:session_id/element'],
|
50
|
+
find_elements: [:post, 'session/:session_id/elements'],
|
51
|
+
get_active_element: [:post, 'session/:session_id/element/active'],
|
50
52
|
|
51
53
|
#
|
52
54
|
# window handling
|
53
55
|
#
|
54
56
|
|
55
|
-
get_current_window_handle: [:get, 'session/:session_id/window_handle'
|
56
|
-
get_window_handles: [:get, 'session/:session_id/window_handles'
|
57
|
-
set_window_size: [:post, 'session/:session_id/window/:window_handle/size'
|
58
|
-
set_window_position: [:post, 'session/:session_id/window/:window_handle/position'
|
59
|
-
get_window_size: [:get, 'session/:session_id/window/:window_handle/size'
|
60
|
-
get_window_position: [:get, 'session/:session_id/window/:window_handle/position'
|
61
|
-
maximize_window: [:post, 'session/:session_id/window/:window_handle/maximize'
|
57
|
+
get_current_window_handle: [:get, 'session/:session_id/window_handle'],
|
58
|
+
get_window_handles: [:get, 'session/:session_id/window_handles'],
|
59
|
+
set_window_size: [:post, 'session/:session_id/window/:window_handle/size'],
|
60
|
+
set_window_position: [:post, 'session/:session_id/window/:window_handle/position'],
|
61
|
+
get_window_size: [:get, 'session/:session_id/window/:window_handle/size'],
|
62
|
+
get_window_position: [:get, 'session/:session_id/window/:window_handle/position'],
|
63
|
+
maximize_window: [:post, 'session/:session_id/window/:window_handle/maximize'],
|
62
64
|
|
63
65
|
#
|
64
66
|
# script execution
|
65
67
|
#
|
66
68
|
|
67
|
-
execute_script: [:post, 'session/:session_id/execute'
|
68
|
-
execute_async_script: [:post, 'session/:session_id/execute_async'
|
69
|
+
execute_script: [:post, 'session/:session_id/execute'],
|
70
|
+
execute_async_script: [:post, 'session/:session_id/execute_async'],
|
69
71
|
|
70
72
|
#
|
71
73
|
# screenshot
|
72
74
|
#
|
73
75
|
|
74
|
-
screenshot: [:get, 'session/:session_id/screenshot'
|
76
|
+
screenshot: [:get, 'session/:session_id/screenshot'],
|
75
77
|
|
76
78
|
#
|
77
79
|
# alerts
|
78
80
|
#
|
79
81
|
|
80
|
-
dismiss_alert: [:post, 'session/:session_id/dismiss_alert'
|
81
|
-
accept_alert: [:post, 'session/:session_id/accept_alert'
|
82
|
-
get_alert_text: [:get, 'session/:session_id/alert_text'
|
83
|
-
set_alert_value: [:post, 'session/:session_id/alert_text'
|
84
|
-
set_authentication: [:post, 'session/:session_id/alert/credentials'
|
82
|
+
dismiss_alert: [:post, 'session/:session_id/dismiss_alert'],
|
83
|
+
accept_alert: [:post, 'session/:session_id/accept_alert'],
|
84
|
+
get_alert_text: [:get, 'session/:session_id/alert_text'],
|
85
|
+
set_alert_value: [:post, 'session/:session_id/alert_text'],
|
86
|
+
set_authentication: [:post, 'session/:session_id/alert/credentials'],
|
85
87
|
|
86
88
|
#
|
87
89
|
# target locator
|
88
90
|
#
|
89
91
|
|
90
|
-
switch_to_frame: [:post, 'session/:session_id/frame'
|
91
|
-
switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'
|
92
|
-
switch_to_window: [:post, 'session/:session_id/window'
|
92
|
+
switch_to_frame: [:post, 'session/:session_id/frame'],
|
93
|
+
switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'],
|
94
|
+
switch_to_window: [:post, 'session/:session_id/window'],
|
93
95
|
|
94
96
|
#
|
95
97
|
# options
|
96
98
|
#
|
97
99
|
|
98
|
-
get_cookies: [:get, 'session/:session_id/cookie'
|
99
|
-
add_cookie: [:post, 'session/:session_id/cookie'
|
100
|
-
delete_all_cookies: [:delete, 'session/:session_id/cookie'
|
101
|
-
delete_cookie: [:delete, 'session/:session_id/cookie/:name'
|
100
|
+
get_cookies: [:get, 'session/:session_id/cookie'],
|
101
|
+
add_cookie: [:post, 'session/:session_id/cookie'],
|
102
|
+
delete_all_cookies: [:delete, 'session/:session_id/cookie'],
|
103
|
+
delete_cookie: [:delete, 'session/:session_id/cookie/:name'],
|
102
104
|
|
103
105
|
#
|
104
106
|
# timeouts
|
105
107
|
#
|
106
108
|
|
107
|
-
implicitly_wait: [:post, 'session/:session_id/timeouts/implicit_wait'
|
108
|
-
set_script_timeout: [:post, 'session/:session_id/timeouts/async_script'
|
109
|
-
set_timeout: [:post, 'session/:session_id/timeouts'
|
109
|
+
implicitly_wait: [:post, 'session/:session_id/timeouts/implicit_wait'],
|
110
|
+
set_script_timeout: [:post, 'session/:session_id/timeouts/async_script'],
|
111
|
+
set_timeout: [:post, 'session/:session_id/timeouts'],
|
110
112
|
|
111
113
|
#
|
112
114
|
# element
|
113
115
|
#
|
114
116
|
|
115
|
-
describe_element: [:get, 'session/:session_id/element/:id'
|
116
|
-
find_child_element: [:post, 'session/:session_id/element/:id/element'
|
117
|
-
find_child_elements: [:post, 'session/:session_id/element/:id/elements'
|
118
|
-
click_element: [:post, 'session/:session_id/element/:id/click'
|
119
|
-
submit_element: [:post, 'session/:session_id/element/:id/submit'
|
120
|
-
get_element_value: [:get, 'session/:session_id/element/:id/value'
|
121
|
-
send_keys_to_element: [:post, 'session/:session_id/element/:id/value'
|
122
|
-
upload_file: [:post, 'session/:session_id/file'
|
123
|
-
get_element_tag_name: [:get, 'session/:session_id/element/:id/name'
|
124
|
-
clear_element: [:post, 'session/:session_id/element/:id/clear'
|
125
|
-
is_element_selected: [:get, 'session/:session_id/element/:id/selected'
|
126
|
-
is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'
|
127
|
-
get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'
|
128
|
-
element_equals: [:get, 'session/:session_id/element/:id/equals/:other'
|
129
|
-
is_element_displayed: [:get, 'session/:session_id/element/:id/displayed'
|
130
|
-
get_element_location: [:get, 'session/:session_id/element/:id/location'
|
131
|
-
get_element_location_once_scrolled_into_view: [:get, 'session/:session_id/element/:id/location_in_view'
|
132
|
-
get_element_size: [:get, 'session/:session_id/element/:id/size'
|
133
|
-
drag_element: [:post, 'session/:session_id/element/:id/drag'
|
134
|
-
get_element_value_of_css_property: [:get, 'session/:session_id/element/:id/css/:property_name'
|
135
|
-
get_element_text: [:get, 'session/:session_id/element/:id/text'
|
117
|
+
describe_element: [:get, 'session/:session_id/element/:id'],
|
118
|
+
find_child_element: [:post, 'session/:session_id/element/:id/element'],
|
119
|
+
find_child_elements: [:post, 'session/:session_id/element/:id/elements'],
|
120
|
+
click_element: [:post, 'session/:session_id/element/:id/click'],
|
121
|
+
submit_element: [:post, 'session/:session_id/element/:id/submit'],
|
122
|
+
get_element_value: [:get, 'session/:session_id/element/:id/value'],
|
123
|
+
send_keys_to_element: [:post, 'session/:session_id/element/:id/value'],
|
124
|
+
upload_file: [:post, 'session/:session_id/file'],
|
125
|
+
get_element_tag_name: [:get, 'session/:session_id/element/:id/name'],
|
126
|
+
clear_element: [:post, 'session/:session_id/element/:id/clear'],
|
127
|
+
is_element_selected: [:get, 'session/:session_id/element/:id/selected'],
|
128
|
+
is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'],
|
129
|
+
get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'],
|
130
|
+
element_equals: [:get, 'session/:session_id/element/:id/equals/:other'],
|
131
|
+
is_element_displayed: [:get, 'session/:session_id/element/:id/displayed'],
|
132
|
+
get_element_location: [:get, 'session/:session_id/element/:id/location'],
|
133
|
+
get_element_location_once_scrolled_into_view: [:get, 'session/:session_id/element/:id/location_in_view'],
|
134
|
+
get_element_size: [:get, 'session/:session_id/element/:id/size'],
|
135
|
+
drag_element: [:post, 'session/:session_id/element/:id/drag'],
|
136
|
+
get_element_value_of_css_property: [:get, 'session/:session_id/element/:id/css/:property_name'],
|
137
|
+
get_element_text: [:get, 'session/:session_id/element/:id/text'],
|
136
138
|
|
137
139
|
#
|
138
140
|
# rotatable
|
139
141
|
#
|
140
142
|
|
141
|
-
get_screen_orientation: [:get, 'session/:session_id/orientation'
|
142
|
-
set_screen_orientation: [:post, 'session/:session_id/orientation'
|
143
|
+
get_screen_orientation: [:get, 'session/:session_id/orientation'],
|
144
|
+
set_screen_orientation: [:post, 'session/:session_id/orientation'],
|
143
145
|
|
144
146
|
#
|
145
147
|
# interactions API
|
146
148
|
#
|
147
149
|
|
148
|
-
click: [:post, 'session/:session_id/click'
|
149
|
-
double_click: [:post, 'session/:session_id/doubleclick'
|
150
|
-
mouse_down: [:post, 'session/:session_id/buttondown'
|
151
|
-
mouse_up: [:post, 'session/:session_id/buttonup'
|
152
|
-
mouse_move_to: [:post, 'session/:session_id/moveto'
|
153
|
-
send_modifier_key_to_active_element: [:post, 'session/:session_id/modifier'
|
154
|
-
send_keys_to_active_element: [:post, 'session/:session_id/keys'
|
150
|
+
click: [:post, 'session/:session_id/click'],
|
151
|
+
double_click: [:post, 'session/:session_id/doubleclick'],
|
152
|
+
mouse_down: [:post, 'session/:session_id/buttondown'],
|
153
|
+
mouse_up: [:post, 'session/:session_id/buttonup'],
|
154
|
+
mouse_move_to: [:post, 'session/:session_id/moveto'],
|
155
|
+
send_modifier_key_to_active_element: [:post, 'session/:session_id/modifier'],
|
156
|
+
send_keys_to_active_element: [:post, 'session/:session_id/keys'],
|
155
157
|
|
156
158
|
#
|
157
159
|
# html 5
|
158
160
|
#
|
159
161
|
|
160
|
-
execute_sql: [:post, 'session/:session_id/execute_sql'
|
162
|
+
execute_sql: [:post, 'session/:session_id/execute_sql'],
|
161
163
|
|
162
|
-
get_location: [:get, 'session/:session_id/location'
|
163
|
-
set_location: [:post, 'session/:session_id/location'
|
164
|
+
get_location: [:get, 'session/:session_id/location'],
|
165
|
+
set_location: [:post, 'session/:session_id/location'],
|
164
166
|
|
165
|
-
get_app_cache: [:get, 'session/:session_id/application_cache'
|
166
|
-
get_app_cache_status: [:get, 'session/:session_id/application_cache/status'
|
167
|
-
clear_app_cache: [:delete, 'session/:session_id/application_cache/clear'
|
167
|
+
get_app_cache: [:get, 'session/:session_id/application_cache'],
|
168
|
+
get_app_cache_status: [:get, 'session/:session_id/application_cache/status'],
|
169
|
+
clear_app_cache: [:delete, 'session/:session_id/application_cache/clear'],
|
168
170
|
|
169
|
-
get_network_connection: [:get, 'session/:session_id/network_connection'
|
170
|
-
set_network_connection: [:post, 'session/:session_id/network_connection'
|
171
|
+
get_network_connection: [:get, 'session/:session_id/network_connection'],
|
172
|
+
set_network_connection: [:post, 'session/:session_id/network_connection'],
|
171
173
|
|
172
|
-
get_local_storage_item: [:get, 'session/:session_id/local_storage/key/:key'
|
173
|
-
remove_local_storage_item: [:delete, 'session/:session_id/local_storage/key/:key'
|
174
|
-
get_local_storage_keys: [:get, 'session/:session_id/local_storage'
|
175
|
-
set_local_storage_item: [:post, 'session/:session_id/local_storage'
|
176
|
-
clear_local_storage: [:delete, 'session/:session_id/local_storage'
|
177
|
-
get_local_storage_size: [:get, 'session/:session_id/local_storage/size'
|
174
|
+
get_local_storage_item: [:get, 'session/:session_id/local_storage/key/:key'],
|
175
|
+
remove_local_storage_item: [:delete, 'session/:session_id/local_storage/key/:key'],
|
176
|
+
get_local_storage_keys: [:get, 'session/:session_id/local_storage'],
|
177
|
+
set_local_storage_item: [:post, 'session/:session_id/local_storage'],
|
178
|
+
clear_local_storage: [:delete, 'session/:session_id/local_storage'],
|
179
|
+
get_local_storage_size: [:get, 'session/:session_id/local_storage/size'],
|
178
180
|
|
179
|
-
get_session_storage_item: [:get, 'session/:session_id/session_storage/key/:key'
|
180
|
-
remove_session_storage_item: [:delete, 'session/:session_id/session_storage/key/:key'
|
181
|
-
get_session_storage_keys: [:get, 'session/:session_id/session_storage'
|
182
|
-
set_session_storage_item: [:post, 'session/:session_id/session_storage'
|
183
|
-
clear_session_storage: [:delete, 'session/:session_id/session_storage'
|
184
|
-
get_session_storage_size: [:get, 'session/:session_id/session_storage/size'
|
181
|
+
get_session_storage_item: [:get, 'session/:session_id/session_storage/key/:key'],
|
182
|
+
remove_session_storage_item: [:delete, 'session/:session_id/session_storage/key/:key'],
|
183
|
+
get_session_storage_keys: [:get, 'session/:session_id/session_storage'],
|
184
|
+
set_session_storage_item: [:post, 'session/:session_id/session_storage'],
|
185
|
+
clear_session_storage: [:delete, 'session/:session_id/session_storage'],
|
186
|
+
get_session_storage_size: [:get, 'session/:session_id/session_storage/size'],
|
185
187
|
|
186
188
|
#
|
187
189
|
# ime
|
188
190
|
#
|
189
191
|
|
190
|
-
ime_get_available_engines: [:get, 'session/:session_id/ime/available_engines'
|
191
|
-
ime_get_active_engine: [:get, 'session/:session_id/ime/active_engine'
|
192
|
-
ime_is_activated: [:get, 'session/:session_id/ime/activated'
|
193
|
-
ime_deactivate: [:post, 'session/:session_id/ime/deactivate'
|
194
|
-
ime_activate_engine: [:post, 'session/:session_id/ime/activate'
|
192
|
+
ime_get_available_engines: [:get, 'session/:session_id/ime/available_engines'],
|
193
|
+
ime_get_active_engine: [:get, 'session/:session_id/ime/active_engine'],
|
194
|
+
ime_is_activated: [:get, 'session/:session_id/ime/activated'],
|
195
|
+
ime_deactivate: [:post, 'session/:session_id/ime/deactivate'],
|
196
|
+
ime_activate_engine: [:post, 'session/:session_id/ime/activate'],
|
195
197
|
|
196
198
|
#
|
197
199
|
# touch
|
198
200
|
#
|
199
201
|
|
200
|
-
touch_single_tap: [:post, 'session/:session_id/touch/click'
|
201
|
-
touch_double_tap: [:post, 'session/:session_id/touch/doubleclick'
|
202
|
-
touch_long_press: [:post, 'session/:session_id/touch/longclick'
|
203
|
-
touch_down: [:post, 'session/:session_id/touch/down'
|
204
|
-
touch_up: [:post, 'session/:session_id/touch/up'
|
205
|
-
touch_move: [:post, 'session/:session_id/touch/move'
|
206
|
-
touch_scroll: [:post, 'session/:session_id/touch/scroll'
|
207
|
-
touch_flick: [:post, 'session/:session_id/touch/flick'
|
202
|
+
touch_single_tap: [:post, 'session/:session_id/touch/click'],
|
203
|
+
touch_double_tap: [:post, 'session/:session_id/touch/doubleclick'],
|
204
|
+
touch_long_press: [:post, 'session/:session_id/touch/longclick'],
|
205
|
+
touch_down: [:post, 'session/:session_id/touch/down'],
|
206
|
+
touch_up: [:post, 'session/:session_id/touch/up'],
|
207
|
+
touch_move: [:post, 'session/:session_id/touch/move'],
|
208
|
+
touch_scroll: [:post, 'session/:session_id/touch/scroll'],
|
209
|
+
touch_flick: [:post, 'session/:session_id/touch/flick'],
|
208
210
|
|
209
211
|
#
|
210
212
|
# logs
|
211
213
|
#
|
212
214
|
|
213
|
-
get_available_log_types: [:get, 'session/:session_id/log/types'
|
214
|
-
get_log: [:post, 'session/:session_id/log'
|
215
|
+
get_available_log_types: [:get, 'session/:session_id/log/types'],
|
216
|
+
get_log: [:post, 'session/:session_id/log']
|
215
217
|
}.freeze
|
216
218
|
|
217
219
|
end # Bridge
|
@@ -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
|
@@ -20,7 +22,7 @@ module Selenium
|
|
20
22
|
module Remote
|
21
23
|
# @api private
|
22
24
|
class Response
|
23
|
-
STACKTRACE_KEY = 'stackTrace'
|
25
|
+
STACKTRACE_KEY = 'stackTrace'
|
24
26
|
|
25
27
|
attr_reader :code, :payload
|
26
28
|
attr_writer :payload
|
@@ -49,6 +51,7 @@ module Selenium
|
|
49
51
|
when Hash
|
50
52
|
msg = val['message']
|
51
53
|
return 'unknown error' unless msg
|
54
|
+
|
52
55
|
msg << ": #{val['alert']['text'].inspect}" if val['alert'].is_a?(Hash) && val['alert']['text']
|
53
56
|
msg << " (#{val['class']})" if val['class']
|
54
57
|
msg
|
@@ -69,12 +72,15 @@ module Selenium
|
|
69
72
|
e = error
|
70
73
|
raise e if e
|
71
74
|
return unless @code.nil? || @code >= 400
|
75
|
+
|
72
76
|
raise Error::ServerError, self
|
73
77
|
end
|
74
78
|
|
75
79
|
def add_backtrace(ex)
|
76
80
|
return unless error_payload.is_a?(Hash)
|
77
81
|
|
82
|
+
# Legacy Firefox returns String in ['value'], while we expect Hash.
|
83
|
+
# Use #dig when Firefox legacy is removed (4.0).
|
78
84
|
server_trace = error_payload[STACKTRACE_KEY] ||
|
79
85
|
error_payload[STACKTRACE_KEY.downcase] ||
|
80
86
|
(error_payload['value'] && error_payload['value'][STACKTRACE_KEY])
|
@@ -91,7 +97,7 @@ module Selenium
|
|
91
97
|
end
|
92
98
|
|
93
99
|
def backtrace_from_remote(server_trace)
|
94
|
-
server_trace.map
|
100
|
+
server_trace.map { |frame|
|
95
101
|
next unless frame.is_a?(Hash)
|
96
102
|
|
97
103
|
file = frame['fileName']
|
@@ -104,7 +110,7 @@ module Selenium
|
|
104
110
|
meth = 'unknown' if meth.nil? || meth.empty?
|
105
111
|
|
106
112
|
"[remote server] #{file}:#{line}:in `#{meth}'"
|
107
|
-
|
113
|
+
}.compact
|
108
114
|
end
|
109
115
|
|
110
116
|
def error_payload
|
@@ -115,11 +121,13 @@ module Selenium
|
|
115
121
|
|
116
122
|
def status
|
117
123
|
return unless error_payload.is_a? Hash
|
124
|
+
|
118
125
|
@status ||= error_payload['status'] || error_payload['error']
|
119
126
|
end
|
120
127
|
|
121
128
|
def value
|
122
129
|
return unless error_payload.is_a? Hash
|
130
|
+
|
123
131
|
@value ||= error_payload['value'] || error_payload['message']
|
124
132
|
end
|
125
133
|
end # Response
|
@@ -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
|
@@ -116,6 +118,20 @@ module Selenium
|
|
116
118
|
'return source;')
|
117
119
|
end
|
118
120
|
|
121
|
+
#
|
122
|
+
# Create a new top-level browsing context
|
123
|
+
# https://w3c.github.io/webdriver/#new-window
|
124
|
+
# @param type [String] Supports two values: 'tab' and 'window'.
|
125
|
+
# Use 'tab' if you'd like the new window to share an OS-level window
|
126
|
+
# with the current browsing context.
|
127
|
+
# Use 'window' otherwise
|
128
|
+
# @return [Hash] Containing 'handle' with the value of the window handle
|
129
|
+
# and 'type' with the value of the created window type
|
130
|
+
#
|
131
|
+
def new_window(type)
|
132
|
+
execute :new_window, {}, {type: type}
|
133
|
+
end
|
134
|
+
|
119
135
|
def switch_to_window(name)
|
120
136
|
execute :switch_to_window, {}, {handle: name}
|
121
137
|
end
|
@@ -162,16 +178,14 @@ module Selenium
|
|
162
178
|
end
|
163
179
|
|
164
180
|
def resize_window(width, height, handle = :current)
|
165
|
-
unless handle == :current
|
166
|
-
|
167
|
-
end
|
181
|
+
raise Error::WebDriverError, 'Switch to desired window before changing its size' unless handle == :current
|
182
|
+
|
168
183
|
set_window_rect(width: width, height: height)
|
169
184
|
end
|
170
185
|
|
171
186
|
def window_size(handle = :current)
|
172
|
-
unless handle == :current
|
173
|
-
|
174
|
-
end
|
187
|
+
raise Error::UnsupportedOperationError, 'Switch to desired window before getting its size' unless handle == :current
|
188
|
+
|
175
189
|
data = execute :get_window_rect
|
176
190
|
|
177
191
|
Dimension.new data['width'], data['height']
|
@@ -182,9 +196,8 @@ module Selenium
|
|
182
196
|
end
|
183
197
|
|
184
198
|
def maximize_window(handle = :current)
|
185
|
-
unless handle == :current
|
186
|
-
|
187
|
-
end
|
199
|
+
raise Error::UnsupportedOperationError, 'Switch to desired window before changing its size' unless handle == :current
|
200
|
+
|
188
201
|
execute :maximize_window
|
189
202
|
end
|
190
203
|
|
@@ -203,7 +216,7 @@ module Selenium
|
|
203
216
|
|
204
217
|
def set_window_rect(x: nil, y: nil, width: nil, height: nil)
|
205
218
|
params = {x: x, y: y, width: width, height: height}
|
206
|
-
params.update(params) { |
|
219
|
+
params.update(params) { |_k, v| Integer(v) unless v.nil? }
|
207
220
|
execute :set_window_rect, {}, params
|
208
221
|
end
|
209
222
|
|
@@ -302,8 +315,8 @@ module Selenium
|
|
302
315
|
# cookies
|
303
316
|
#
|
304
317
|
|
305
|
-
def
|
306
|
-
@
|
318
|
+
def manage
|
319
|
+
@manage ||= WebDriver::W3CManager.new(self)
|
307
320
|
end
|
308
321
|
|
309
322
|
def add_cookie(cookie)
|
@@ -459,6 +472,7 @@ module Selenium
|
|
459
472
|
end
|
460
473
|
|
461
474
|
def element_attribute(element, name)
|
475
|
+
WebDriver.logger.info "Using script for :getAttribute of #{name}"
|
462
476
|
execute_atom :getAttribute, element, name
|
463
477
|
end
|
464
478
|
|
@@ -506,6 +520,7 @@ module Selenium
|
|
506
520
|
end
|
507
521
|
|
508
522
|
def element_displayed?(element)
|
523
|
+
WebDriver.logger.info 'Using script for :isDisplayed'
|
509
524
|
execute_atom :isDisplayed, element
|
510
525
|
end
|
511
526
|
|
@@ -569,7 +584,7 @@ module Selenium
|
|
569
584
|
[how, what]
|
570
585
|
end
|
571
586
|
|
572
|
-
ESCAPE_CSS_REGEXP = /(['"\\#.:;,!?+<>=~*^$|%&@`{}\-\[\]\(\)])
|
587
|
+
ESCAPE_CSS_REGEXP = /(['"\\#.:;,!?+<>=~*^$|%&@`{}\-\[\]\(\)])/.freeze
|
573
588
|
UNICODE_CODE_POINT = 30
|
574
589
|
|
575
590
|
# Escapes invalid characters in CSS selector.
|
@@ -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
|
@@ -29,7 +31,7 @@ module Selenium
|
|
29
31
|
|
30
32
|
class Capabilities
|
31
33
|
|
32
|
-
EXTENSION_CAPABILITY_PATTERN = /\A[\w-]+:.*\z
|
34
|
+
EXTENSION_CAPABILITY_PATTERN = /\A[\w-]+:.*\z/.freeze
|
33
35
|
|
34
36
|
KNOWN = [
|
35
37
|
:browser_name,
|
@@ -41,18 +43,19 @@ module Selenium
|
|
41
43
|
:set_window_rect,
|
42
44
|
:timeouts,
|
43
45
|
:unhandled_prompt_behavior,
|
46
|
+
:strict_file_interactability,
|
44
47
|
|
45
48
|
# remote-specific
|
46
49
|
:remote_session_id,
|
47
50
|
|
48
|
-
# TODO (alex)
|
51
|
+
# TODO: (alex) deprecate in favor of Firefox::Options?
|
49
52
|
:accessibility_checks,
|
50
53
|
:device,
|
51
54
|
|
52
|
-
# TODO (alex)
|
55
|
+
# TODO: (alex) deprecate compatibility with OSS-capabilities
|
53
56
|
:implicit_timeout,
|
54
57
|
:page_load_timeout,
|
55
|
-
:script_timeout
|
58
|
+
:script_timeout
|
56
59
|
].freeze
|
57
60
|
|
58
61
|
KNOWN.each do |key|
|
@@ -61,7 +64,14 @@ module Selenium
|
|
61
64
|
end
|
62
65
|
|
63
66
|
next if key == :proxy
|
67
|
+
|
64
68
|
define_method "#{key}=" do |value|
|
69
|
+
case key
|
70
|
+
when :accessibility_checks
|
71
|
+
WebDriver.logger.deprecate(":accessibility_checks capability")
|
72
|
+
when :device
|
73
|
+
WebDriver.logger.deprecate(":device capability")
|
74
|
+
end
|
65
75
|
@capabilities[key] = value
|
66
76
|
end
|
67
77
|
end
|
@@ -81,20 +91,15 @@ module Selenium
|
|
81
91
|
|
82
92
|
class << self
|
83
93
|
def edge(opts = {})
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
}.merge(opts))
|
94
|
+
WebDriver.logger.deprecate('Selenium::WebDriver::Remote::W3C::Capabilities.edge',
|
95
|
+
'Selenium::WebDriver::Remote::Capabilities.edge')
|
96
|
+
Remote::Capabilities.edge(opts)
|
88
97
|
end
|
89
98
|
|
90
99
|
def firefox(opts = {})
|
91
|
-
|
92
|
-
|
93
|
-
opts
|
94
|
-
opts[:timeouts]['implicit'] = opts.delete(:implicit_timeout) if opts.key?(:implicit_timeout)
|
95
|
-
opts[:timeouts]['pageLoad'] = opts.delete(:page_load_timeout) if opts.key?(:page_load_timeout)
|
96
|
-
opts[:timeouts]['script'] = opts.delete(:script_timeout) if opts.key?(:script_timeout)
|
97
|
-
new({browser_name: 'firefox', marionette: true}.merge(opts))
|
100
|
+
WebDriver.logger.deprecate('Selenium::WebDriver::Remote::W3C::Capabilities.firefox',
|
101
|
+
'Selenium::WebDriver::Remote::Capabilities.firefox')
|
102
|
+
Remote::Capabilities.firefox(opts)
|
98
103
|
end
|
99
104
|
|
100
105
|
alias_method :ff, :firefox
|
@@ -140,10 +145,10 @@ module Selenium
|
|
140
145
|
# @param oss_capabilities [Hash, Remote::Capabilities]
|
141
146
|
#
|
142
147
|
|
143
|
-
def from_oss(oss_capabilities)
|
148
|
+
def from_oss(oss_capabilities) # rubocop:disable Metrics/MethodLength
|
144
149
|
w3c_capabilities = new
|
145
150
|
|
146
|
-
# TODO (alex)
|
151
|
+
# TODO: (alex) make capabilities enumerable?
|
147
152
|
oss_capabilities = oss_capabilities.__send__(:capabilities) unless oss_capabilities.is_a?(Hash)
|
148
153
|
oss_capabilities.each do |name, value|
|
149
154
|
next if value.nil?
|
@@ -163,11 +168,23 @@ module Selenium
|
|
163
168
|
|
164
169
|
# User can pass :firefox_options or :firefox_profile.
|
165
170
|
#
|
166
|
-
# TODO (alex)
|
171
|
+
# TODO: (alex) Refactor this whole method into converter class.
|
167
172
|
firefox_options = oss_capabilities['firefoxOptions'] || oss_capabilities['firefox_options'] || oss_capabilities[:firefox_options]
|
168
173
|
firefox_profile = oss_capabilities['firefox_profile'] || oss_capabilities[:firefox_profile]
|
169
174
|
firefox_binary = oss_capabilities['firefox_binary'] || oss_capabilities[:firefox_binary]
|
170
175
|
|
176
|
+
if firefox_options
|
177
|
+
WebDriver.logger.deprecate(':firefox_options capabilitiy', 'Selenium::WebDriver::Firefox::Options')
|
178
|
+
end
|
179
|
+
|
180
|
+
if firefox_profile
|
181
|
+
WebDriver.logger.deprecate(':firefox_profile capabilitiy', 'Selenium::WebDriver::Firefox::Options#profile')
|
182
|
+
end
|
183
|
+
|
184
|
+
if firefox_binary
|
185
|
+
WebDriver.logger.deprecate(':firefox_binary capabilitiy', 'Selenium::WebDriver::Firefox::Options#binary')
|
186
|
+
end
|
187
|
+
|
171
188
|
if firefox_profile && firefox_options
|
172
189
|
second_profile = firefox_options['profile'] || firefox_options[:profile]
|
173
190
|
if second_profile && firefox_profile != second_profile
|
@@ -250,9 +267,7 @@ module Selenium
|
|
250
267
|
if value
|
251
268
|
hash['proxy'] = value.as_json
|
252
269
|
hash['proxy']['proxyType'] &&= hash['proxy']['proxyType'].downcase
|
253
|
-
if hash['proxy']['noProxy'].is_a?(String)
|
254
|
-
hash['proxy']['noProxy'] = hash['proxy']['noProxy'].split(', ')
|
255
|
-
end
|
270
|
+
hash['proxy']['noProxy'] = hash['proxy']['noProxy'].split(', ') if hash['proxy']['noProxy'].is_a?(String)
|
256
271
|
end
|
257
272
|
when String, :firefox_binary
|
258
273
|
hash[key.to_s] = value
|
@@ -272,6 +287,7 @@ module Selenium
|
|
272
287
|
|
273
288
|
def ==(other)
|
274
289
|
return false unless other.is_a? self.class
|
290
|
+
|
275
291
|
as_json == other.as_json
|
276
292
|
end
|
277
293
|
|