import path from 'node:path'
import { expect, describe, it, vi, beforeEach } from 'vitest'
import { remote } from '../../../src/index.js'
vi.mock('fetch')
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
describe('waitForClickable', () => {
const duration = 1000
let browser: WebdriverIO.Browser
beforeEach(async () => {
browser = await remote({
baseUrl: 'http://foobar.com',
capabilities: {
browserName: 'foobar'
}
})
})
it('should call waitUntil', async () => {
const cb = vi.fn()
const tmpElem = await browser.$('#foo')
const elem = {
selector : '#foo',
on: vi.fn(),
off: vi.fn(),
waitForClickable : tmpElem.waitForClickable,
elementId : 123,
waitUntil : vi.fn(((cb))),
options : { waitforInterval: 5, waitforTimeout: duration }
} as unknown as WebdriverIO.Element
await elem.waitForClickable()
expect(cb).toBeCalled()
expect(vi.mocked(elem.waitUntil).mock.calls).toMatchSnapshot()
})
it('should call isClickable and return true immediately if true', async () => {
const tmpElem = await browser.$('#foo')
const elem = {
selector : '#foo',
on: vi.fn(),
off: vi.fn(),
waitForClickable : tmpElem.waitForClickable,
elementId : 123,
waitUntil : tmpElem.waitUntil,
isClickable : vi.fn(() => true),
options : { waitforTimeout : 500, waitforInterval: 50 },
} as unknown as WebdriverIO.Element
const result = await elem.waitForClickable({ timeout: duration })
expect(result).toBe(true)
})
it('should call isClickable and return true if eventually true', async () => {
const tmpElem = await browser.$('#foo')
const elem = {
selector : '#foo',
on: vi.fn(),
off: vi.fn(),
waitForClickable : tmpElem.waitForClickable,
elementId : 123,
waitUntil : tmpElem.waitUntil,
isClickable : vi.fn()
.mockImplementationOnce(() => false)
.mockImplementationOnce(() => false)
.mockImplementationOnce(() => true),
options : { waitforTimeout : 50, waitforInterval: 5 },
} as unknown as WebdriverIO.Element
const result = await elem.waitForClickable({ timeout: duration })
expect(result).toBe(true)
})
it('should call isClickable and return false', async () => {
expect.assertions(1)
const tmpElem = await browser.$('#foo')
const elem = {
selector : '#foo',
on: vi.fn(),
off: vi.fn(),
waitForClickable : tmpElem.waitForClickable,
elementId : 123,
waitUntil : tmpElem.waitUntil,
isClickable : vi.fn(() => false),
options : { waitforTimeout : 500, waitforInterval: 50 },
} as unknown as WebdriverIO.Element
try {
await elem.waitForClickable({ timeout: duration })
} catch (err: any) {
expect(err.message).toBe(`element ("#foo") still not clickable after ${duration}ms`)
}
})
it('should not call isClickable and return false if never found', async () => {
const tmpElem = await browser.$('#foo')
const elem: any = {
selector : '#foo',
parent: {
$: vi.fn(() => { return elem}),
on: vi.fn(),
off: vi.fn(),
},
waitForClickable : tmpElem.waitForClickable,
waitUntil : tmpElem.waitUntil,
isDisplayed : tmpElem.isDisplayed,
isClickable : tmpElem.isClickable,
options : { waitforTimeout : 500, waitforInterval: 50 },
}
elem.getElement = () => Promise.resolve(elem)
try {
await elem.waitForClickable({ timeout: duration })
} catch (err: any) {
expect(err.message).toBe(`element ("#foo") still not clickable after ${duration}ms`)
}
})
it('should do reverse', async () => {
const cb = vi.fn()
const tmpElem = await browser.$('#foo')
const elem = {
selector : '#foo',
on: vi.fn(),
off: vi.fn(),
waitForClickable : tmpElem.waitForClickable,
elementId : 123,
waitUntil : vi.fn(((cb))),
isClickable : vi.fn(() => true),
options : { waitforTimeout : 500, waitforInterval: 50 },
} as unknown as WebdriverIO.Element
await elem.waitForClickable({ reverse: true })
expect(vi.mocked(elem.waitUntil).mock.calls).toMatchSnapshot()
})
it('should call isClickable and return false with custom error', async () => {
expect.assertions(1)
const tmpElem = await browser.$('#foo')
const elem = {
selector : '#foo',
on: vi.fn(),
off: vi.fn(),
waitForClickable : tmpElem.waitForClickable,
elementId : 123,
waitUntil : tmpElem.waitUntil,
isClickable : vi.fn(() => false),
options : { waitforTimeout : 500, waitforInterval: 50 },
} as unknown as WebdriverIO.Element
try {
await elem.waitForClickable({ timeout: duration, timeoutMsg: 'Element foo never clickable' })
} catch (err: any) {
expect(err.message).toBe('Element foo never clickable')
}
})
})