import os from 'node:os' import path from 'node:path' import { describe, it, expect, beforeAll, vi, beforeEach } from 'vitest' import { remote, Key } from '../../../src/index.js' import '../../../src/node.js' vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger'))) vi.mock('fetch') vi.mock('node:os') vi.mocked(os.type).mockReturnValue('Darwin') describe('action command', () => { let browser: WebdriverIO.Browser beforeAll(async () => { browser = await remote({ baseUrl: 'http://foobar.com', capabilities: { browserName: 'foobar' } }) }) beforeEach(() => { vi.mocked(fetch).mockClear() }) it('should support key actions', async () => { await browser.action('key', { id: 'foobar' }) .down('f') .pause(100) .up('b') .perform() const calls = vi.mocked(fetch).mock.calls expect(calls).toHaveLength(2) const [ [performActionUrl, performActionParam], [releaseActionUrl, releaseActionParam] ] = calls as any expect(performActionUrl.pathname).toBe('/session/foobar-123/actions') expect(releaseActionUrl.pathname).toBe('/session/foobar-123/actions') expect(performActionParam.method).toBe('POST') expect(releaseActionParam.method).toBe('DELETE') expect(JSON.parse(performActionParam.body)).toMatchSnapshot() }) it('fails if user triggers more than one character', async () => { await expect(async () => browser.action('key').down('foo').perform()) .rejects .toThrowError(/more than one/) }) it('should trigger command key when Key.Ctrl is used', async () => { vi.mocked(os.type).mockReturnValue('Darwin') await browser.action('key', { id: 'foobar' }) .down(Key.Ctrl).perform() const calls = vi.mocked(fetch).mock.calls const [[, performActionParam]] = calls as any expect(JSON.parse(performActionParam.body).actions[0].actions[0].value).toBe(Key.Command) }) it('should trigger control key when Key.Ctrl is used because we use Windows', async () => { vi.mocked(os.type).mockReturnValue('Windows') await browser.action('key', { id: 'foobar' }) .down(Key.Ctrl).perform() const calls = vi.mocked(fetch).mock.calls const [[, performActionParam]] = calls as any expect(JSON.parse(performActionParam.body).actions[0].actions[0].value).toBe(Key.Control) }) it('should trigger command key when Key.Ctrl is used because platformName is mac', async () => { vi.mocked(os.type).mockReturnValue('Windows') // @ts-ignore browser.capabilities.platformName = 'Mac OS' await browser.action('key', { id: 'foobar' }) .down(Key.Ctrl).perform() const calls = vi.mocked(fetch).mock.calls const [[, performActionParam]] = calls as any expect(JSON.parse(performActionParam.body).actions[0].actions[0].value).toBe(Key.Command) }) it('should trigger control key when Key.Ctrl is used because os is mac, platformName is Windows 10 and host is remote', async () => { vi.mocked(os.type).mockReturnValue('Darwin') browser.options.hostname = 'remote' // @ts-ignore browser.capabilities.platformName = 'Windows 10' await browser.action('key', { id: 'foobar' }) .down(Key.Ctrl).perform() const calls = vi.mocked(fetch).mock.calls const [[, performActionParam]] = calls as any expect(JSON.parse(performActionParam.body).actions[0].actions[0].value).toBe(Key.Control) }) it('should trigger command key when Key.Ctrl is used because os is mac and hostname is local', async () => { vi.mocked(os.type).mockReturnValue('Darwin') // @ts-ignore browser.capabilities.platformName = 'Mac OS' browser.options.hostname = 'local' await browser.action('key', { id: 'foobar' }) .down(Key.Ctrl).perform() const calls = vi.mocked(fetch).mock.calls const [[, performActionParam]] = calls as any expect(JSON.parse(performActionParam.body).actions[0].actions[0].value).toBe(Key.Command) }) it('should trigger command key when Key.Ctrl is used because os is mac and hostname is 127.0.0.1', async () => { vi.mocked(os.type).mockReturnValue('Darwin') // @ts-ignore browser.capabilities.platformName = 'Mac OS' browser.options.hostname = '127.0.0.1' await browser.action('key', { id: 'foobar' }) .down(Key.Ctrl).perform() const calls = vi.mocked(fetch).mock.calls const [[, performActionParam]] = calls as any expect(JSON.parse(performActionParam.body).actions[0].actions[0].value).toBe(Key.Command) }) it('should support pointer actions', async () => { await browser.action( 'pointer', { id: 'foobar', parameters: { pointerType: 'pen' } } ) .down({ button: 1, width: 2, height: 3, pressure: 4, tangentialPressure: 5, tiltX: 6, tiltY: 7, twist: 8, altitudeAngle: 9, azimuthAngle: 10, }) .down('right') .move(100, 200) .pause(100) .move({ button: 0, width: 1, height: 2, pressure: 3, tangentialPressure: 4, tiltX: 5, tiltY: 6, twist: 7, altitudeAngle: 8, azimuthAngle: 9, x: 10, y: 11, duration: 12, origin: 'viewport' }) .up({ button: 2 }) .up('middle') .cancel() .perform() const calls = vi.mocked(fetch).mock.calls expect(calls).toHaveLength(2) const [ [performActionUrl, performActionParam], [releaseActionUrl, releaseActionParam] ] = calls as any expect(performActionUrl.pathname).toBe('/session/foobar-123/actions') expect(releaseActionUrl.pathname).toBe('/session/foobar-123/actions') expect(performActionParam.method).toBe('POST') expect(releaseActionParam.method).toBe('DELETE') expect(JSON.parse(performActionParam.body)).toMatchSnapshot() }) it('should support wheel actions', async () => { await browser.action('wheel', { id: 'foobar' }) .pause(100) .scroll({ x: 0, y: 1, deltaX: 2, deltaY: 3, duration: 4 }) .perform() const calls = vi.mocked(fetch).mock.calls expect(calls).toHaveLength(2) const [ [performActionUrl, performActionParam], [releaseActionUrl, releaseActionParam] ] = calls as any expect(performActionUrl.pathname).toBe('/session/foobar-123/actions') expect(releaseActionUrl.pathname).toBe('/session/foobar-123/actions') expect(performActionParam.method).toBe('POST') expect(releaseActionParam.method).toBe('DELETE') expect(JSON.parse(performActionParam.body)).toMatchSnapshot() }) it('resolves not resolved wdio elements in pointer action', async () => { await browser.action('pointer') .move({ origin: browser.$('#drag') }) .perform() const calls = vi.mocked(fetch).mock.calls const [,,, [, performActionParam]] = calls as any expect(JSON.parse(performActionParam.body)).toMatchSnapshot() }) it('resolves not resolved wdio elements in wheel action', async () => { await browser.action('wheel') .scroll({ origin: browser.$('#drag') }) .perform() const calls = vi.mocked(fetch).mock.calls const [,,, [, performActionParam]] = calls as any expect(JSON.parse(performActionParam.body)).toMatchSnapshot() }) })