selenium-webdriver 4.28.1 → 4.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGES.md CHANGED
@@ -1,6 +1,20 @@
1
+ ## 4.30.0
2
+
3
+ - [bidi] fix chrome and firefox test for CI RBE (#15405)
4
+ - [cdp] add support for 134 and remove 131
5
+ - [cdp] remove support for v85 since no longer required by Firefox
6
+ - [bidi] implement permissions module commands in JS (#15304)
7
+
8
+ ## 4.29.0
9
+
10
+ - Add CDP for Chrome 133 and remove 130
11
+ - [js] Remove Firefox CDP (#15200)
12
+ - [js][bidi] Implement bidi `setCacheBehavior` command (#15136)
13
+ - [js][bidi] Implement bidi getClientWindows command in browser module (#15248)
14
+
1
15
  ## 4.28.1
2
- --> Bumping version for nightly
3
- --> [JS] specify min required node versiton to 18.20.5
16
+
17
+ - [JS] specify min required node versiton to 18.20.5
4
18
 
5
19
  ## 4.28.0
6
20
 
package/bidi/browser.js CHANGED
@@ -15,6 +15,8 @@
15
15
  // specific language governing permissions and limitations
16
16
  // under the License.
17
17
 
18
+ const { WindowState, ClientWindowInfo } = require('./clientWindowInfo')
19
+
18
20
  /**
19
21
  * Represents the commands and events under Browser Module.
20
22
  * Described in https://w3c.github.io/webdriver-bidi/#module-browser
@@ -83,6 +85,20 @@ class Browser {
83
85
 
84
86
  await this.bidi.send(command)
85
87
  }
88
+
89
+ /**
90
+ * Gets information about all client windows.
91
+ * @returns {Promise<ClientWindowInfo[]>} Array of client window information
92
+ */
93
+ async getClientWindows() {
94
+ const command = {
95
+ method: 'browser.getClientWindows',
96
+ params: {},
97
+ }
98
+
99
+ const response = await this.bidi.send(command)
100
+ return response.result.clientWindows.map((window) => ClientWindowInfo.fromJson(window))
101
+ }
86
102
  }
87
103
 
88
104
  async function getBrowserInstance(driver) {
@@ -92,3 +108,4 @@ async function getBrowserInstance(driver) {
92
108
  }
93
109
 
94
110
  module.exports = getBrowserInstance
111
+ module.exports.WindowState = WindowState
@@ -0,0 +1,54 @@
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
+ const WindowState = Object.freeze({
19
+ FULLSCREEN: 'fullscreen',
20
+ MAXIMIZED: 'maximized',
21
+ MINIMIZED: 'minimized',
22
+ NORMAL: 'normal',
23
+ })
24
+
25
+ class ClientWindowInfo {
26
+ /**
27
+ * @param {Object} params Window information parameters
28
+ * @param {string} params.clientWindow Window identifier
29
+ * @param {string} params.state Window state from WindowState
30
+ * @param {number} params.width Window width
31
+ * @param {number} params.height Window height
32
+ * @param {number} params.x Window x coordinate
33
+ * @param {number} params.y Window y coordinate
34
+ * @param {boolean} params.active Whether window is active and can receive keyboard input
35
+ */
36
+ constructor({ clientWindow, state, width, height, x, y, active }) {
37
+ this.clientWindow = clientWindow
38
+ this.state = state
39
+ this.width = width
40
+ this.height = height
41
+ this.x = x
42
+ this.y = y
43
+ this.active = active
44
+ }
45
+
46
+ static fromJson(json) {
47
+ return new ClientWindowInfo({
48
+ ...json,
49
+ state: json.state.toLowerCase(),
50
+ })
51
+ }
52
+ }
53
+
54
+ module.exports = { WindowState, ClientWindowInfo }
@@ -0,0 +1,73 @@
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
+ const PermissionState = Object.freeze({
19
+ GRANTED: 'granted',
20
+ DENIED: 'denied',
21
+ PROMPT: 'prompt',
22
+ })
23
+
24
+ class Permission {
25
+ constructor(driver) {
26
+ this._driver = driver
27
+ }
28
+
29
+ async init() {
30
+ if (!(await this._driver.getCapabilities()).get('webSocketUrl')) {
31
+ throw Error('WebDriver instance must support BiDi protocol')
32
+ }
33
+
34
+ this.bidi = await this._driver.getBidi()
35
+ }
36
+
37
+ /**
38
+ * Sets a permission state for a given permission descriptor.
39
+ * @param {Object} permissionDescriptor The permission descriptor.
40
+ * @param {string} state The permission state (granted, denied, prompt).
41
+ * @param {string} origin The origin for which the permission is set.
42
+ * @param {string} [userContext] The user context id (optional).
43
+ * @returns {Promise<void>}
44
+ */
45
+ async setPermission(permissionDescriptor, state, origin, userContext = null) {
46
+ if (!Object.values(PermissionState).includes(state)) {
47
+ throw new Error(`Invalid permission state. Must be one of: ${Object.values(PermissionState).join(', ')}`)
48
+ }
49
+
50
+ const command = {
51
+ method: 'permissions.setPermission',
52
+ params: {
53
+ descriptor: permissionDescriptor,
54
+ state: state,
55
+ origin: origin,
56
+ },
57
+ }
58
+
59
+ if (userContext) {
60
+ command.params.userContext = userContext
61
+ }
62
+
63
+ await this.bidi.send(command)
64
+ }
65
+ }
66
+
67
+ async function getPermissionInstance(driver) {
68
+ let instance = new Permission(driver)
69
+ await instance.init()
70
+ return instance
71
+ }
72
+
73
+ module.exports = { getPermissionInstance, PermissionState }
package/bidi/network.js CHANGED
@@ -29,6 +29,11 @@ const NetworkEvent = {
29
29
  FETCH_ERROR: 'network.fetchError',
30
30
  }
31
31
 
32
+ const CacheBehavior = Object.freeze({
33
+ DEFAULT: 'default',
34
+ BYPASS: 'bypass',
35
+ })
36
+
32
37
  /**
33
38
  * Represents all commands and events of Network module.
34
39
  * Described in https://w3c.github.io/webdriver-bidi/#module-network.
@@ -355,6 +360,40 @@ class Network {
355
360
  await this.bidi.send(command)
356
361
  }
357
362
 
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
+
358
397
  /**
359
398
  * Unsubscribes from network events for all browsing contexts.
360
399
  * @returns {Promise<void>} A promise that resolves when the network connection is closed.
@@ -389,4 +428,4 @@ async function getNetworkInstance(driver, browsingContextIds = null) {
389
428
  return instance
390
429
  }
391
430
 
392
- module.exports = getNetworkInstance
431
+ module.exports = { Network: getNetworkInstance, CacheBehavior }
Binary file
Binary file
Binary file
@@ -122,4 +122,4 @@ Z.u=function(a,b,c){var d=A(a);if(!d.documentElement)return null;(t||Hc)&&Ac(d?d
122
122
  null}}try{return d.evaluate(b,a,e,c,null)}catch(n){if("TypeError"===n.name)return e=d.createNSResolver?d.createNSResolver(d.documentElement):Z.I,d.evaluate(b,a,e,c,null);throw n;}}catch(n){if(!Na||"NS_ERROR_ILLEGAL_VALUE"!=n.name)throw new P(32,"Unable to locate an element with the xpath expression "+b+" because of the following error:\n"+n);}};Z.J=function(a,b){if(!a||1!=a.nodeType)throw new P(32,'The result of the xpath expression "'+b+'" is: '+a+". It should be an element.");};
123
123
  Z.s=function(a,b){var c=function(){var d=Z.u(b,a,9);return d?d.singleNodeValue||null:b.selectSingleNode?(d=A(b),d.setProperty&&d.setProperty("SelectionLanguage","XPath"),b.selectSingleNode(a)):null}();null===c||Z.J(c,a);return c};
124
124
  Z.j=function(a,b){var c=function(){var d=Z.u(b,a,7);if(d){for(var e=d.snapshotLength,f=[],g=0;g<e;++g)f.push(d.snapshotItem(g));return f}return b.selectNodes?(d=A(b),d.setProperty&&d.setProperty("SelectionLanguage","XPath"),b.selectNodes(a)):[]}();l(c,function(d){Z.J(d,a)});return c};var td={className:Dc,"class name":Dc,css:Nc,"css selector":Nc,relative:Y,id:qd,linkText:X,"link text":X,name:{s:function(a,b){b=mb(eb(b),"*",null,b);return ua(b,function(c){return Uc(c,"name")==a})},j:function(a,b){b=mb(eb(b),"*",null,b);return pa(b,function(c){return Uc(c,"name")==a})}},partialLinkText:rd,"partial link text":rd,tagName:vd,"tag name":vd,xpath:Z};function sd(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null}
125
- function ud(a,b){var c=sd(a);if(c){var d=td[c];if(d&&ea(d.j))return d.j(a[c],b||Bc.document)}throw new P(61,"Unsupported locator strategy: "+c);};ca("_",ud);; return this._.apply(null,arguments);}).apply({navigator:typeof window!='undefined'?window.navigator:null,document:typeof window!='undefined'?window.document:null}, arguments);};
125
+ function ud(a,b){var c=sd(a);if(c){var d=td[c];if(d&&ea(d.j))return d.j(a[c],b||Bc.document)}throw new P(61,"Unsupported locator strategy: "+c);};ca("se_exportedFunctionSymbol",ud);; return this.se_exportedFunctionSymbol.apply(null,arguments);}).apply(window, arguments);};
@@ -4,4 +4,4 @@ m[51]="invalid selector";m[52]="invalid selector";m[17]="javascript error";m[405
4
4
  a:{var F="",G=function(){var a=p;if(B)return/rv:([^\);]+)(\)|;)/.exec(a);if(A)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(C)return/WebKit\/(\S+)/.exec(a);if(y)return/(?:Version)[ \/]?(\S+)/.exec(a)}();G&&(F=G?G[1]:"");if(z){var H=D();if(null!=H&&H>parseFloat(F)){E=String(H);break a}}E=F}var I;I=d.document&&z?D():void 0;var J=u(),K=w()||t("iPod"),L=t("iPad"),M=t("Android")&&!(v()||u()||t("Opera")||t("Silk")),N=v(),aa=t("Safari")&&!(v()||t("Coast")||t("Opera")||t("Edge")||t("Edg/")||t("OPR")||u()||t("Silk")||t("Android"))&&!(w()||t("iPad")||t("iPod"));function O(a){return(a=a.exec(p))?a[1]:""}(function(){if(J)return O(/Firefox\/([0-9.]+)/);if(z||A||y)return E;if(N)return w()||t("iPad")||t("iPod")?O(/CriOS\/([0-9.]+)/):O(/Chrome\/([0-9.]+)/);if(aa&&!(w()||t("iPad")||t("iPod")))return O(/Version\/([0-9.]+)/);if(K||L){var a=/Version\/(\S+).*Mobile\/(\S+)/.exec(p);if(a)return a[1]+"."+a[2]}else if(M)return(a=O(/Android\s+([0-9.]+)/))?a:O(/Version\/([0-9.]+)/);return""})();var P=z&&!(8<=Number(I)),ba=z&&!(9<=Number(I));var ca={SCRIPT:1,STYLE:1,HEAD:1,IFRAME:1,OBJECT:1},Q={IMG:" ",BR:"\n"};function R(a,b,c){if(!(a.nodeName in ca))if(3==a.nodeType)c?b.push(String(a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in Q)b.push(Q[a.nodeName]);else for(a=a.firstChild;a;)R(a,b,c),a=a.nextSibling};function S(a,b){b=b.toLowerCase();return"style"==b?da(a.style.cssText):P&&"value"==b&&T(a,"INPUT")?a.value:ba&&!0===a[b]?String(a.getAttribute(b)):(a=a.getAttributeNode(b))&&a.specified?a.value:null}var ea=/[;]+(?=(?:(?:[^"]*"){2})*[^"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*\([^()]*\))*[^()]*$)/;
5
5
  function da(a){var b=[];k(a.split(ea),function(c){var e=c.indexOf(":");0<e&&(c=[c.slice(0,e),c.slice(e+1)],2==c.length&&b.push(c[0].toLowerCase(),":",c[1],";"))});b=b.join("");return b=";"==b.charAt(b.length-1)?b:b+";"}function U(a,b){P&&"value"==b&&T(a,"OPTION")&&null===S(a,"value")?(b=[],R(a,b,!1),a=b.join("")):a=a[b];return a}
6
6
  function T(a,b){b&&"string"!==typeof b&&(b=b.toString());return a instanceof HTMLFormElement?!!a&&1==a.nodeType&&(!b||"FORM"==b):!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}function V(a){return T(a,"OPTION")?!0:T(a,"INPUT")?(a=a.type.toLowerCase(),"checkbox"==a||"radio"==a):!1};var fa={"class":"className",readonly:"readOnly"},ha="allowfullscreen allowpaymentrequest allowusermedia async autofocus autoplay checked compact complete controls declare default defaultchecked defaultselected defer disabled ended formnovalidate hidden indeterminate iscontenteditable ismap itemscope loop multiple muted nohref nomodule noresize noshade novalidate nowrap open paused playsinline pubdate readonly required reversed scoped seamless seeking selected truespeed typemustmatch willvalidate".split(" ");function W(a,b){var c=null,e=b.toLowerCase();if("style"==e)return(c=a.style)&&"string"!=typeof c&&(c=c.cssText),c;if(("selected"==e||"checked"==e)&&V(a)){if(!V(a))throw new l(15,"Element is not selectable");b="selected";c=a.type&&a.type.toLowerCase();if("checkbox"==c||"radio"==c)b="checked";return U(a,b)?"true":null}var g=T(a,"A");if(T(a,"IMG")&&"src"==e||g&&"href"==e)return(c=S(a,e))&&(c=U(a,e)),c;if("spellcheck"==e){c=S(a,e);if(null!==c){if("false"==c.toLowerCase())return"false";if("true"==c.toLowerCase())return"true"}return U(a,
7
- e)+""}g=fa[b]||b;if(0<=h(ha,e))return(c=null!==S(a,b)||U(a,g))?"true":null;try{var x=U(a,g)}catch(ia){}(e=null==x)||(e=typeof x,e="object"==e&&null!=x||"function"==e);e?c=S(a,b):c=x;return null!=c?c.toString():null}var X=["_"],Y=d;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===W?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=W;; return this._.apply(null,arguments);}).apply({navigator:typeof window!='undefined'?window.navigator:null,document:typeof window!='undefined'?window.document:null}, arguments);};
7
+ e)+""}g=fa[b]||b;if(0<=h(ha,e))return(c=null!==S(a,b)||U(a,g))?"true":null;try{var x=U(a,g)}catch(ia){}(e=null==x)||(e=typeof x,e="object"==e&&null!=x||"function"==e);e?c=S(a,b):c=x;return null!=c?c.toString():null}var X=["se_exportedFunctionSymbol"],Y=d;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===W?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=W;; return this.se_exportedFunctionSymbol.apply(null,arguments);}).apply(window, arguments);};
@@ -26,4 +26,4 @@ function Oa(a){var b=P(a,"MAP");if(!b&&!P(a,"AREA"))return null;var c=b?a:P(a.pa
26
26
  n&&1==n.nodeType?n:null)d=V(e),b||"default"==a.shape.toLowerCase()||(a=Ra(a),b=Math.min(Math.max(a.a,0),d.width),n=Math.min(Math.max(a.b,0),d.height),d=new R(b+d.a,n+d.b,Math.min(a.width,d.width-b),Math.min(a.height,d.height-n)))}return{image:e,rect:d||new R(0,0,0,0)}}
27
27
  function Ra(a){var b=a.shape.toLowerCase();a=a.coords.split(",");if("rect"==b&&4==a.length){b=a[0];var c=a[1];return new R(b,c,a[2]-b,a[3]-c)}if("circle"==b&&3==a.length)return b=a[2],new R(a[0]-b,a[1]-b,2*b,2*b);if("poly"==b&&2<a.length){b=a[0];c=a[1];for(var e=b,d=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),e=Math.max(e,a[f]),c=Math.min(c,a[f+1]),d=Math.max(d,a[f+1]);return new R(b,c,e-b,d-c)}return new R(0,0,0,0)}function Qa(a){a=V(a);return new Q(a.b,a.a+a.width,a.b+a.height,a.a)}
28
28
  function Pa(a){if(Ia){if("relative"==T(a,"position"))return 1;a=T(a,"filter");return(a=a.match(/^alpha\(opacity=(\d*)\)/)||a.match(/^progid:DXImageTransform.Microsoft.Alpha\(Opacity=(\d*)\)/))?Number(a[1])/100:1}return Sa(a)}function Sa(a){var b=1,c=T(a,"opacity");c&&(b=Number(c));(a=S(a))&&(b*=Sa(a));return b};function Ta(a,b){function c(e){if(P(e)&&"none"==T(e,"display"))return!1;var d;if((d=e.parentNode)&&d.shadowRoot&&void 0!==e.assignedSlot)d=e.assignedSlot?e.assignedSlot.parentNode:null;else if(e.getDestinationInsertionPoints){var f=e.getDestinationInsertionPoints();0<f.length&&(d=f[f.length-1])}if(La&&d instanceof ShadowRoot){if(d.host.shadowRoot&&d.host.shadowRoot!==d)return!1;d=d.host}return!d||9!=d.nodeType&&11!=d.nodeType?d&&P(d,"DETAILS")&&!d.open&&!P(e,"SUMMARY")?!1:!!d&&c(d):!0}return U(a,
29
- !!b,c)}var X=["_"],Y=g;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===Ta?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=Ta;; return this._.apply(null,arguments);}).apply({navigator:typeof window!='undefined'?window.navigator:null,document:typeof window!='undefined'?window.document:null}, arguments);};
29
+ !!b,c)}var X=["se_exportedFunctionSymbol"],Y=g;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===Ta?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=Ta;; return this.se_exportedFunctionSymbol.apply(null,arguments);}).apply(window, arguments);};
package/lib/network.js CHANGED
@@ -15,7 +15,7 @@
15
15
  // specific language governing permissions and limitations
16
16
  // under the License.
17
17
 
18
- const network = require('../bidi/network')
18
+ const { Network: getNetwork } = require('../bidi/network')
19
19
  const { InterceptPhase } = require('../bidi/interceptPhase')
20
20
  const { AddInterceptParameters } = require('../bidi/addInterceptParameters')
21
21
 
@@ -39,7 +39,7 @@ class Network {
39
39
  if (this.#network !== undefined) {
40
40
  return
41
41
  }
42
- this.#network = await network(this.#driver)
42
+ this.#network = await getNetwork(this.#driver)
43
43
 
44
44
  await this.#network.addIntercept(new AddInterceptParameters(InterceptPhase.AUTH_REQUIRED))
45
45
 
package/lib/webdriver.js CHANGED
@@ -1244,9 +1244,7 @@ class WebDriver {
1244
1244
  const caps = await this.getCapabilities()
1245
1245
 
1246
1246
  if (caps['map_'].get('browserName') === 'firefox') {
1247
- console.warn(
1248
- 'CDP support for Firefox is deprecated and will be removed in future versions. Please switch to WebDriver BiDi.',
1249
- )
1247
+ throw new Error('CDP support for Firefox is removed. Please switch to WebDriver BiDi.')
1250
1248
  }
1251
1249
 
1252
1250
  if (process.env.SELENIUM_REMOTE_URL) {
@@ -1255,11 +1253,7 @@ class WebDriver {
1255
1253
  debuggerUrl = `ws://${host}/session/${sessionId}/se/cdp`
1256
1254
  } else {
1257
1255
  const seCdp = caps['map_'].get('se:cdp')
1258
- const vendorInfo =
1259
- caps['map_'].get('goog:chromeOptions') ||
1260
- caps['map_'].get('ms:edgeOptions') ||
1261
- caps['map_'].get('moz:debuggerAddress') ||
1262
- new Map()
1256
+ const vendorInfo = caps['map_'].get('goog:chromeOptions') || caps['map_'].get('ms:edgeOptions') || new Map()
1263
1257
  debuggerUrl = seCdp || vendorInfo['debuggerAddress'] || vendorInfo
1264
1258
  }
1265
1259
  this._wsUrl = await this.getWsUrl(debuggerUrl, target, caps)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "selenium-webdriver",
3
- "version": "4.28.1",
3
+ "version": "4.30.0",
4
4
  "description": "The official WebDriver JavaScript bindings from the Selenium project",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [