selenium-webdriver 4.9.1 → 4.10.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,3 +1,22 @@
1
+ ## v4.10.0
2
+
3
+ #### :nail_care: Polish
4
+
5
+ * Adding CDP v114 and removing v111
6
+
7
+ #### :rocket: New Feature
8
+
9
+ * [Edge] Support webview2 (#11978)
10
+ * [BiDi] Add Script module commands to add/remove preloaded scripts (#11847)
11
+ * [BiDi] Add printPage command (#12124)
12
+ * Add support for proxies with Selenium Manager
13
+
14
+ ## v4.9.2
15
+
16
+ #### :nail_care: Polish
17
+
18
+ * Handle rejection of the driver if not found
19
+
1
20
  ## v4.9.1
2
21
 
3
22
  #### :nail_care: Polish
@@ -76,7 +95,7 @@ fix: iedriver download with selenium-manager #11579
76
95
 
77
96
  #### Committers: 1
78
97
 
79
- - Potapov Dmitriy ([@potapovDim](https://github.com/potapovDim))
98
+ * Potapov Dmitriy ([@potapovDim](https://github.com/potapovDim))
80
99
 
81
100
  ## v4.7.0
82
101
 
@@ -97,7 +116,7 @@ fix: iedriver download with selenium-manager #11579
97
116
 
98
117
  #### :nail_care: Polish
99
118
 
100
- * Fix typos (#11258)
119
+ * Fix typos (#11258)
101
120
 
102
121
  ## v4.6.0
103
122
 
@@ -152,11 +171,12 @@ fix: iedriver download with selenium-manager #11579
152
171
  * destructuring exports
153
172
  * Moving from static to const to make js-dossier happy
154
173
  * Removing circular dependency Between webdriver.js and http.js
155
- * fix some typos in code and documentation
174
+ * fix some typos in code and documentation
156
175
  * add cdp v105 remove v102
157
176
  * add cdp v106 remove v103
158
177
 
159
178
  ## v4.4.0
179
+
160
180
  * Add support CDP 104 and remove CDP 101
161
181
 
162
182
  ## v4.3.1
@@ -1287,4 +1307,3 @@ major version release (i.e. 1.0.0).
1287
1307
  * Initial release for npm:
1288
1308
 
1289
1309
  npm install selenium-webdriver
1290
-
@@ -129,6 +129,42 @@ class BrowsingContext {
129
129
  }
130
130
  await this.bidi.send(params)
131
131
  }
132
+
133
+ /**
134
+ * Prints PDF of the webpage
135
+ * @param options print options given by the user
136
+ * @returns PrintResult object
137
+ */
138
+ async printPage(options = {}) {
139
+ let params = {
140
+ method: 'browsingContext.print',
141
+ // Setting default values for parameters
142
+ params: {
143
+ context: this._id,
144
+ background: false,
145
+ margin: {
146
+ bottom: 1.0,
147
+ left: 1.0,
148
+ right: 1.0,
149
+ top: 1.0,
150
+ },
151
+ orientation: 'portrait',
152
+ page: {
153
+ height: 27.94,
154
+ width: 21.59,
155
+ },
156
+ pageRanges: [],
157
+ scale: 1.0,
158
+ shrinkToFit: true,
159
+ },
160
+ }
161
+
162
+ // Updating parameter values based on the options passed
163
+ params.params = this._driver.validatePrintPageParams(options, params.params)
164
+
165
+ const response = await this.bidi.send(params)
166
+ return new PrintResult(response.result.data)
167
+ }
132
168
  }
133
169
 
134
170
  class NavigateResult {
@@ -146,6 +182,16 @@ class NavigateResult {
146
182
  }
147
183
  }
148
184
 
185
+ class PrintResult {
186
+ constructor(data) {
187
+ this._data = data
188
+ }
189
+
190
+ get data() {
191
+ return this._data
192
+ }
193
+ }
194
+
149
195
  /**
150
196
  * initiate browsing context instance and return
151
197
  * @param driver
@@ -23,6 +23,7 @@ const {
23
23
  } = require('./evaluateResult')
24
24
  const { RealmInfo } = require('./realmInfo')
25
25
  const { RemoteValue } = require('./protocolValue')
26
+ const { WebDriverError } = require('../lib/error')
26
27
 
27
28
  class ScriptManager {
28
29
  constructor(driver) {
@@ -179,6 +180,39 @@ class ScriptManager {
179
180
  return this.createEvaluateResult(response)
180
181
  }
181
182
 
183
+ async addPreloadScript(
184
+ functionDeclaration,
185
+ argumentValueList = null,
186
+ sandbox = null
187
+ ) {
188
+ const params = {
189
+ functionDeclaration: functionDeclaration,
190
+ arguments: argumentValueList,
191
+ sandbox: sandbox,
192
+ }
193
+
194
+ const command = {
195
+ method: 'script.addPreloadScript',
196
+ params,
197
+ }
198
+
199
+ let response = await this.bidi.send(command)
200
+ return response.result.script
201
+ }
202
+
203
+ async removePreloadScript(script) {
204
+ const params = { script: script }
205
+ const command = {
206
+ method: 'script.removePreloadScript',
207
+ params,
208
+ }
209
+ let response = await this.bidi.send(command)
210
+ if ('error' in response) {
211
+ throw new WebDriverError(response.error)
212
+ }
213
+ return response.result
214
+ }
215
+
182
216
  getCallFunctionParams(
183
217
  targetType,
184
218
  id,
Binary file
Binary file
Binary file
@@ -32,11 +32,11 @@ function getPath(service, capabilities) {
32
32
  try {
33
33
  return pathExists(service.getExecutable()) || driverLocation(capabilities)
34
34
  } catch (e) {
35
- throw Error(
36
- `Unable to obtain browser driver.
35
+ throw Error(
36
+ `Unable to obtain browser driver.
37
37
  For more information on how to install drivers see
38
38
  https://www.selenium.dev/documentation/webdriver/getting_started/install_drivers/. ${e}`
39
- )
39
+ )
40
40
  }
41
41
  }
42
42
 
@@ -47,12 +47,7 @@ function getBinary() {
47
47
  const file =
48
48
  directory === 'windows' ? 'selenium-manager.exe' : 'selenium-manager'
49
49
 
50
- let seleniumManagerBasePath
51
- if (process.env.SELENIUM_MANAGER_BASE_PATH) {
52
- seleniumManagerBasePath = process.env.SELENIUM_MANAGER_BASE_PATH
53
- } else {
54
- seleniumManagerBasePath = path.join(__dirname, '..', '/bin')
55
- }
50
+ let seleniumManagerBasePath = path.join(__dirname, '..', '/bin')
56
51
 
57
52
  const filePath = path.join(seleniumManagerBasePath, directory, file)
58
53
 
@@ -76,16 +71,38 @@ function driverLocation(options) {
76
71
  )
77
72
  }
78
73
 
74
+ console.debug(
75
+ 'Applicable driver not found; attempting to install with Selenium Manager (Beta)'
76
+ )
77
+
79
78
  let args = ['--browser', options.getBrowserName(), '--output', 'json']
80
79
 
81
- if (options.getBrowserVersion() && options.getBrowserVersion() !== "") {
82
- args.push("--browser-version", options.getBrowserVersion())
80
+ if (options.getBrowserVersion() && options.getBrowserVersion() !== '') {
81
+ args.push('--browser-version', options.getBrowserVersion())
82
+ }
83
+
84
+ const vendorOptions =
85
+ options.get('goog:chromeOptions') ||
86
+ options.get('ms:edgeOptions') ||
87
+ options.get('moz:firefoxOptions')
88
+ if (vendorOptions && vendorOptions.binary && vendorOptions.binary !== '') {
89
+ args.push('--browser-path', '"' + vendorOptions.binary + '"')
83
90
  }
84
91
 
85
- const vendorOptions = options.get('goog:chromeOptions') || options.get('ms:edgeOptions')
86
- || options.get('moz:firefoxOptions')
87
- if (vendorOptions && vendorOptions.binary && vendorOptions.binary !== "") {
88
- args.push("--browser-path", '"' + vendorOptions.binary + '"')
92
+ const proxyOptions = options.getProxy();
93
+
94
+ // Check if proxyOptions exists and has properties
95
+ if (proxyOptions && Object.keys(proxyOptions).length > 0) {
96
+ const httpProxy = proxyOptions['httpProxy'];
97
+ const sslProxy = proxyOptions['sslProxy'];
98
+
99
+ if (httpProxy !== undefined) {
100
+ args.push('--proxy', httpProxy);
101
+ }
102
+
103
+ else if (sslProxy !== undefined) {
104
+ args.push('--proxy', sslProxy);
105
+ }
89
106
  }
90
107
 
91
108
  const smBinary = getBinary()
@@ -104,15 +121,18 @@ function driverLocation(options) {
104
121
  errorMessage = e.toString()
105
122
  }
106
123
  }
107
- throw new Error(`Error executing command for ${smBinary} with ${args}: ${errorMessage}`)
124
+ throw new Error(
125
+ `Error executing command for ${smBinary} with ${args}: ${errorMessage}`
126
+ )
108
127
  }
109
128
  try {
110
129
  output = JSON.parse(spawnResult.stdout.toString())
111
130
  } catch (e) {
112
- throw new Error(`Error executing command for ${smBinary} with ${args}: ${e.toString()}`)
131
+ throw new Error(
132
+ `Error executing command for ${smBinary} with ${args}: ${e.toString()}`
133
+ )
113
134
  }
114
135
 
115
-
116
136
  for (const key in output.logs) {
117
137
  if (output.logs[key].level === 'WARN') {
118
138
  console.warn(`${output.logs[key].message}`)
package/edge.js CHANGED
@@ -127,6 +127,19 @@ class Options extends chromium.Options {
127
127
  setEdgeChromiumBinaryPath(path) {
128
128
  return this.setBinaryPath(path)
129
129
  }
130
+
131
+ /**
132
+ * Changes the browser name to 'webview2' to enable
133
+ * <a href="https://learn.microsoft.com/en-us/microsoft-edge/webview2/how-to/webdriver">
134
+ * test automation of WebView2 apps with Microsoft Edge WebDriver
135
+ * </a>
136
+ *
137
+ * @param {boolean} enable flag to enable or disable the 'webview2' usage
138
+ */
139
+ useWebView(enable) {
140
+ const browserName = enable ? 'webview2' : Browser.EDGE
141
+ return this.setBrowserName(browserName)
142
+ }
130
143
  }
131
144
 
132
145
  /**
package/io/exec.js CHANGED
@@ -134,12 +134,16 @@ function exec(command, opt_options) {
134
134
  proc.unref()
135
135
  process.once('exit', onProcessExit)
136
136
 
137
- const result = new Promise((resolve) => {
137
+ const result = new Promise((resolve, reject) => {
138
138
  proc.once('exit', (code, signal) => {
139
139
  proc = null
140
140
  process.removeListener('exit', onProcessExit)
141
141
  resolve(new Result(code, signal))
142
142
  })
143
+
144
+ proc.once('error', (err) => {
145
+ reject(err)
146
+ })
143
147
  })
144
148
  return new Command(result, killCommand)
145
149
 
@@ -114,10 +114,9 @@ function nd(a,b,c,d){a=a.nodeValue.replace(/[\u200b\u200e\u200f]/g,"");a=a.repla
114
114
  function pd(a,b,c,d,e){if(3==a.nodeType&&c)nd(a,b,d,e);else if(S(a))if(S(a,"CONTENT")||S(a,"SLOT")){for(var f=a;f.parentNode;)f=f.parentNode;f instanceof ShadowRoot?(a=S(a,"CONTENT")?a.getDistributedNodes():a.assignedNodes(),l(a,function(g){pd(g,b,c,d,e)})):jd(a,b)}else if(S(a,"SHADOW")){for(f=a;f.parentNode;)f=f.parentNode;if(f instanceof ShadowRoot&&(a=f))for(a=a.olderShadowRoot;a;)l(a.childNodes,function(g){pd(g,b,c,d,e)}),a=a.olderShadowRoot}else jd(a,b)}
115
115
  function jd(a,b){a.shadowRoot&&l(a.shadowRoot.childNodes,function(c){pd(c,b,!0,null,null)});ld(a,b,function(c,d,e,f,g){var h=null;1==c.nodeType?h=c:3==c.nodeType&&(h=c);null!=h&&(null!=h.assignedSlot||h.getDestinationInsertionPoints&&0<h.getDestinationInsertionPoints().length)||pd(c,d,e,f,g)})};var qd={C:function(a,b){return!(!a.querySelectorAll||!a.querySelector)&&!/^\d.*/.test(b)},o:function(a,b){var c=eb(b),d="string"===typeof a?c.a.getElementById(a):a;return d?Uc(d,"id")==a&&b!=d&&hb(b,d)?d:ua(mb(c,"*"),function(e){return Uc(e,"id")==a&&b!=e&&hb(b,e)}):null},j:function(a,b){if(!a)return[];if(qd.C(b,a))try{return b.querySelectorAll("#"+qd.T(a))}catch(c){return[]}b=mb(eb(b),"*",null,b);return pa(b,function(c){return Uc(c,"id")==a})},T:function(a){return a.replace(/([\s'"\\#.:;,!?+<>=~*^$|%&@`{}\-\/\[\]\(\)])/g,
116
116
  "\\$1")}};var Y={},rd={};Y.N=function(a,b,c){try{var d=Nc.j("a",b)}catch(e){d=mb(eb(b),"A",null,b)}return ua(d,function(e){e=id(e);e=e.replace(/^[\s]+|[\s]+$/g,"");return c&&-1!=e.indexOf(a)||e==a})};Y.K=function(a,b,c){try{var d=Nc.j("a",b)}catch(e){d=mb(eb(b),"A",null,b)}return pa(d,function(e){e=id(e);e=e.replace(/^[\s]+|[\s]+$/g,"");return c&&-1!=e.indexOf(a)||e==a})};Y.o=function(a,b){return Y.N(a,b,!1)};Y.j=function(a,b){return Y.K(a,b,!1)};rd.o=function(a,b){return Y.N(a,b,!0)};
117
- rd.j=function(a,b){return Y.K(a,b,!0)};var Z={F:function(a,b){return function(c){var d=Z.u(a);d=W(d);c=W(c);return b.call(null,d,c)}},R:function(a){return Z.F(a,function(b,c){return c.b+c.height<b.b})},S:function(a){return Z.F(a,function(b,c){return b.b+b.height<c.b})},V:function(a){return Z.F(a,function(b,c){return c.a+c.width<b.a})},aa:function(a){return Z.F(a,function(b,c){return b.a+b.width<c.a})},W:function(a,b){var c;b?c=b:"number"==typeof a.distance&&(c=a.distance);c||(c=100);return function(d){var e=Z.u(a);if(e===d)return!1;e=
118
- W(e);d=W(d);var f=Math.abs(e.a+e.width-d.a),g=Math.abs(e.b+e.height-d.b);g=Math.abs(e.b-(d.b+d.height))<=c||g<=c;return(Math.abs(e.a-(d.a+d.width))<=c||f<=c)&&g?!0:Math.sqrt(Math.pow(Math.abs(e.a+e.width/2-(d.a+d.width/2)),2)+Math.pow(Math.abs(e.b+e.height/2-(d.b+d.height/2)),2))<=c}},u:function(a){if(ha(a)&&1==a.nodeType)return a;if(ea(a))return Z.u(a.call(null));if(ha(a)){var b;a:{if(b=sd(a)){var c=td[b];if(c&&ea(c.o)){b=c.o(a[b],Bc.document);break a}}throw new P(61,"Unsupported locator strategy: "+
119
- b);}if(!b)throw new P(7,"No element has been found by "+JSON.stringify(a));return b}throw new P(61,"Selector is of wrong type: "+JSON.stringify(a));}};Z.P={left:Z.V,right:Z.aa,above:Z.R,below:Z.S,near:Z.W};Z.O={left:Z.u,right:Z.u,above:Z.u,below:Z.u,near:Z.u};
120
- Z.U=function(a,b){var c=[];l(a,function(e){e&&ta(b,function(f){var g=f.kind,h=Z.P[g];if(!h)throw new P(61,"Cannot find filter suitable for "+g);return h.apply(null,f.args)(e)},null)&&c.push(e)},null);a=b[b.length-1];var d=Z.O[a?a.kind:"unknown"];return d?(a=d.apply(null,a.args))?Z.ba(a,c):c:c};
117
+ rd.j=function(a,b){return Y.K(a,b,!0)};var Z={F:function(a,b){return function(c){var d=Z.u(a);d=W(d);c=W(c);return b.call(null,d,c)}},R:function(a){return Z.F(a,function(b,c){return c.b+c.height<b.b})},S:function(a){return Z.F(a,function(b,c){return b.b+b.height<c.b})},V:function(a){return Z.F(a,function(b,c){return c.a+c.width<b.a})},aa:function(a){return Z.F(a,function(b,c){return b.a+b.width<c.a})},W:function(a,b){var c;b?c=b:"number"==typeof a.distance&&(c=a.distance);c||(c=50);return function(d){var e=Z.u(a);if(e===d)return!1;e=W(e);
118
+ d=W(d);e=new U(e.a-c,e.b-c,e.width+2*c,e.height+2*c);return e.a<=d.a+d.width&&d.a<=e.a+e.width&&e.b<=d.b+d.height&&d.b<=e.b+e.height}},u:function(a){if(ha(a)&&1==a.nodeType)return a;if(ea(a))return Z.u(a.call(null));if(ha(a)){var b;a:{if(b=sd(a)){var c=td[b];if(c&&ea(c.o)){b=c.o(a[b],Bc.document);break a}}throw new P(61,"Unsupported locator strategy: "+b);}if(!b)throw new P(7,"No element has been found by "+JSON.stringify(a));return b}throw new P(61,"Selector is of wrong type: "+JSON.stringify(a));
119
+ }};Z.P={left:Z.V,right:Z.aa,above:Z.R,below:Z.S,near:Z.W};Z.O={left:Z.u,right:Z.u,above:Z.u,below:Z.u,near:Z.u};Z.U=function(a,b){var c=[];l(a,function(e){e&&ta(b,function(f){var g=f.kind,h=Z.P[g];if(!h)throw new P(61,"Cannot find filter suitable for "+g);return h.apply(null,f.args)(e)},null)&&c.push(e)},null);a=b[b.length-1];var d=Z.O[a?a.kind:"unknown"];return d?(a=d.apply(null,a.args))?Z.ba(a,c):c:c};
121
120
  Z.ba=function(a,b){function c(f){f=W(f);return Math.sqrt(Math.pow(d-(f.a+Math.max(1,f.width)/2),2)+Math.pow(e-(f.b+Math.max(1,f.height)/2),2))}a=W(a);var d=a.a+Math.max(1,a.width)/2,e=a.b+Math.max(1,a.height)/2;xa(b,function(f,g){return c(f)-c(g)});return b};Z.o=function(a,b){a=Z.j(a,b);return 0==a.length?null:a[0]};
122
121
  Z.j=function(a,b){if(!a.hasOwnProperty("root")||!a.hasOwnProperty("filters"))throw new P(61,"Locator not suitable for relative locators: "+JSON.stringify(a));var c=a.filters,d=da(c);if("array"!=d&&("object"!=d||"number"!=typeof c.length))throw new P(61,"Targets should be an array: "+JSON.stringify(a));var e;S(a.root)?e=[a.root]:e=ud(a.root,b);return 0==e.length?[]:Z.U(e,a.filters)};var vd={o:function(a,b){if(""===a)throw new P(32,'Unable to locate an element with the tagName ""');return b.getElementsByTagName(a)[0]||null},j:function(a,b){if(""===a)throw new P(32,'Unable to locate an element with the tagName ""');return b.getElementsByTagName(a)}};var td={className:Dc,"class name":Dc,css:Nc,"css selector":Nc,relative:Z,id:qd,linkText:Y,"link text":Y,name:{o: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:T};function sd(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null}
123
122
  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);};
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
-
2
1
  {
3
2
  "name": "selenium-webdriver",
4
- "version": "4.9.1",
3
+ "version": "4.10.0",
5
4
  "description": "The official WebDriver JavaScript bindings from the Selenium project",
6
5
  "license": "Apache-2.0",
7
6
  "keywords": [
@@ -29,7 +28,7 @@
29
28
  "ws": ">=8.13.0"
30
29
  },
31
30
  "devDependencies": {
32
- "eslint": "^8.37.0",
31
+ "eslint": "^8.41.0",
33
32
  "eslint-config-prettier": "^8.8.0",
34
33
  "eslint-plugin-no-only-tests": "^3.1.0",
35
34
  "eslint-plugin-node": "^11.1.0",
@@ -37,9 +36,9 @@
37
36
  "express": "^4.18.2",
38
37
  "mocha": "^10.2.0",
39
38
  "multer": "^1.4.5-lts.1",
40
- "prettier": "^2.8.7",
39
+ "prettier": "^2.8.8",
41
40
  "serve-index": "^1.9.1",
42
- "sinon": "^15.0.3"
41
+ "sinon": "^15.1.0"
43
42
  },
44
43
  "scripts": {
45
44
  "lint": "eslint --ignore-pattern node_modules --ignore-pattern generator --ext js lib/http.js \"**/*.js\"",