Skip to content

Commit 552c80c

Browse files
navin772harsha509pujagani
authored
[js][bidi]: implement bidi setCacheBehavior command (#15136)
* implement js bidi command `setCacheBehavior` * add bidi tests for `setCacheBehavior` * updated tests * add input validation for context IDs * use enum like structure (CacheBehavior) * use named import in other network test files * fix lib/network.js --------- Co-authored-by: Sri Harsha <12621691+harsha509@users.noreply.github.com> Co-authored-by: Puja Jagani <puja.jagani93@gmail.com>
1 parent 73607ee commit 552c80c

File tree

5 files changed

+92
-6
lines changed

5 files changed

+92
-6
lines changed

javascript/node/selenium-webdriver/bidi/network.js

+40-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ const NetworkEvent = {
2929
FETCH_ERROR: 'network.fetchError',
3030
}
3131

32+
const CacheBehavior = Object.freeze({
33+
DEFAULT: 'default',
34+
BYPASS: 'bypass',
35+
})
36+
3237
/**
3338
* Represents all commands and events of Network module.
3439
* Described in https://w3c.github.io/webdriver-bidi/#module-network.
@@ -355,6 +360,40 @@ class Network {
355360
await this.bidi.send(command)
356361
}
357362

363+
/**
364+
* Sets the cache behavior for network requests.
365+
*
366+
* @param {string} behavior - The cache behavior ("default" or "bypass")
367+
* @param {Array<string>} [contexts] - Optional array of browsing context IDs
368+
* @returns {Promise<void>} A promise that resolves when the cache behavior is set
369+
* @throws {Error} If behavior is invalid or context IDs are invalid
370+
*/
371+
async setCacheBehavior(behavior, contexts = null) {
372+
if (!Object.values(CacheBehavior).includes(behavior)) {
373+
throw new Error(`Cache behavior must be either "${CacheBehavior.DEFAULT}" or "${CacheBehavior.BYPASS}"`)
374+
}
375+
376+
const command = {
377+
method: 'network.setCacheBehavior',
378+
params: {
379+
cacheBehavior: behavior,
380+
},
381+
}
382+
383+
if (contexts !== null) {
384+
if (
385+
!Array.isArray(contexts) ||
386+
contexts.length === 0 ||
387+
contexts.some((c) => typeof c !== 'string' || c.trim() === '')
388+
) {
389+
throw new Error('Contexts must be an array of non-empty strings')
390+
}
391+
command.params.contexts = contexts
392+
}
393+
394+
await this.bidi.send(command)
395+
}
396+
358397
/**
359398
* Unsubscribes from network events for all browsing contexts.
360399
* @returns {Promise<void>} A promise that resolves when the network connection is closed.
@@ -389,4 +428,4 @@ async function getNetworkInstance(driver, browsingContextIds = null) {
389428
return instance
390429
}
391430

392-
module.exports = getNetworkInstance
431+
module.exports = { Network: getNetworkInstance, CacheBehavior }

javascript/node/selenium-webdriver/lib/network.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18-
const network = require('../bidi/network')
18+
const { Network: getNetwork } = require('../bidi/network')
1919
const { InterceptPhase } = require('../bidi/interceptPhase')
2020
const { AddInterceptParameters } = require('../bidi/addInterceptParameters')
2121

@@ -39,7 +39,7 @@ class Network {
3939
if (this.#network !== undefined) {
4040
return
4141
}
42-
this.#network = await network(this.#driver)
42+
this.#network = await getNetwork(this.#driver)
4343

4444
await this.#network.addIntercept(new AddInterceptParameters(InterceptPhase.AUTH_REQUIRED))
4545

javascript/node/selenium-webdriver/test/bidi/add_intercept_parameters_test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
const assert = require('node:assert')
2121
const { Browser } = require('selenium-webdriver')
2222
const { suite } = require('../../lib/test')
23-
const Network = require('selenium-webdriver/bidi/network')
23+
const { Network } = require('selenium-webdriver/bidi/network')
2424
const { AddInterceptParameters } = require('selenium-webdriver/bidi/addInterceptParameters')
2525
const { InterceptPhase } = require('selenium-webdriver/bidi/interceptPhase')
2626
const { UrlPattern } = require('selenium-webdriver/bidi/urlPattern')

javascript/node/selenium-webdriver/test/bidi/network_commands_test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
const assert = require('node:assert')
2121
const { Browser, By } = require('selenium-webdriver')
2222
const { Pages, suite } = require('../../lib/test')
23-
const Network = require('selenium-webdriver/bidi/network')
23+
const { Network } = require('selenium-webdriver/bidi/network')
2424
const { AddInterceptParameters } = require('selenium-webdriver/bidi/addInterceptParameters')
2525
const { InterceptPhase } = require('selenium-webdriver/bidi/interceptPhase')
2626
const { until } = require('selenium-webdriver/index')

javascript/node/selenium-webdriver/test/bidi/network_test.js

+48-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
const assert = require('node:assert')
2121
const { Browser } = require('selenium-webdriver')
2222
const { Pages, suite, ignore } = require('../../lib/test')
23-
const Network = require('selenium-webdriver/bidi/network')
23+
const { Network, CacheBehavior } = require('selenium-webdriver/bidi/network')
24+
const BrowsingContext = require('selenium-webdriver/bidi/browsingContext')
2425
const until = require('selenium-webdriver/lib/until')
2526

2627
suite(
@@ -212,6 +213,52 @@ suite(
212213
assert(onResponseCompleted[0].response.mimeType.includes('text/plain'))
213214
})
214215
})
216+
217+
describe('setCacheBehavior', function () {
218+
it('can set cache behavior to bypass for a context', async function () {
219+
await driver.get(Pages.emptyPage)
220+
const browsingContext = await BrowsingContext(driver, {
221+
type: 'tab',
222+
})
223+
const contextId = browsingContext.id
224+
await network.setCacheBehavior(CacheBehavior.BYPASS, [contextId])
225+
})
226+
227+
it('can set cache behavior to default for a context', async function () {
228+
await driver.get(Pages.emptyPage)
229+
const browsingContext = await BrowsingContext(driver, {
230+
type: 'tab',
231+
})
232+
const contextId = browsingContext.id
233+
await network.setCacheBehavior(CacheBehavior.DEFAULT, [contextId])
234+
})
235+
236+
it('can set cache behavior to default/bypass with no context id', async function () {
237+
await driver.get(Pages.emptyPage)
238+
await network.setCacheBehavior(CacheBehavior.DEFAULT)
239+
await network.setCacheBehavior(CacheBehavior.BYPASS)
240+
})
241+
242+
it('throws error for invalid cache behavior', async function () {
243+
await driver.get(Pages.emptyPage)
244+
await assert.rejects(
245+
async () => await network.setCacheBehavior('invalid'),
246+
/Cache behavior must be either "default" or "bypass"/,
247+
)
248+
})
249+
250+
it('throws error for invalid context id types', async function () {
251+
await driver.get(Pages.emptyPage)
252+
await assert.rejects(
253+
async () => await network.setCacheBehavior(CacheBehavior.BYPASS, ''),
254+
/Contexts must be an array of non-empty strings/,
255+
)
256+
await assert.rejects(
257+
async () => await network.setCacheBehavior(CacheBehavior.BYPASS, ['', ' ']),
258+
/Contexts must be an array of non-empty strings/,
259+
)
260+
})
261+
})
215262
},
216263
{ browsers: [Browser.FIREFOX, Browser.CHROME, Browser.EDGE] },
217264
)

0 commit comments

Comments
 (0)