selenium-webdriver 4.0.0.beta4 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +70 -0
- data/README.md +1 -1
- data/lib/selenium/webdriver/atoms/getAttribute.js +25 -25
- data/lib/selenium/webdriver/chrome/driver.rb +4 -0
- data/lib/selenium/webdriver/chrome/features.rb +44 -4
- data/lib/selenium/webdriver/chrome/options.rb +24 -1
- data/lib/selenium/webdriver/common/driver.rb +5 -1
- data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +51 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +77 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +45 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +38 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +1 -6
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +17 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +87 -18
- data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +11 -11
- data/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +77 -0
- data/lib/selenium/webdriver/common/driver_extensions/prints_page.rb +1 -1
- data/lib/selenium/webdriver/common/element.rb +17 -8
- data/lib/selenium/webdriver/common/error.rb +12 -0
- data/lib/selenium/webdriver/common/log_entry.rb +2 -2
- data/lib/selenium/webdriver/common/manager.rb +3 -13
- data/lib/selenium/webdriver/common/options.rb +13 -5
- data/lib/selenium/webdriver/common/shadow_root.rb +87 -0
- data/lib/selenium/webdriver/common/socket_poller.rb +30 -19
- data/lib/selenium/webdriver/common/target_locator.rb +28 -0
- data/lib/selenium/webdriver/common/timeouts.rb +31 -4
- data/lib/selenium/webdriver/common/window.rb +0 -4
- data/lib/selenium/webdriver/common.rb +6 -0
- data/lib/selenium/webdriver/devtools/pinned_script.rb +59 -0
- data/lib/selenium/webdriver/devtools/request.rb +27 -17
- data/lib/selenium/webdriver/devtools/response.rb +66 -0
- data/lib/selenium/webdriver/devtools.rb +50 -12
- data/lib/selenium/webdriver/edge/features.rb +5 -0
- data/lib/selenium/webdriver/firefox/driver.rb +5 -0
- data/lib/selenium/webdriver/firefox/features.rb +14 -0
- data/lib/selenium/webdriver/firefox/options.rb +28 -1
- data/lib/selenium/webdriver/firefox.rb +0 -1
- data/lib/selenium/webdriver/ie/options.rb +3 -1
- data/lib/selenium/webdriver/ie/service.rb +1 -1
- data/lib/selenium/webdriver/remote/bridge.rb +39 -23
- data/lib/selenium/webdriver/remote/capabilities.rb +3 -2
- data/lib/selenium/webdriver/remote/commands.rb +4 -0
- data/lib/selenium/webdriver/remote/driver.rb +3 -1
- data/lib/selenium/webdriver/remote.rb +1 -1
- data/lib/selenium/webdriver/safari/driver.rb +1 -1
- data/lib/selenium/webdriver/safari/options.rb +7 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +2 -2
- data/lib/selenium/webdriver/version.rb +1 -1
- data/lib/selenium/webdriver.rb +1 -0
- data/selenium-webdriver.gemspec +3 -2
- metadata +31 -3
@@ -25,7 +25,7 @@ module Selenium
|
|
25
25
|
|
26
26
|
PORT = 4444
|
27
27
|
|
28
|
-
attr_accessor :
|
28
|
+
attr_accessor :http, :file_detector
|
29
29
|
attr_reader :capabilities
|
30
30
|
|
31
31
|
#
|
@@ -93,17 +93,16 @@ module Selenium
|
|
93
93
|
execute :get, {}, {url: url}
|
94
94
|
end
|
95
95
|
|
96
|
-
|
97
|
-
|
98
|
-
|
96
|
+
#
|
97
|
+
# timeouts
|
98
|
+
#
|
99
99
|
|
100
|
-
def
|
101
|
-
|
100
|
+
def timeouts
|
101
|
+
execute :get_timeouts, {}
|
102
102
|
end
|
103
103
|
|
104
|
-
def
|
105
|
-
|
106
|
-
execute :set_timeout, {}, {type => milliseconds}
|
104
|
+
def timeouts=(timeouts)
|
105
|
+
execute :set_timeout, {}, timeouts
|
107
106
|
end
|
108
107
|
|
109
108
|
#
|
@@ -269,7 +268,7 @@ module Selenium
|
|
269
268
|
end
|
270
269
|
|
271
270
|
def element_screenshot(element)
|
272
|
-
execute :take_element_screenshot, id: element
|
271
|
+
execute :take_element_screenshot, id: element
|
273
272
|
end
|
274
273
|
|
275
274
|
#
|
@@ -431,7 +430,7 @@ module Selenium
|
|
431
430
|
end
|
432
431
|
|
433
432
|
def submit_element(element)
|
434
|
-
form = find_element_by('xpath', "./ancestor-or-self::form", element)
|
433
|
+
form = find_element_by('xpath', "./ancestor-or-self::form", [:element, element])
|
435
434
|
execute_script("var e = arguments[0].ownerDocument.createEvent('Event');" \
|
436
435
|
"e.initEvent('submit', true, true);" \
|
437
436
|
'if (arguments[0].dispatchEvent(e)) { arguments[0].submit() }', form.as_json)
|
@@ -451,19 +450,19 @@ module Selenium
|
|
451
450
|
end
|
452
451
|
|
453
452
|
def element_dom_attribute(element, name)
|
454
|
-
execute :get_element_attribute, id: element
|
453
|
+
execute :get_element_attribute, id: element, name: name
|
455
454
|
end
|
456
455
|
|
457
456
|
def element_property(element, name)
|
458
|
-
execute :get_element_property, id: element
|
457
|
+
execute :get_element_property, id: element, name: name
|
459
458
|
end
|
460
459
|
|
461
460
|
def element_aria_role(element)
|
462
|
-
execute :get_element_aria_role, id: element
|
461
|
+
execute :get_element_aria_role, id: element
|
463
462
|
end
|
464
463
|
|
465
464
|
def element_aria_label(element)
|
466
|
-
execute :get_element_aria_label, id: element
|
465
|
+
execute :get_element_aria_label, id: element
|
467
466
|
end
|
468
467
|
|
469
468
|
def element_value(element)
|
@@ -524,13 +523,17 @@ module Selenium
|
|
524
523
|
|
525
524
|
alias_method :switch_to_active_element, :active_element
|
526
525
|
|
527
|
-
def find_element_by(how, what,
|
526
|
+
def find_element_by(how, what, parent_ref = [])
|
528
527
|
how, what = convert_locator(how, what)
|
529
528
|
|
530
529
|
return execute_atom(:findElements, Support::RelativeLocator.new(what).as_json).first if how == 'relative'
|
531
530
|
|
532
|
-
|
533
|
-
|
531
|
+
parent_type, parent_id = parent_ref
|
532
|
+
id = case parent_type
|
533
|
+
when :element
|
534
|
+
execute :find_child_element, {id: parent_id}, {using: how, value: what.to_s}
|
535
|
+
when :shadow_root
|
536
|
+
execute :find_shadow_child_element, {id: parent_id}, {using: how, value: what.to_s}
|
534
537
|
else
|
535
538
|
execute :find_element, {}, {using: how, value: what.to_s}
|
536
539
|
end
|
@@ -538,13 +541,17 @@ module Selenium
|
|
538
541
|
Element.new self, element_id_from(id)
|
539
542
|
end
|
540
543
|
|
541
|
-
def find_elements_by(how, what,
|
544
|
+
def find_elements_by(how, what, parent_ref = [])
|
542
545
|
how, what = convert_locator(how, what)
|
543
546
|
|
544
547
|
return execute_atom :findElements, Support::RelativeLocator.new(what).as_json if how == 'relative'
|
545
548
|
|
546
|
-
|
547
|
-
|
549
|
+
parent_type, parent_id = parent_ref
|
550
|
+
ids = case parent_type
|
551
|
+
when :element
|
552
|
+
execute :find_child_elements, {id: parent_id}, {using: how, value: what.to_s}
|
553
|
+
when :shadow_root
|
554
|
+
execute :find_shadow_child_elements, {id: parent_id}, {using: how, value: what.to_s}
|
548
555
|
else
|
549
556
|
execute :find_elements, {}, {using: how, value: what.to_s}
|
550
557
|
end
|
@@ -552,6 +559,11 @@ module Selenium
|
|
552
559
|
ids.map { |id| Element.new self, element_id_from(id) }
|
553
560
|
end
|
554
561
|
|
562
|
+
def shadow_root(element)
|
563
|
+
id = execute :get_element_shadow_root, id: element
|
564
|
+
ShadowRoot.new self, shadow_root_id_from(id)
|
565
|
+
end
|
566
|
+
|
555
567
|
private
|
556
568
|
|
557
569
|
#
|
@@ -599,7 +611,11 @@ module Selenium
|
|
599
611
|
end
|
600
612
|
|
601
613
|
def element_id_from(id)
|
602
|
-
id['ELEMENT'] || id[
|
614
|
+
id['ELEMENT'] || id[Element::ELEMENT_KEY]
|
615
|
+
end
|
616
|
+
|
617
|
+
def shadow_root_id_from(id)
|
618
|
+
id[ShadowRoot::ROOT_KEY]
|
603
619
|
end
|
604
620
|
|
605
621
|
def prepare_capabilities_payload(capabilities)
|
@@ -641,7 +657,7 @@ module Selenium
|
|
641
657
|
# @see https://mathiasbynens.be/notes/css-escapes
|
642
658
|
def escape_css(string)
|
643
659
|
string = string.gsub(ESCAPE_CSS_REGEXP) { |match| "\\#{match}" }
|
644
|
-
string = "\\#{UNICODE_CODE_POINT + Integer(string[0])} #{string[1
|
660
|
+
string = "\\#{UNICODE_CODE_POINT + Integer(string[0])} #{string[1..]}" if string[0]&.match?(/[[:digit:]]/)
|
645
661
|
|
646
662
|
string
|
647
663
|
end
|
@@ -39,6 +39,7 @@ module Selenium
|
|
39
39
|
:timeouts,
|
40
40
|
:unhandled_prompt_behavior,
|
41
41
|
:strict_file_interactability,
|
42
|
+
:web_socket_url,
|
42
43
|
|
43
44
|
# remote-specific (webdriver.remote.sessionid)
|
44
45
|
:remote_session_id
|
@@ -46,7 +47,7 @@ module Selenium
|
|
46
47
|
|
47
48
|
(KNOWN - %i[proxy timeouts]).each do |key|
|
48
49
|
define_method key do
|
49
|
-
@capabilities
|
50
|
+
@capabilities[key]
|
50
51
|
end
|
51
52
|
|
52
53
|
define_method "#{key}=" do |value|
|
@@ -202,7 +203,7 @@ module Selenium
|
|
202
203
|
end
|
203
204
|
|
204
205
|
def proxy
|
205
|
-
@capabilities
|
206
|
+
@capabilities[:proxy]
|
206
207
|
end
|
207
208
|
|
208
209
|
def proxy=(proxy)
|
@@ -77,7 +77,10 @@ module Selenium
|
|
77
77
|
find_elements: [:post, 'session/:session_id/elements'],
|
78
78
|
find_child_element: [:post, 'session/:session_id/element/:id/element'],
|
79
79
|
find_child_elements: [:post, 'session/:session_id/element/:id/elements'],
|
80
|
+
find_shadow_child_element: [:post, 'session/:session_id/shadow/:id/element'],
|
81
|
+
find_shadow_child_elements: [:post, 'session/:session_id/shadow/:id/elements'],
|
80
82
|
get_active_element: [:get, 'session/:session_id/element/active'],
|
83
|
+
get_element_shadow_root: [:get, 'session/:session_id/element/:id/shadow'],
|
81
84
|
is_element_selected: [:get, 'session/:session_id/element/:id/selected'],
|
82
85
|
get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'],
|
83
86
|
get_element_property: [:get, 'session/:session_id/element/:id/property/:name'],
|
@@ -111,6 +114,7 @@ module Selenium
|
|
111
114
|
# timeouts
|
112
115
|
#
|
113
116
|
|
117
|
+
get_timeouts: [:get, 'session/:session_id/timeouts'],
|
114
118
|
set_timeout: [:post, 'session/:session_id/timeouts'],
|
115
119
|
|
116
120
|
#
|
@@ -42,6 +42,7 @@ module Selenium
|
|
42
42
|
end
|
43
43
|
opts[:url] ||= "http://#{Platform.localhost}:4444/wd/hub"
|
44
44
|
super
|
45
|
+
@bridge.file_detector = ->((filename, *)) { File.exist?(filename) && filename.to_s }
|
45
46
|
end
|
46
47
|
|
47
48
|
private
|
@@ -51,7 +52,8 @@ module Selenium
|
|
51
52
|
end
|
52
53
|
|
53
54
|
def devtools_version
|
54
|
-
capabilities['se:cdpVersion']
|
55
|
+
capabilities['se:cdpVersion']&.split('.')&.first ||
|
56
|
+
raise(Error::WebDriverError, "DevTools is not supported by the Remote Server")
|
55
57
|
end
|
56
58
|
end # Driver
|
57
59
|
end # Remote
|
@@ -18,6 +18,7 @@
|
|
18
18
|
# under the License.
|
19
19
|
|
20
20
|
require 'uri'
|
21
|
+
require 'selenium/webdriver/remote/server_error'
|
21
22
|
|
22
23
|
module Selenium
|
23
24
|
module WebDriver
|
@@ -25,7 +26,6 @@ module Selenium
|
|
25
26
|
autoload :Bridge, 'selenium/webdriver/remote/bridge'
|
26
27
|
autoload :Driver, 'selenium/webdriver/remote/driver'
|
27
28
|
autoload :Response, 'selenium/webdriver/remote/response'
|
28
|
-
autoload :ServerError, 'selenium/webdriver/remote/server_error'
|
29
29
|
autoload :Capabilities, 'selenium/webdriver/remote/capabilities'
|
30
30
|
autoload :COMMANDS, 'selenium/webdriver/remote/commands'
|
31
31
|
module Http
|
@@ -28,6 +28,13 @@ module Selenium
|
|
28
28
|
automatic_profiling: 'safari:automaticProfiling'}.freeze
|
29
29
|
BROWSER = 'safari'
|
30
30
|
|
31
|
+
def add_option(name, value = nil)
|
32
|
+
key = name.is_a?(Hash) ? name.keys.first : name
|
33
|
+
raise ArgumentError, 'Safari does not support options that are not namespaced' unless key.to_s.include?(':')
|
34
|
+
|
35
|
+
super
|
36
|
+
end
|
37
|
+
|
31
38
|
end # Options
|
32
39
|
end # Safari
|
33
40
|
end # WebDriver
|
@@ -76,7 +76,7 @@ module Selenium
|
|
76
76
|
@delegate.find_element_by how, what, parent
|
77
77
|
end
|
78
78
|
|
79
|
-
Element.new self, e.ref
|
79
|
+
Element.new self, e.ref.last
|
80
80
|
end
|
81
81
|
|
82
82
|
def find_elements_by(how, what, parent = nil)
|
@@ -84,7 +84,7 @@ module Selenium
|
|
84
84
|
@delegate.find_elements_by(how, what, parent)
|
85
85
|
end
|
86
86
|
|
87
|
-
es.map { |e| Element.new self, e.ref }
|
87
|
+
es.map { |e| Element.new self, e.ref.last }
|
88
88
|
end
|
89
89
|
|
90
90
|
def execute_script(script, *args)
|
data/lib/selenium/webdriver.rb
CHANGED
data/selenium-webdriver.gemspec
CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
}
|
29
29
|
|
30
30
|
s.required_rubygems_version = Gem::Requirement.new('> 1.3.1') if s.respond_to? :required_rubygems_version=
|
31
|
-
s.required_ruby_version = Gem::Requirement.new('>= 2.
|
31
|
+
s.required_ruby_version = Gem::Requirement.new('>= 2.6')
|
32
32
|
|
33
33
|
s.files = [
|
34
34
|
'CHANGES',
|
@@ -45,11 +45,12 @@ Gem::Specification.new do |s|
|
|
45
45
|
s.require_paths = ['lib']
|
46
46
|
|
47
47
|
s.add_runtime_dependency 'childprocess', ['>= 0.5', '< 5.0']
|
48
|
-
s.add_runtime_dependency 'rexml', ['~> 3.2']
|
48
|
+
s.add_runtime_dependency 'rexml', ['~> 3.2', '>= 3.2.5']
|
49
49
|
s.add_runtime_dependency 'rubyzip', ['>= 1.2.2']
|
50
50
|
|
51
51
|
# childprocess requires ffi on windows but doesn't declare it in its dependencies
|
52
52
|
s.add_development_dependency 'ffi'
|
53
|
+
s.add_development_dependency 'pry', ['~> 0.14']
|
53
54
|
s.add_development_dependency 'rack', ['~> 2.0']
|
54
55
|
s.add_development_dependency 'rake'
|
55
56
|
s.add_development_dependency 'rspec', ['~> 3.0']
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: selenium-webdriver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.0
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Rodionov
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-10-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: childprocess
|
@@ -39,6 +39,9 @@ dependencies:
|
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '3.2'
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 3.2.5
|
42
45
|
type: :runtime
|
43
46
|
prerelease: false
|
44
47
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -46,6 +49,9 @@ dependencies:
|
|
46
49
|
- - "~>"
|
47
50
|
- !ruby/object:Gem::Version
|
48
51
|
version: '3.2'
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.2.5
|
49
55
|
- !ruby/object:Gem::Dependency
|
50
56
|
name: rubyzip
|
51
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -74,6 +80,20 @@ dependencies:
|
|
74
80
|
- - ">="
|
75
81
|
- !ruby/object:Gem::Version
|
76
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.14'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.14'
|
77
97
|
- !ruby/object:Gem::Dependency
|
78
98
|
name: rack
|
79
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -238,10 +258,14 @@ files:
|
|
238
258
|
- lib/selenium/webdriver/common/driver_extensions/downloads_files.rb
|
239
259
|
- lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb
|
240
260
|
- lib/selenium/webdriver/common/driver_extensions/has_addons.rb
|
261
|
+
- lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb
|
241
262
|
- lib/selenium/webdriver/common/driver_extensions/has_authentication.rb
|
263
|
+
- lib/selenium/webdriver/common/driver_extensions/has_casting.rb
|
242
264
|
- lib/selenium/webdriver/common/driver_extensions/has_cdp.rb
|
265
|
+
- lib/selenium/webdriver/common/driver_extensions/has_context.rb
|
243
266
|
- lib/selenium/webdriver/common/driver_extensions/has_debugger.rb
|
244
267
|
- lib/selenium/webdriver/common/driver_extensions/has_devtools.rb
|
268
|
+
- lib/selenium/webdriver/common/driver_extensions/has_launching.rb
|
245
269
|
- lib/selenium/webdriver/common/driver_extensions/has_location.rb
|
246
270
|
- lib/selenium/webdriver/common/driver_extensions/has_log_events.rb
|
247
271
|
- lib/selenium/webdriver/common/driver_extensions/has_logs.rb
|
@@ -249,6 +273,7 @@ files:
|
|
249
273
|
- lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb
|
250
274
|
- lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb
|
251
275
|
- lib/selenium/webdriver/common/driver_extensions/has_permissions.rb
|
276
|
+
- lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb
|
252
277
|
- lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb
|
253
278
|
- lib/selenium/webdriver/common/driver_extensions/has_session_id.rb
|
254
279
|
- lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb
|
@@ -282,6 +307,7 @@ files:
|
|
282
307
|
- lib/selenium/webdriver/common/search_context.rb
|
283
308
|
- lib/selenium/webdriver/common/service.rb
|
284
309
|
- lib/selenium/webdriver/common/service_manager.rb
|
310
|
+
- lib/selenium/webdriver/common/shadow_root.rb
|
285
311
|
- lib/selenium/webdriver/common/socket_lock.rb
|
286
312
|
- lib/selenium/webdriver/common/socket_poller.rb
|
287
313
|
- lib/selenium/webdriver/common/takes_screenshot.rb
|
@@ -294,7 +320,9 @@ files:
|
|
294
320
|
- lib/selenium/webdriver/devtools/console_event.rb
|
295
321
|
- lib/selenium/webdriver/devtools/exception_event.rb
|
296
322
|
- lib/selenium/webdriver/devtools/mutation_event.rb
|
323
|
+
- lib/selenium/webdriver/devtools/pinned_script.rb
|
297
324
|
- lib/selenium/webdriver/devtools/request.rb
|
325
|
+
- lib/selenium/webdriver/devtools/response.rb
|
298
326
|
- lib/selenium/webdriver/edge.rb
|
299
327
|
- lib/selenium/webdriver/edge/driver.rb
|
300
328
|
- lib/selenium/webdriver/edge/features.rb
|
@@ -358,7 +386,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
358
386
|
requirements:
|
359
387
|
- - ">="
|
360
388
|
- !ruby/object:Gem::Version
|
361
|
-
version: '2.
|
389
|
+
version: '2.6'
|
362
390
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
363
391
|
requirements:
|
364
392
|
- - ">"
|