Skip to content

Commit a4822a3

Browse files
committed
Support passing timeouts to capabilities
This allows to pass timeouts hash into capabilities constructor which will ensure they are as part of new session payload. It also keeps old per-timeout accessors in place which automatically handle conversion from/to W3C capabilities. Fixes #9345
1 parent 49925a4 commit a4822a3

File tree

2 files changed

+91
-24
lines changed

2 files changed

+91
-24
lines changed

rb/lib/selenium/webdriver/remote/capabilities.rb

+38-23
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,15 @@ class Capabilities
4040
:unhandled_prompt_behavior,
4141
:strict_file_interactability,
4242

43-
# remote-specific
44-
:remote_session_id,
45-
46-
# TODO: (AR) deprecate compatibility with OSS-capabilities
47-
:implicit_timeout,
48-
:page_load_timeout,
49-
:script_timeout
43+
# remote-specific (webdriver.remote.sessionid)
44+
:remote_session_id
5045
].freeze
5146

5247
KNOWN.each do |key|
5348
define_method key do
5449
@capabilities.fetch(key)
5550
end
5651

57-
next if key == :proxy
58-
5952
define_method "#{key}=" do |value|
6053
@capabilities[key] = value
6154
end
@@ -89,16 +82,10 @@ def edge(opts = {})
8982
alias_method :microsoftedge, :edge
9083

9184
def firefox(opts = {})
92-
opts[:browser_version] = opts.delete(:version) if opts.key?(:version)
93-
opts[:platform_name] = opts.delete(:platform) if opts.key?(:platform)
94-
opts[:timeouts] = {}
95-
opts[:timeouts]['implicit'] = opts.delete(:implicit_timeout) if opts.key?(:implicit_timeout)
96-
opts[:timeouts]['pageLoad'] = opts.delete(:page_load_timeout) if opts.key?(:page_load_timeout)
97-
opts[:timeouts]['script'] = opts.delete(:script_timeout) if opts.key?(:script_timeout)
98-
opts.delete(:timeouts) if opts[:timeouts].empty?
99-
new({browser_name: 'firefox'}.merge(opts))
85+
new({
86+
browser_name: 'firefox'
87+
}.merge(opts))
10088
end
101-
10289
alias_method :ff, :firefox
10390

10491
def safari(opts = {})
@@ -135,12 +122,7 @@ def first_match(*capabilities)
135122

136123
def json_create(data)
137124
data = data.dup
138-
139125
caps = new
140-
(KNOWN - %i[timeouts proxy]).each do |cap|
141-
data_value = camel_case(cap)
142-
caps[cap] = data.delete(data_value) if data.key?(data_value)
143-
end
144126

145127
process_timeouts(caps, data.delete('timeouts'))
146128

@@ -154,6 +136,11 @@ def json_create(data)
154136
caps[:remote_session_id] = data.delete('webdriver.remote.sessionid')
155137
end
156138

139+
KNOWN.each do |cap|
140+
data_value = camel_case(cap)
141+
caps[cap] = data.delete(data_value) if data.key?(data_value)
142+
end
143+
157144
# any remaining pairs will be added as is, with no conversion
158145
caps.merge!(data)
159146

@@ -225,6 +212,34 @@ def proxy=(proxy)
225212
end
226213
end
227214

215+
def timeouts
216+
@capabilities[:timeouts] ||= {}
217+
end
218+
219+
def implicit_timeout
220+
timeouts[:implicit]
221+
end
222+
223+
def implicit_timeout=(timeout)
224+
timeouts[:implicit] = timeout
225+
end
226+
227+
def page_load_timeout
228+
timeouts[:page_load] || timeouts[:pageLoad]
229+
end
230+
231+
def page_load_timeout=(timeout)
232+
timeouts[:page_load] = timeout
233+
end
234+
235+
def script_timeout
236+
timeouts[:script]
237+
end
238+
239+
def script_timeout=(timeout)
240+
timeouts[:script] = timeout
241+
end
242+
228243
#
229244
# @api private
230245
#

rb/spec/unit/selenium/webdriver/remote/capabilities_spec.rb

+53-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,13 @@ module Remote
107107
end
108108

109109
it 'can be serialized and deserialized to JSON' do
110-
caps = Capabilities.new(browser_name: 'firefox', 'extension:customCapability': true)
110+
caps = Capabilities.new(browser_name: 'firefox',
111+
timeouts: {
112+
implicit: 1,
113+
page_load: 2,
114+
script: 3
115+
},
116+
'extension:customCapability': true)
111117
expect(caps).to eq(Capabilities.json_create(caps.as_json))
112118
end
113119

@@ -126,6 +132,52 @@ module Remote
126132
expect(Capabilities.first_match(Capabilities.chrome, Capabilities.firefox).as_json).to eq(expected)
127133
end
128134
end
135+
136+
context 'timeouts' do
137+
let(:as_json) do
138+
{
139+
'browserName' => 'chrome',
140+
'timeouts' => {
141+
'implicit' => 1,
142+
'pageLoad' => 2,
143+
'script' => 3
144+
}
145+
}
146+
end
147+
148+
it 'processes timeouts as hash' do
149+
caps = Capabilities.chrome(timeouts: {implicit: 1, page_load: 2, script: 3})
150+
expect(caps.timeouts).to eq(implicit: 1, page_load: 2, script: 3)
151+
expect(caps.implicit_timeout).to eq(1)
152+
expect(caps.page_load_timeout).to eq(2)
153+
expect(caps.script_timeout).to eq(3)
154+
expect(caps.as_json).to eq(as_json)
155+
end
156+
157+
it 'processes timeouts via timeouts reader' do
158+
caps = Capabilities.chrome
159+
caps.timeouts[:implicit] = 1
160+
caps.timeouts[:page_load] = 2
161+
caps.timeouts[:script] = 3
162+
expect(caps.timeouts).to eq(implicit: 1, page_load: 2, script: 3)
163+
expect(caps.implicit_timeout).to eq(1)
164+
expect(caps.page_load_timeout).to eq(2)
165+
expect(caps.script_timeout).to eq(3)
166+
expect(caps.as_json).to eq(as_json)
167+
end
168+
169+
it 'processes timeouts via per-timeout writers' do
170+
caps = Capabilities.chrome
171+
caps.implicit_timeout = 1
172+
caps.page_load_timeout = 2
173+
caps.script_timeout = 3
174+
expect(caps.timeouts).to eq(implicit: 1, page_load: 2, script: 3)
175+
expect(caps.implicit_timeout).to eq(1)
176+
expect(caps.page_load_timeout).to eq(2)
177+
expect(caps.script_timeout).to eq(3)
178+
expect(caps.as_json).to eq(as_json)
179+
end
180+
end
129181
end # Remote
130182
end # WebDriver
131183
end # Selenium

0 commit comments

Comments
 (0)