// Licensed to the Software Freedom Conservancy (SFC) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The SFC licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. 'use strict' const assert = require('node:assert') const { Browser, By } = require('selenium-webdriver') const { Pages, suite, ignore } = require('../../lib/test') const BrowsingContext = require('selenium-webdriver/bidi/browsingContext') const until = require('selenium-webdriver/lib/until') const { Origin, CaptureScreenshotParameters } = require('selenium-webdriver/bidi/captureScreenshotParameters') const { BoxClipRectangle, ElementClipRectangle } = require('selenium-webdriver/bidi/clipRectangle') const { CreateContextParameters } = require('selenium-webdriver/bidi/createContextParameters') const BrowserBiDi = require('selenium-webdriver/bidi/browser') suite( function (env) { let driver beforeEach(async function () { driver = await env.builder().build() }) afterEach(async function () { await driver.quit() }) describe('Browsing Context', function () { let startIndex = 0 let endIndex = 5 let pdfMagicNumber = 'JVBER' let pngMagicNumber = 'iVBOR' it('can create a browsing context for given id', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) assert.equal(browsingContext.id, id) }) it('can create a window', async function () { const browsingContext = await BrowsingContext(driver, { type: 'window', }) assert.notEqual(browsingContext.id, null) }) it('can create a window with a reference context', async function () { const browsingContext = await BrowsingContext(driver, { type: 'window', createParameters: new CreateContextParameters().referenceContext(await driver.getWindowHandle()), }) assert.notEqual(browsingContext.id, null) }) it('can create a tab with all parameters', async function () { const browser = await BrowserBiDi(driver) const userContext = await browser.createUserContext() const browsingContext = await BrowsingContext(driver, { type: 'window', createParameters: new CreateContextParameters() .referenceContext(await driver.getWindowHandle()) .background(true) .userContext(userContext), }) assert.notEqual(browsingContext.id, null) assert.notEqual(browsingContext.id, await driver.getWindowHandle()) }) it('can create a tab', async function () { const browsingContext = await BrowsingContext(driver, { type: 'tab', }) assert.notEqual(browsingContext.id, null) }) it('can create a tab with a reference context', async function () { const browsingContext = await BrowsingContext(driver, { type: 'tab', referenceContext: new CreateContextParameters().referenceContext(await driver.getWindowHandle()), }) assert.notEqual(browsingContext.id, null) }) it('can navigate to a url', async function () { const browsingContext = await BrowsingContext(driver, { type: 'tab', }) let info = await browsingContext.navigate(Pages.logEntryAdded) assert.notEqual(browsingContext.id, null) assert.notEqual(info.navigationId, null) assert(info.url.includes('/bidi/logEntryAdded.html')) }) it('can navigate to a url with readiness state', async function () { const browsingContext = await BrowsingContext(driver, { type: 'tab', }) const info = await browsingContext.navigate(Pages.logEntryAdded, 'complete') assert.notEqual(browsingContext.id, null) assert.notEqual(info.navigationId, null) assert(info.url.includes('/bidi/logEntryAdded.html')) }) it('can get tree with a child', async function () { const browsingContextId = await driver.getWindowHandle() const parentWindow = await BrowsingContext(driver, { browsingContextId: browsingContextId, }) await parentWindow.navigate(Pages.iframePage, 'complete') const contextInfo = await parentWindow.getTree() assert.equal(contextInfo.children.length, 1) assert.equal(contextInfo.id, browsingContextId) assert(contextInfo.children[0]['url'].includes('formPage.html')) }) it('can get tree with depth', async function () { const browsingContextId = await driver.getWindowHandle() const parentWindow = await BrowsingContext(driver, { browsingContextId: browsingContextId, }) await parentWindow.navigate(Pages.iframePage, 'complete') const contextInfo = await parentWindow.getTree(0) assert.equal(contextInfo.children, null) assert.equal(contextInfo.id, browsingContextId) }) it('can close a window', async function () { const window1 = await BrowsingContext(driver, { type: 'window' }) const window2 = await BrowsingContext(driver, { type: 'window' }) await window2.close() assert.doesNotThrow(async function () { await window1.getTree() }) await assert.rejects(window2.getTree(), { message: 'no such frame' }) }) it('can print PDF with total pages', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.printPage) const result = await browsingContext.printPage() let base64Code = result.data.slice(startIndex, endIndex) assert.strictEqual(base64Code, pdfMagicNumber) }) it('can print PDF with all valid parameters', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.printPage) const result = await browsingContext.printPage({ orientation: 'landscape', scale: 1, background: true, width: 30, height: 30, top: 1, bottom: 1, left: 1, right: 1, shrinkToFit: true, pageRanges: ['1-2'], }) let base64Code = result.data.slice(startIndex, endIndex) assert.strictEqual(base64Code, pdfMagicNumber) }) it('can take screenshot', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) const response = await browsingContext.captureScreenshot() const base64code = response.slice(startIndex, endIndex) assert.equal(base64code, pngMagicNumber) }) it('can take screenshot with all parameters for box screenshot', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) let captureScreenshotParams = new CaptureScreenshotParameters() captureScreenshotParams.origin(Origin.VIEWPORT).clipRectangle(new BoxClipRectangle(5, 5, 10, 10)) const response = await browsingContext.captureScreenshot(captureScreenshotParams) const base64code = response.slice(startIndex, endIndex) assert.equal(base64code, pngMagicNumber) }) it('can take screenshot with all parameters for element screenshot', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.formPage) const element = await driver.findElement(By.id('checky')) const elementId = await element.getId() let captureScreenshotParams = new CaptureScreenshotParameters() captureScreenshotParams.origin(Origin.VIEWPORT).clipRectangle(new ElementClipRectangle(elementId)) const response = await browsingContext.captureScreenshot(captureScreenshotParams) const base64code = response.slice(startIndex, endIndex) assert.equal(base64code, pngMagicNumber) }) it('can take box screenshot', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) const response = await browsingContext.captureBoxScreenshot(5, 5, 10, 10) const base64code = response.slice(startIndex, endIndex) assert.equal(base64code, pngMagicNumber) }) it('can take element screenshot', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.formPage) const element = await driver.findElement(By.id('checky')) const elementId = await element.getId() const response = await browsingContext.captureElementScreenshot(elementId) const base64code = response.slice(startIndex, endIndex) assert.equal(base64code, pngMagicNumber) }) it('can activate a browsing context', async function () { const id = await driver.getWindowHandle() const window1 = await BrowsingContext(driver, { browsingContextId: id, }) await BrowsingContext(driver, { type: 'window', }) const result = await driver.executeScript('return document.hasFocus();') assert.equal(result, false) await window1.activate() const result2 = await driver.executeScript('return document.hasFocus();') assert.equal(result2, true) }) it('can handle user prompt', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.alertsPage) await driver.findElement(By.id('alert')).click() await driver.wait(until.alertIsPresent()) await browsingContext.handleUserPrompt() const result = await driver.getTitle() assert.equal(result, 'Testing Alerts') }) it('can accept user prompt', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.alertsPage) await driver.findElement(By.id('alert')).click() await driver.wait(until.alertIsPresent()) await browsingContext.handleUserPrompt(true) const result = await driver.getTitle() assert.equal(result, 'Testing Alerts') }) it('can dismiss user prompt', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.alertsPage) await driver.findElement(By.id('alert')).click() await driver.wait(until.alertIsPresent()) await browsingContext.handleUserPrompt(false) const result = await driver.getTitle() assert.equal(result, 'Testing Alerts') }) it('can pass user text to user prompt', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.userpromptPage) await driver.findElement(By.id('alert')).click() await driver.wait(until.alertIsPresent()) const userText = 'Selenium automates browsers' await browsingContext.handleUserPrompt(undefined, userText) const result = await driver.getPageSource() assert.equal(result.includes(userText), true) }) it('can accept user prompt with user text', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.userpromptPage) await driver.findElement(By.id('alert')).click() await driver.wait(until.alertIsPresent()) const userText = 'Selenium automates browsers' await browsingContext.handleUserPrompt(true, userText) const result = await driver.getPageSource() assert.equal(result.includes(userText), true) }) it('can dismiss user prompt with user text', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.userpromptPage) await driver.findElement(By.id('alert')).click() await driver.wait(until.alertIsPresent()) const userText = 'Selenium automates browsers' await browsingContext.handleUserPrompt(false, userText) const result = await driver.getPageSource() assert.equal(result.includes(userText), false) }) xit('can reload a browsing context', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) const result = await browsingContext.navigate(Pages.logEntryAdded, 'complete') await browsingContext.reload() assert.equal(result.navigationId, null) assert(result.url.includes('/bidi/logEntryAdded.html')) }) it('can reload with readiness state', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) const result = await browsingContext.navigate(Pages.logEntryAdded, 'complete') await browsingContext.reload(undefined, 'complete') assert.notEqual(result.navigationId, null) assert(result.url.includes('/bidi/logEntryAdded.html')) }) it('can set viewport', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.blankPage) await browsingContext.setViewport(250, 300) const result = await driver.executeScript('return [window.innerWidth, window.innerHeight];') assert.equal(result[0], 250) assert.equal(result[1], 300) }) ignore(env.browsers(Browser.FIREFOX)).it('can set viewport with device pixel ratio', async function () { const id = await driver.getWindowHandle() const browsingContext = await BrowsingContext(driver, { browsingContextId: id, }) await driver.get(Pages.blankPage) await browsingContext.setViewport(250, 300, 5) const result = await driver.executeScript('return [window.innerWidth, window.innerHeight];') assert.equal(result[0], 250) assert.equal(result[1], 300) const devicePixelRatio = await driver.executeScript('return window.devicePixelRatio;') assert.equal(devicePixelRatio, 5) }) it('Get All Top level browsing contexts', async () => { const id = await driver.getWindowHandle() const window1 = await BrowsingContext(driver, { browsingContextId: id, }) await BrowsingContext(driver, { type: 'window' }) const res = await window1.getTopLevelContexts() assert.equal(res.length, 2) }) }) }, { browsers: [Browser.FIREFOX, Browser.CHROME, Browser.EDGE] }, )