blob: 75ff00a4d9ee5e8c597fdf1acdcbaed6fe370688 [file] [log] [blame] [edit]
// 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 test = require('../lib/test')
const { By } = require('selenium-webdriver')
const { UnknownCommandError } = require('selenium-webdriver/lib/error')
test.suite(function (env) {
let driver
before(async function () {
driver = await env.builder().build()
})
after(function () {
return driver.quit()
})
beforeEach(function () {
return driver.switchTo().defaultContent()
})
it('can set size of the current window', async function () {
await driver.get(test.Pages.echoPage)
await changeSizeBy(-20, -20)
})
it('can set size of the current window from frame', async function () {
await driver.get(test.Pages.framesetPage)
const frame = await driver.findElement({ css: 'frame[name="fourth"]' })
await driver.switchTo().frame(frame)
await changeSizeBy(-20, -20)
})
it('can set size of the current window from iframe', async function () {
await driver.get(test.Pages.iframePage)
const frame = await driver.findElement({
css: 'iframe[name="iframe1-name"]',
})
await driver.switchTo().frame(frame)
await changeSizeBy(-20, -20)
})
it('can switch to a new window', async function () {
await driver.get(test.Pages.xhtmlTestPage)
await driver.getWindowHandle()
let originalHandles = await driver.getAllWindowHandles()
await driver.findElement(By.linkText('Open new window')).click()
await driver.wait(forNewWindowToBeOpened(originalHandles), 2000)
assert.strictEqual(await driver.getTitle(), 'XHTML Test Page')
let newHandle = await getNewWindowHandle(originalHandles)
await driver.switchTo().window(newHandle)
assert.strictEqual(await driver.getTitle(), 'We Arrive Here')
})
it('can set the window position of the current window', async function () {
let { x, y } = await driver.manage().window().getRect()
let newX = x + 10
let newY = y + 10
await driver.manage().window().setRect({
x: newX,
y: newY,
width: 640,
height: 480,
})
await driver.wait(forPositionToBe(newX, newY), 1000)
})
it('can set the window position from a frame', async function () {
await driver.get(test.Pages.iframePage)
let frame = await driver.findElement(By.name('iframe1-name'))
await driver.switchTo().frame(frame)
let { x, y } = await driver.manage().window().getRect()
x += 10
y += 10
await driver.manage().window().setRect({ width: 640, height: 480, x, y })
await driver.wait(forPositionToBe(x, y), 1000)
})
it('can open a new window', async function () {
let originalHandles = await driver.getAllWindowHandles()
let originalHandle = await driver.getWindowHandle()
let newHandle
try {
newHandle = await driver.switchTo().newWindow()
} catch (ex) {
if (ex instanceof UnknownCommandError) {
console.warn(Error(`${env.browser.name}: aborting test due to unsupported command: ${ex}`).stack)
return
}
}
assert.strictEqual((await driver.getAllWindowHandles()).length, originalHandles.length + 1)
assert.notEqual(originalHandle, newHandle)
})
async function changeSizeBy(dx, dy) {
let { width, height } = await driver.manage().window().getRect()
width += dx
height += dy
let rect = await driver.manage().window().setRect({ width, height })
if (rect.width === width && rect.height === height) {
return
}
return await driver.wait(forSizeToBe(width, height), 1000)
}
function forSizeToBe(w, h) {
return async function () {
let { width, height } = await driver.manage().window().getRect()
return width === w && height === h
}
}
function forPositionToBe(x, y) {
return async function () {
let position = await driver.manage().window().getRect()
return (
position.x === x &&
// On OSX, the window height may be bumped down 22px for the top
// status bar.
// On Linux, Opera's window position will be off by 28px.
position.y >= y &&
position.y <= y + 28
)
}
}
function forNewWindowToBeOpened(originalHandles) {
return function () {
return driver.getAllWindowHandles().then(function (currentHandles) {
return currentHandles.length > originalHandles.length
})
}
}
function getNewWindowHandle(originalHandles) {
// Note: this assumes there's just one new window.
return driver.getAllWindowHandles().then(function (currentHandles) {
return currentHandles.filter(function (i) {
return originalHandles.indexOf(i) < 0
})[0]
})
}
})