import path from 'node:path'
import { expect, describe, beforeEach, it, vi, beforeAll, afterAll } from 'vitest'
import { remote } from '../../../src/index.js'
vi.mock('fetch')
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
const webdriverResponses = [null, null, null, 'foo', 'bar', 'loo', null, 'hello', 'world', 'yo', null, 'some', 'url', 'here']
describe('switchWindow', () => {
let browser: WebdriverIO.Browser
beforeAll(() => {
global.window = {
name: 'foobar'
}
})
beforeEach(async () => {
vi.mocked(fetch).setMockResponse()
browser = await remote({
baseUrl: 'http://foobar.com',
capabilities: {
browserName: 'foobar'
}
})
})
it('should allow to switch to a window handle based on a partial URL match', async () => {
const tabId = await browser.switchWindow('webdriver.io')
expect(tabId).toBe('window-handle-1')
})
it('should not trigger a switchWindow call when the requested window handle matches the currently active one', async () => {
const current = await browser.getWindowHandle()
vi.spyOn(browser, 'switchToWindow').mockImplementation(() => {
throw new Error('switchToWindow should not have been called')
})
const tabId = await browser.switchWindow(current)
expect(tabId).toBe(current)
})
it('should allow to switch to a window handle based on an exact window handle match', async () => {
const desiredHandle = 'window-handle-2'
const spy = vi.spyOn(browser, 'switchToWindow')
const tabId = await browser.switchWindow(desiredHandle)
expect(tabId).toBe(desiredHandle)
expect(spy).toHaveBeenCalledOnce()
})
it('should iterate over all available handles to find the right window', async () => {
vi.mocked(fetch).setMockResponse([...webdriverResponses])
const tabId = await browser.switchWindow('so')
expect(tabId).toBe('window-handle-3')
vi.mocked(fetch).setMockResponse([...webdriverResponses])
const otherTabId = await browser.switchWindow(/h(e|a)llo/)
expect(otherTabId).toBe('window-handle-2')
vi.mocked(fetch).setMockResponse([...webdriverResponses])
const anotherTabId = await browser.switchWindow('world')
expect(anotherTabId).toBe('window-handle-2')
vi.mocked(fetch).setMockResponse([...webdriverResponses])
const andAnotherTabId = await browser.switchWindow('loo')
expect(andAnotherTabId).toBe('window-handle-1')
})
it('should fail if no window was found', async () => {
expect.hasAssertions()
vi.mocked(fetch).setMockResponse([...webdriverResponses])
try {
await browser.switchWindow('foobar')
} catch (err: any) {
expect(err.message).toContain('No window found')
}
})
it('should fail if parameter is not valid', async () => {
expect.hasAssertions()
try {
await browser.switchWindow(true)
} catch (err: any) {
expect(err.message).toContain('Unsupported parameter')
}
})
it('should find url with query string', async () => {
vi.mocked(fetch).setMockResponse([null, null, null, 'foo.com?foo=bar', 'bar', null, 'hello', 'world', null, 'some', 'url'])
const tabId = await browser.switchWindow('foo.com?foo=bar')
expect(tabId).toBe('window-handle-1')
})
it('should allow switchWindow call even when the currently active one is closed', async () => {
vi.spyOn(browser, 'getWindowHandle').mockImplementation(() =>
Promise.reject('target window already closed')
)
const tabId = await browser.switchWindow('webdriver.io')
expect(tabId).toBe('window-handle-1')
})
afterAll(() => {
delete global.window
})
})