Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
seleniumhq
GitHub Repository: seleniumhq/selenium
Path: blob/trunk/javascript/selenium-webdriver/test/bidi/network_test.js
3220 views
1
// Licensed to the Software Freedom Conservancy (SFC) under one
2
// or more contributor license agreements. See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership. The SFC licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License. You may obtain a copy of the License at
8
//
9
// http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied. See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
'use strict'
19
20
const assert = require('node:assert')
21
const { Browser } = require('selenium-webdriver')
22
const { Pages, suite, ignore } = require('../../lib/test')
23
const { Network, CacheBehavior } = require('selenium-webdriver/bidi/network')
24
const BrowsingContext = require('selenium-webdriver/bidi/browsingContext')
25
const until = require('selenium-webdriver/lib/until')
26
27
suite(
28
function (env) {
29
let driver
30
let network
31
32
beforeEach(async function () {
33
driver = await env.builder().build()
34
network = await Network(driver)
35
})
36
37
afterEach(async function () {
38
await network.close()
39
await driver.quit()
40
})
41
42
describe('Network network', function () {
43
it('can listen to event before request is sent', async function () {
44
let beforeRequestEvent = null
45
await network.beforeRequestSent(function (event) {
46
if (event.request.url.includes('empty')) {
47
beforeRequestEvent = event
48
}
49
})
50
51
await driver.get(Pages.emptyPage)
52
53
assert.equal(beforeRequestEvent.request.method, 'GET')
54
const url = beforeRequestEvent.request.url
55
assert.equal(url, await driver.getCurrentUrl())
56
})
57
58
it('can request cookies', async function () {
59
let beforeRequestEvent = null
60
await network.beforeRequestSent(function (event) {
61
beforeRequestEvent = event
62
})
63
64
await driver.get(Pages.emptyText)
65
await driver.manage().addCookie({
66
name: 'north',
67
value: 'biryani',
68
})
69
await driver.navigate().refresh()
70
71
assert.equal(beforeRequestEvent.request.method, 'GET')
72
await driver.wait(() => beforeRequestEvent.request.cookies.length > 0, 2000)
73
assert.equal(beforeRequestEvent.request.cookies[0].name, 'north')
74
assert.equal(beforeRequestEvent.request.cookies[0].value.value, 'biryani')
75
const url = beforeRequestEvent.request.url
76
assert.equal(url, await driver.getCurrentUrl())
77
78
await driver.manage().addCookie({
79
name: 'south',
80
value: 'dosa',
81
})
82
await driver.navigate().refresh()
83
84
await driver.wait(() => beforeRequestEvent.request.cookies.length > 1, 2000)
85
assert.equal(beforeRequestEvent.request.cookies[1].name, 'south')
86
assert.equal(beforeRequestEvent.request.cookies[1].value.value, 'dosa')
87
})
88
89
ignore(env.browsers(Browser.CHROME, Browser.EDGE)).it('can redirect http equiv', async function () {
90
let beforeRequestEvent = []
91
await network.beforeRequestSent(function (event) {
92
beforeRequestEvent.push(event)
93
})
94
95
await driver.get(Pages.redirectedHttpEquiv)
96
await driver.wait(until.urlContains('redirected.html'), 1000)
97
98
assert.equal(beforeRequestEvent[0].request.method, 'GET')
99
assert(beforeRequestEvent[0].request.url.includes('redirected_http_equiv.html'))
100
assert.equal(beforeRequestEvent[2].request.method, 'GET')
101
assert(beforeRequestEvent[2].request.url.includes('redirected.html'))
102
})
103
104
it('can subscribe to response started', async function () {
105
let onResponseStarted = []
106
await network.responseStarted(function (event) {
107
onResponseStarted.push(event)
108
})
109
110
await driver.get(Pages.emptyText)
111
112
assert.equal(onResponseStarted[0].request.method, 'GET')
113
assert.equal(onResponseStarted[0].request.url, await driver.getCurrentUrl())
114
assert.equal(onResponseStarted[0].response.url, await driver.getCurrentUrl())
115
assert.equal(onResponseStarted[0].response.fromCache, false)
116
assert(onResponseStarted[0].response.mimeType.includes('text/plain'))
117
assert.equal(onResponseStarted[0].response.status, 200)
118
assert.equal(onResponseStarted[0].response.statusText, 'OK')
119
})
120
121
it('test response started mime type', async function () {
122
let onResponseStarted = []
123
await network.responseStarted(function (event) {
124
onResponseStarted.push(event)
125
})
126
127
// Checking mime type for 'html' text
128
await driver.get(Pages.emptyPage)
129
assert.equal(onResponseStarted[0].request.method, 'GET')
130
assert.equal(onResponseStarted[0].request.url, await driver.getCurrentUrl())
131
assert.equal(onResponseStarted[0].response.url, await driver.getCurrentUrl())
132
assert(onResponseStarted[0].response.mimeType.includes('text/html'))
133
134
// Checking mime type for 'plain' text
135
onResponseStarted = []
136
await driver.get(Pages.emptyText)
137
assert.equal(onResponseStarted[0].response.url, await driver.getCurrentUrl())
138
assert(onResponseStarted[0].response.mimeType.includes('text/plain'))
139
})
140
141
it('can subscribe to response completed', async function () {
142
let onResponseCompleted = []
143
await network.responseCompleted(function (event) {
144
onResponseCompleted.push(event)
145
})
146
147
await driver.get(Pages.emptyPage)
148
149
assert.equal(onResponseCompleted[0].request.method, 'GET')
150
assert.equal(onResponseCompleted[0].request.url, await driver.getCurrentUrl())
151
assert.equal(onResponseCompleted[0].response.url, await driver.getCurrentUrl())
152
assert.equal(onResponseCompleted[0].response.fromCache, false)
153
assert(onResponseCompleted[0].response.mimeType.includes('text/html'))
154
assert.equal(onResponseCompleted[0].response.status, 200)
155
assert.equal(onResponseCompleted[0].response.statusText, 'OK')
156
assert.equal(onResponseCompleted[0].redirectCount, 0)
157
})
158
159
ignore(env.browsers(Browser.CHROME, Browser.EDGE)).it('can listen to auth required event', async function () {
160
let authRequiredEvent = null
161
await network.authRequired(function (event) {
162
authRequiredEvent = event
163
})
164
165
await driver.get(Pages.basicAuth)
166
167
const url = authRequiredEvent.request.url
168
assert.equal(authRequiredEvent.id, await driver.getWindowHandle())
169
assert.equal(authRequiredEvent.request.method, 'GET')
170
assert.equal(url.includes('basicAuth'), true)
171
172
assert.equal(authRequiredEvent.response.status, 401)
173
assert.equal(authRequiredEvent.response.headers.length > 1, true)
174
assert.equal(authRequiredEvent.response.url.includes('basicAuth'), true)
175
})
176
177
it('can listen to fetch error event', async function () {
178
let fetchErrorEvent = null
179
await network.fetchError(function (event) {
180
fetchErrorEvent = event
181
})
182
183
try {
184
await driver.get('https://not_a_valid_url.test/')
185
/*eslint no-unused-vars: "off"*/
186
} catch (e) {
187
// ignore
188
}
189
190
const url = fetchErrorEvent.request.url
191
assert.equal(fetchErrorEvent.id, await driver.getWindowHandle())
192
assert.equal(fetchErrorEvent.request.method, 'GET')
193
assert.equal(url.includes('valid_url'), true)
194
assert.equal(fetchErrorEvent.request.headers.length > 1, true)
195
assert.notEqual(fetchErrorEvent.errorText, null)
196
})
197
198
it('test response completed mime type', async function () {
199
let onResponseCompleted = []
200
await network.responseCompleted(function (event) {
201
onResponseCompleted.push(event)
202
})
203
204
// Checking mime type for 'html' text
205
await driver.get(Pages.emptyPage)
206
assert.equal(onResponseCompleted[0].request.method, 'GET')
207
assert.equal(onResponseCompleted[0].request.url, await driver.getCurrentUrl())
208
assert.equal(onResponseCompleted[0].response.url, await driver.getCurrentUrl())
209
assert(onResponseCompleted[0].response.mimeType.includes('text/html'))
210
211
// Checking mime type for 'plain' text
212
onResponseCompleted = []
213
await driver.get(Pages.emptyText)
214
assert.equal(onResponseCompleted[0].response.url, await driver.getCurrentUrl())
215
assert(onResponseCompleted[0].response.mimeType.includes('text/plain'))
216
})
217
})
218
219
describe('setCacheBehavior', function () {
220
it('can set cache behavior to bypass for a context', async function () {
221
await driver.get(Pages.emptyPage)
222
const browsingContext = await BrowsingContext(driver, {
223
type: 'tab',
224
})
225
const contextId = browsingContext.id
226
await network.setCacheBehavior(CacheBehavior.BYPASS, [contextId])
227
})
228
229
it('can set cache behavior to default for a context', async function () {
230
await driver.get(Pages.emptyPage)
231
const browsingContext = await BrowsingContext(driver, {
232
type: 'tab',
233
})
234
const contextId = browsingContext.id
235
await network.setCacheBehavior(CacheBehavior.DEFAULT, [contextId])
236
})
237
238
it('can set cache behavior to default/bypass with no context id', async function () {
239
await driver.get(Pages.emptyPage)
240
await network.setCacheBehavior(CacheBehavior.DEFAULT)
241
await network.setCacheBehavior(CacheBehavior.BYPASS)
242
})
243
244
it('throws error for invalid cache behavior', async function () {
245
await driver.get(Pages.emptyPage)
246
await assert.rejects(
247
async () => await network.setCacheBehavior('invalid'),
248
/Cache behavior must be either "default" or "bypass"/,
249
)
250
})
251
252
it('throws error for invalid context id types', async function () {
253
await driver.get(Pages.emptyPage)
254
await assert.rejects(
255
async () => await network.setCacheBehavior(CacheBehavior.BYPASS, ''),
256
/Contexts must be an array of non-empty strings/,
257
)
258
await assert.rejects(
259
async () => await network.setCacheBehavior(CacheBehavior.BYPASS, ['', ' ']),
260
/Contexts must be an array of non-empty strings/,
261
)
262
})
263
})
264
},
265
{ browsers: [Browser.FIREFOX, Browser.CHROME, Browser.EDGE] },
266
)
267
268