Skip to content

Commit 7a18a86

Browse files
pujaganiharsha509
andauthored
[bidi][js] Add high-level script command (#14293)
* [bidi][js] Add high-level script command * Fix formatting * Fix tests * Fix linting --------- Co-authored-by: Sri Harsha <[email protected]>
1 parent 1167e3d commit 7a18a86

File tree

5 files changed

+417
-7
lines changed

5 files changed

+417
-7
lines changed

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

Lines changed: 84 additions & 2 deletions
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 { PrimitiveType, NonPrimitiveType, RemoteType } = require('./protocolType')
18+
const { PrimitiveType, NonPrimitiveType, RemoteType, SpecialNumberType } = require('./protocolType')
1919

2020
const TYPE_CONSTANT = 'type'
2121
const VALUE_CONSTANT = 'value'
@@ -189,6 +189,88 @@ class LocalValue {
189189
return new ReferenceValue(handle, sharedId)
190190
}
191191

192+
static getArgument(argument) {
193+
let localValue = null
194+
195+
if (
196+
argument === SpecialNumberType.NAN ||
197+
argument === SpecialNumberType.MINUS_ZERO ||
198+
argument === SpecialNumberType.INFINITY ||
199+
argument === SpecialNumberType.MINUS_INFINITY
200+
) {
201+
localValue = LocalValue.createSpecialNumberValue(argument)
202+
return localValue
203+
}
204+
205+
const type = typeof argument
206+
207+
switch (type) {
208+
case PrimitiveType.STRING:
209+
localValue = LocalValue.createStringValue(argument)
210+
break
211+
case PrimitiveType.NUMBER:
212+
localValue = LocalValue.createNumberValue(argument)
213+
break
214+
case PrimitiveType.BOOLEAN:
215+
localValue = LocalValue.createBooleanValue(argument)
216+
break
217+
case PrimitiveType.BIGINT:
218+
localValue = LocalValue.createBigIntValue(argument.toString())
219+
break
220+
case PrimitiveType.UNDEFINED:
221+
localValue = LocalValue.createUndefinedValue()
222+
break
223+
case NonPrimitiveType.OBJECT:
224+
if (argument === null) {
225+
localValue = LocalValue.createNullValue()
226+
break
227+
}
228+
if (argument instanceof Date) {
229+
localValue = LocalValue.createDateValue(argument)
230+
} else if (argument instanceof Map) {
231+
const map = []
232+
233+
argument.forEach((value, key) => {
234+
let objectKey
235+
if (typeof key === 'string') {
236+
objectKey = key
237+
} else {
238+
objectKey = LocalValue.getArgument(key)
239+
}
240+
const objectValue = LocalValue.getArgument(value)
241+
map.push([objectKey, objectValue])
242+
})
243+
localValue = new LocalValue(NonPrimitiveType.MAP, map)
244+
} else if (argument instanceof Set) {
245+
const set = []
246+
argument.forEach((value) => {
247+
set.push(LocalValue.getArgument(value))
248+
})
249+
localValue = LocalValue.createSetValue(set)
250+
} else if (argument instanceof Array) {
251+
const arr = []
252+
argument.forEach((value) => {
253+
arr.push(LocalValue.getArgument(value))
254+
})
255+
localValue = LocalValue.createArrayValue(arr)
256+
} else if (argument instanceof RegExp) {
257+
localValue = LocalValue.createRegularExpressionValue({
258+
pattern: argument.source,
259+
flags: argument.flags,
260+
})
261+
} else {
262+
let value = []
263+
Object.entries(argument).forEach((entry) => {
264+
value.push([LocalValue.getArgument(entry[0]), LocalValue.getArgument(entry[1])])
265+
})
266+
localValue = new LocalValue(NonPrimitiveType.OBJECT, value)
267+
}
268+
break
269+
}
270+
271+
return localValue
272+
}
273+
192274
asMap() {
193275
let toReturn = {}
194276
toReturn[TYPE_CONSTANT] = this.type
@@ -246,7 +328,7 @@ class RemoteValue {
246328
}
247329

248330
deserializeValue(value, type) {
249-
if ([NonPrimitiveType.MAP, NonPrimitiveType.OBJECT].includes(type)) {
331+
if (type === NonPrimitiveType.OBJECT) {
250332
return Object.fromEntries(value)
251333
} else if (type === NonPrimitiveType.REGULAR_EXPRESSION) {
252334
return new RegExpValue(value.pattern, value.flags)

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,22 @@ class Script {
121121
await this.#initScript()
122122
await this.#script.removePreloadScript(id)
123123
}
124+
125+
async execute(script, ...args) {
126+
await this.#initScript()
127+
128+
const browsingContextId = await this.#driver.getWindowHandle()
129+
130+
const argumentList = []
131+
132+
args.forEach((arg) => {
133+
argumentList.push(LocalValue.getArgument(arg))
134+
})
135+
136+
const response = await this.#script.callFunctionInBrowsingContext(browsingContextId, script, true, argumentList)
137+
138+
return response.result
139+
}
124140
}
125141

126142
module.exports = Script

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -350,9 +350,9 @@ suite(
350350

351351
let resultValue = result.result.value
352352

353-
assert.equal(Object.keys(resultValue).length, 1)
354-
assert.equal(resultValue['foobar'].type, 'string')
355-
assert.equal(resultValue['foobar'].value, 'foobar')
353+
assert.equal(resultValue[0][0], 'foobar')
354+
assert.equal(resultValue[0][1].type, 'string')
355+
assert.equal(resultValue[0][1].value, 'foobar')
356356
})
357357

358358
it('can call function with object argument', async function () {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,10 @@ suite(
201201
assert.equal(response.resultType, EvaluateResultType.SUCCESS)
202202
assert.equal(response.result.type, 'map')
203203

204-
const sharedId = response.result.value.sharedId
204+
const value = response.result.value[0]
205205

206-
assert.strictEqual(sharedId.value, nodeId)
206+
assert.strictEqual(value[1].type, 'string')
207+
assert.strictEqual(value[1].value, nodeId)
207208
})
208209

209210
it('can find element', async function () {

0 commit comments

Comments
 (0)