Path: blob/trunk/javascript/selenium-webdriver/test/bidi/local_value_test.js
2887 views
// Licensed to the Software Freedom Conservancy (SFC) under one1// or more contributor license agreements. See the NOTICE file2// distributed with this work for additional information3// regarding copyright ownership. The SFC licenses this file4// to you under the Apache License, Version 2.0 (the5// "License"); you may not use this file except in compliance6// with the License. You may obtain a copy of the License at7//8// http://www.apache.org/licenses/LICENSE-2.09//10// Unless required by applicable law or agreed to in writing,11// software distributed under the License is distributed on an12// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY13// KIND, either express or implied. See the License for the14// specific language governing permissions and limitations15// under the License.1617'use strict'1819const assert = require('node:assert')20const { Browser } = require('selenium-webdriver/')21const { suite } = require('../../lib/test')2223const ScriptManager = require('selenium-webdriver/bidi/scriptManager')24const { LocalValue, RegExpValue } = require('selenium-webdriver/bidi/protocolValue')25const { EvaluateResultType } = require('selenium-webdriver/bidi/evaluateResult')26const { SpecialNumberType } = require('selenium-webdriver/bidi/protocolType')2728suite(29function (env) {30let driver3132beforeEach(async function () {33driver = await env.builder().build()34})3536afterEach(async function () {37await driver.quit()38})3940describe('Local Value', function () {41it('can call function with undefined argument', async function () {42const id = await driver.getWindowHandle()43const manager = await ScriptManager(id, driver)44let argumentValues = []45let value = LocalValue.createUndefinedValue()46argumentValues.push(value)4748const result = await manager.callFunctionInBrowsingContext(49id,50'(arg) => {{\n' +51' if(arg!==undefined)\n' +52' throw Error("Argument should be undefined, but was "+arg);\n' +53' return arg;\n' +54' }}',55false,56argumentValues,57)5859assert.equal(result.resultType, EvaluateResultType.SUCCESS)60assert.notEqual(result.realmId, null)61assert.equal(result.result.type, 'undefined')62})6364it('can call function with null argument', async function () {65const id = await driver.getWindowHandle()66const manager = await ScriptManager(id, driver)67let argumentValues = []68let value = LocalValue.createNullValue()69argumentValues.push(value)7071const result = await manager.callFunctionInBrowsingContext(72id,73'(arg) => {{\n' +74' if(arg!==null)\n' +75' throw Error("Argument should be null, but was "+arg);\n' +76' return arg;\n' +77' }}',78false,79argumentValues,80)8182assert.equal(result.resultType, EvaluateResultType.SUCCESS)83assert.notEqual(result.realmId, null)84assert.equal(result.result.type, 'null')85})8687it('can call function with minus zero argument', async function () {88const id = await driver.getWindowHandle()89const manager = await ScriptManager(id, driver)90let argumentValues = []91let value = LocalValue.createSpecialNumberValue(SpecialNumberType.MINUS_ZERO)92argumentValues.push(value)9394const result = await manager.callFunctionInBrowsingContext(95id,96'(arg) => {{\n' +97' if(arg!==-0)\n' +98' throw Error("Argument should be -0, but was "+arg);\n' +99' return arg;\n' +100' }}',101false,102argumentValues,103)104105assert.equal(result.resultType, EvaluateResultType.SUCCESS)106assert.notEqual(result.realmId, null)107assert.equal(result.result.type, 'number')108assert.notEqual(result.result.value, null)109assert.equal(result.result.value, '-0')110})111112it('can call function with infinity argument', async function () {113const id = await driver.getWindowHandle()114const manager = await ScriptManager(id, driver)115let argumentValues = []116let value = LocalValue.createSpecialNumberValue(SpecialNumberType.INFINITY)117argumentValues.push(value)118119const result = await manager.callFunctionInBrowsingContext(120id,121'(arg) => {{\n' +122' if(arg!==Infinity)\n' +123' throw Error("Argument should be Infinity, but was "+arg);\n' +124' return arg;\n' +125' }}',126false,127argumentValues,128)129130assert.equal(result.resultType, EvaluateResultType.SUCCESS)131assert.notEqual(result.realmId, null)132assert.equal(result.result.type, 'number')133assert.notEqual(result.result.value, null)134assert.equal(result.result.value, 'Infinity')135})136137it('can call function with minus infinity argument', async function () {138const id = await driver.getWindowHandle()139const manager = await ScriptManager(id, driver)140let argumentValues = []141let value = LocalValue.createSpecialNumberValue(SpecialNumberType.MINUS_INFINITY)142argumentValues.push(value)143144const result = await manager.callFunctionInBrowsingContext(145id,146'(arg) => {{\n' +147' if(arg!==-Infinity)\n' +148' throw Error("Argument should be -Infinity, but was "+arg);\n' +149' return arg;\n' +150' }}',151false,152argumentValues,153)154155assert.equal(result.resultType, EvaluateResultType.SUCCESS)156assert.notEqual(result.realmId, null)157assert.equal(result.result.type, 'number')158assert.notEqual(result.result.value, null)159assert.equal(result.result.value, '-Infinity')160})161162it('can call function with number argument', async function () {163const id = await driver.getWindowHandle()164const manager = await ScriptManager(id, driver)165let argumentValues = []166let value = LocalValue.createNumberValue(1.4)167argumentValues.push(value)168169const result = await manager.callFunctionInBrowsingContext(170id,171'(arg) => {{\n' +172' if(arg!==1.4)\n' +173' throw Error("Argument should be 1.4, but was "+arg);\n' +174' return arg;\n' +175' }}',176false,177argumentValues,178)179180assert.equal(result.resultType, EvaluateResultType.SUCCESS)181assert.notEqual(result.realmId, null)182assert.equal(result.result.type, 'number')183assert.notEqual(result.result.value, null)184assert.equal(result.result.value, 1.4)185})186187it('can call function with boolean argument', async function () {188const id = await driver.getWindowHandle()189const manager = await ScriptManager(id, driver)190let argumentValues = []191let value = LocalValue.createBooleanValue(true)192argumentValues.push(value)193194const result = await manager.callFunctionInBrowsingContext(195id,196'(arg) => {{\n' +197' if(arg!==true)\n' +198' throw Error("Argument should be true, but was "+arg);\n' +199' return arg;\n' +200' }}',201false,202argumentValues,203)204205assert.equal(result.resultType, EvaluateResultType.SUCCESS)206assert.notEqual(result.realmId, null)207assert.equal(result.result.type, 'boolean')208assert.notEqual(result.result.value, null)209assert.equal(result.result.value, true)210})211212it('can call function with big int argument', async function () {213const id = await driver.getWindowHandle()214const manager = await ScriptManager(id, driver)215let argumentValues = []216let value = LocalValue.createBigIntValue('42')217argumentValues.push(value)218219const result = await manager.callFunctionInBrowsingContext(220id,221'(arg) => {{\n' +222' if(arg!==42n)\n' +223' throw Error("Argument should be 42n, but was "+arg);\n' +224' return arg;\n' +225' }}',226false,227argumentValues,228)229230assert.equal(result.resultType, EvaluateResultType.SUCCESS)231assert.notEqual(result.realmId, null)232assert.equal(result.result.type, 'bigint')233assert.notEqual(result.result.value, null)234assert.equal(result.result.value, '42')235})236237it('can call function with array argument', async function () {238const id = await driver.getWindowHandle()239const manager = await ScriptManager(id, driver)240let argumentValues = []241let arrayValue = [LocalValue.createStringValue('foobar')]242let value = LocalValue.createArrayValue(arrayValue)243argumentValues.push(value)244245const result = await manager.callFunctionInBrowsingContext(246id,247'(arg) => {{\n' +248' if(! (arg instanceof Array))\n' +249' throw Error("Argument type should be Array, but was "+\n' +250' Object.prototype.toString.call(arg));\n' +251' return arg;\n' +252' }}',253false,254argumentValues,255)256257assert.equal(result.resultType, EvaluateResultType.SUCCESS)258assert.notEqual(result.realmId, null)259assert.equal(result.result.type, 'array')260assert.notEqual(result.result.value, null)261262let resultValue = result.result.value263assert.equal(resultValue.length, 1)264assert.equal(resultValue[0].type, 'string')265assert.equal(resultValue[0].value, 'foobar')266})267268it('can call function with set argument', async function () {269const id = await driver.getWindowHandle()270const manager = await ScriptManager(id, driver)271let argumentValues = []272let setValue = [LocalValue.createStringValue('foobar')]273let value = LocalValue.createSetValue(setValue)274argumentValues.push(value)275276const result = await manager.callFunctionInBrowsingContext(277id,278'(arg) => {{\n' +279' if(! (arg instanceof Set))\n' +280' throw Error("Argument type should be Set, but was "+\n' +281' Object.prototype.toString.call(arg));\n' +282' return arg;\n' +283' }}',284false,285argumentValues,286)287288assert.equal(result.resultType, EvaluateResultType.SUCCESS)289assert.notEqual(result.realmId, null)290assert.equal(result.result.type, 'set')291assert.notEqual(result.result.value, null)292293let resultValue = result.result.value294assert.equal(resultValue.length, 1)295assert.equal(resultValue[0].type, 'string')296assert.equal(resultValue[0].value, 'foobar')297})298299it('can call function with date argument', async function () {300const id = await driver.getWindowHandle()301const manager = await ScriptManager(id, driver)302let argumentValues = []303let value = LocalValue.createDateValue('2022-05-31T13:47:29.000Z')304argumentValues.push(value)305306const result = await manager.callFunctionInBrowsingContext(307id,308'(arg) => {{\n' +309' if(! (arg instanceof Date))\n' +310' throw Error("Argument type should be Date, but was "+\n' +311' Object.prototype.toString.call(arg));\n' +312' return arg;\n' +313' }}',314false,315argumentValues,316)317318assert.equal(result.resultType, EvaluateResultType.SUCCESS)319assert.notEqual(result.realmId, null)320assert.equal(result.result.type, 'date')321assert.notEqual(result.result.value, null)322assert.equal(result.result.value, '2022-05-31T13:47:29.000Z')323})324325it('can call function with map argument', async function () {326const id = await driver.getWindowHandle()327const manager = await ScriptManager(id, driver)328let argumentValues = []329let mapValue = { foobar: LocalValue.createStringValue('foobar') }330let value = LocalValue.createMapValue(mapValue)331argumentValues.push(value)332333const result = await manager.callFunctionInBrowsingContext(334id,335'(arg) => {{\n' +336' if(! (arg instanceof Map))\n' +337' throw Error("Argument type should be Map, but was "+\n' +338' Object.prototype.toString.call(arg));\n' +339' return arg;\n' +340' }}',341false,342argumentValues,343)344345assert.equal(result.resultType, EvaluateResultType.SUCCESS)346assert.notEqual(result.realmId, null)347assert.equal(result.result.type, 'map')348assert.notEqual(result.result.value, null)349350let resultValue = result.result.value351352assert.equal(resultValue[0][0], 'foobar')353assert.equal(resultValue[0][1].type, 'string')354assert.equal(resultValue[0][1].value, 'foobar')355})356357it('can call function with object argument', async function () {358const id = await driver.getWindowHandle()359const manager = await ScriptManager(id, driver)360let argumentValues = []361let mapValue = { foobar: LocalValue.createStringValue('foobar') }362let value = LocalValue.createObjectValue(mapValue)363argumentValues.push(value)364365const result = await manager.callFunctionInBrowsingContext(366id,367'(arg) => {{\n' +368' if(! (arg instanceof Object))\n' +369' throw Error("Argument type should be Object, but was "+\n' +370' Object.prototype.toString.call(arg));\n' +371' return arg;\n' +372' }}',373false,374argumentValues,375)376377assert.equal(result.resultType, EvaluateResultType.SUCCESS)378assert.notEqual(result.realmId, null)379assert.equal(result.result.type, 'object')380assert.notEqual(result.result.value, null)381382let resultValue = result.result.value383assert.equal(Object.keys(resultValue).length, 1)384assert.equal(resultValue['foobar'].type, 'string')385assert.equal(resultValue['foobar'].value, 'foobar')386})387388it('can call function with regex argument', async function () {389const id = await driver.getWindowHandle()390const manager = await ScriptManager(id, driver)391let argumentValues = []392let value = LocalValue.createRegularExpressionValue(new RegExpValue('foo', 'g'))393argumentValues.push(value)394395const result = await manager.callFunctionInBrowsingContext(396id,397'(arg) => {{\n' +398' if(! (arg instanceof RegExp))\n' +399' throw Error("Argument type should be RegExp, but was "+\n' +400' Object.prototype.toString.call(arg));\n' +401' return arg;\n' +402' }}',403false,404argumentValues,405)406407assert.equal(result.resultType, EvaluateResultType.SUCCESS)408assert.notEqual(result.realmId, null)409assert.equal(result.result.type, 'regexp')410assert.notEqual(result.result.value, null)411412let resultValue = result.result.value413assert.equal(resultValue.pattern, 'foo')414assert.equal(resultValue.flags, 'g')415})416})417},418{ browsers: [Browser.FIREFOX, Browser.CHROME, Browser.EDGE] },419)420421422