Skip to content

Commit 640a03f

Browse files
authored
[rb] Add target type param to devtools (#15416)
Previously only a target_type of 'page' was supported. By adding target_type as an optional parameter that defaults to 'page', the network conditions on a service worker can be set, eg ```ruby devtools(target_type: 'service_worker').network.emulate_network_conditions( offline: true, latency: 0, download_throughput: 0, upload_throughput: 0 ) ```
1 parent 60302ba commit 640a03f

File tree

6 files changed

+48
-9
lines changed

6 files changed

+48
-9
lines changed

common/src/web/service-worker.js

Whitespace-only changes.

common/src/web/service_worker.html

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Service Worker Test Page</title>
5+
<script>
6+
if (navigator.serviceWorker) {
7+
navigator.serviceWorker.register("/service-worker.js", { scope: "/" })
8+
.then(() => navigator.serviceWorker.ready)
9+
.then(() => console.debug("[Companion]", "Service worker registered!"));
10+
}
11+
</script>
12+
</head>
13+
<body>
14+
<h1>This page loads a service worker</h1>
15+
</body>
16+
</html>

rb/lib/selenium/webdriver/common/driver.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def quit
188188
bridge.quit
189189
ensure
190190
@service_manager&.stop
191-
@devtools&.close
191+
@devtools&.each_value(&:close)
192192
end
193193

194194
#

rb/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb

+4-3
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,13 @@ module HasDevTools
2727
# @return [DevTools]
2828
#
2929

30-
def devtools
31-
@devtools ||= begin
30+
def devtools(target_type: 'page')
31+
@devtools ||= {}
32+
@devtools[target_type] ||= begin
3233
require 'selenium/devtools'
3334
Selenium::DevTools.version ||= devtools_version
3435
Selenium::DevTools.load_version
35-
Selenium::WebDriver::DevTools.new(url: devtools_url)
36+
Selenium::WebDriver::DevTools.new(url: devtools_url, target_type: target_type)
3637
end
3738
end
3839
end # HasDevTools

rb/lib/selenium/webdriver/devtools.rb

+7-5
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ class DevTools
2828
autoload :Request, 'selenium/webdriver/devtools/request'
2929
autoload :Response, 'selenium/webdriver/devtools/response'
3030

31-
def initialize(url:)
31+
def initialize(url:, target_type:)
3232
@ws = WebSocketConnection.new(url: url)
3333
@session_id = nil
34-
start_session
34+
start_session(target_type: target_type)
3535
end
3636

3737
def close
@@ -81,10 +81,12 @@ def respond_to_missing?(method, *_args)
8181

8282
private
8383

84-
def start_session
84+
def start_session(target_type:)
8585
targets = target.get_targets.dig('result', 'targetInfos')
86-
page_target = targets.find { |target| target['type'] == 'page' }
87-
session = target.attach_to_target(target_id: page_target['targetId'], flatten: true)
86+
found_target = targets.find { |target| target['type'] == target_type }
87+
raise Error::WebDriverError, "Target type '#{target_type}' not found" unless found_target
88+
89+
session = target.attach_to_target(target_id: found_target['targetId'], flatten: true)
8890
@session_id = session.dig('result', 'sessionId')
8991
end
9092

rb/spec/integration/selenium/webdriver/devtools_spec.rb

+20
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,26 @@ module WebDriver
5454
}.to raise_error(RuntimeError, 'This is fine!')
5555
end
5656

57+
describe '#target' do
58+
it 'target type defaults to page' do
59+
driver.devtools.page.navigate(url: url_for('xhtmlTest.html'))
60+
expect(driver.devtools.target.get_target_info.dig('result', 'targetInfo', 'type')).to eq 'page'
61+
end
62+
63+
it 'target type is service_worker' do
64+
driver.devtools.page.navigate(url: url_for('service_worker.html'))
65+
sleep 0.5 # wait for service worker to register
66+
target = driver.devtools(target_type: 'service_worker').target
67+
expect(target.get_target_info.dig('result', 'targetInfo', 'type')).to eq 'service_worker'
68+
end
69+
70+
it 'throws an error for unknown target type' do
71+
driver.devtools.page.navigate(url: url_for('xhtmlTest.html'))
72+
expect { driver.devtools(target_type: 'unknown') }
73+
.to raise_error(Selenium::WebDriver::Error::WebDriverError, "Target type 'unknown' not found")
74+
end
75+
end
76+
5777
describe '#register' do
5878
let(:username) { SpecSupport::RackServer::TestApp::BASIC_AUTH_CREDENTIALS.first }
5979
let(:password) { SpecSupport::RackServer::TestApp::BASIC_AUTH_CREDENTIALS.last }

0 commit comments

Comments
 (0)