🏡 index : quine-global/webdriverio.git

import path from 'node:path'
import { describe, it, beforeEach, expect, vi } from 'vitest'
import { remote, type ElementArray } from '../../src/index.js'

import * as getElem from '../../src/utils/getElementObject.js'

const origGetElem: typeof getElem = await vi.importActual('../../src/utils/getElementObject')

const ErrorExamplesW3C = {
    chrome: {
        error: 'no such element',
        message: 'no such element: No node with given id found\n  (Session info: headless chrome=116.0.5845.50)',
        stacktrace: '0   chromedriver                        0x000000010dc72288 chromedriver + 5014152\n' +
        '1   chromedriver                        0x000000010dc68fe3 chromedriver + 4976611\n' +
        '2   chromedriver                        0x000000010d80ddd7 chromedriver + 409047\n' +
        '3   chromedriver                        0x000000010d85cc19 chromedriver + 732185\n' +
        '4   chromedriver                        0x000000010d85cdd1 chromedriver + 732625\n' +
        '5   chromedriver                        0x000000010d8a2bd4 chromedriver + 1018836\n' +
        '6   chromedriver                        0x000000010d883f7d chromedriver + 892797\n' +
        '7   chromedriver                        0x000000010d89ffb1 chromedriver + 1007537\n' +
        '8   chromedriver                        0x000000010d883d23 chromedriver + 892195\n' +
        '9   chromedriver                        0x000000010d84e919 chromedriver + 674073\n' +
        '10  chromedriver                        0x000000010d84fb4e chromedriver + 678734\n' +
        '11  chromedriver                        0x000000010dc34669 chromedriver + 4761193\n' +
        '12  chromedriver                        0x000000010dc396e3 chromedriver + 4781795\n' +
        '13  chromedriver                        0x000000010dc404ae chromedriver + 4809902\n' +
        '14  chromedriver                        0x000000010dc3a40d chromedriver + 4785165\n' +
        '15  chromedriver                        0x000000010dc0cd9c chromedriver + 4599196\n' +
        '16  chromedriver                        0x000000010dc57ed8 chromedriver + 4906712\n' +
        '17  chromedriver                        0x000000010dc58090 chromedriver + 4907152\n' +
        '18  chromedriver                        0x000000010dc68c1e chromedriver + 4975646\n' +
        '19  libsystem_pthread.dylib             0x00007ff810a2b1d3 _pthread_start + 125\n' +
        '20  libsystem_pthread.dylib             0x00007ff810a26bd3 thread_start + 15\n'
    },
    firefox: {
        error: 'no such element',
        message: 'Unable to locate element: [role="example"]',
        stacktrace: 'RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8\n' +
          'WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:188:5\n' +
          'NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:506:5\n' +
          'dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:132:16\n'
    }
}

vi.mock('fetch')
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
vi.mock('../../src/commands/element/waitForExist', () => ({
    __esModule: true,
    waitForExist: vi.fn().mockImplementation(() => { return true })
}))
vi.mock('../../src/utils/getElementObject.js', async () => {

    const mod = {
        getElement: vi.fn(),
        getElements: vi.fn()
    }

    return { __esModule: true, ...mod, default: { ...mod } }
})

describe('getElements', () => {

    let browser: WebdriverIO.Browser

    beforeEach(async () => {

        browser = await remote({
            baseUrl: 'http://foobar.com',
            capabilities: {
                browserName: 'foobar'
            }
        })

        vi.mocked(getElem.getElement).mockClear()
        vi.mocked(getElem.getElements).mockClear()

        vi.mocked(getElem.getElements).mockImplementation(
            (elem, _res, props) => origGetElem
                .getElements
                .call(browser, elem, ErrorExamplesW3C.chrome, props)
        )
    })

    it('should deal with a W3C spec error response', async () => {

        const error = new Error()
        Object.assign(error, {
            // name: ErrorExamplesW3C.chrome.error,
            message: ErrorExamplesW3C.chrome.message,
            stack: ErrorExamplesW3C.chrome.stacktrace,
        })

        const elems = await browser.$$('#foo')
        const [elem] = elems

        expect((elems as unknown as ElementArray).foundWith).toBe('$$')

        expect(elems).toHaveLength(1)

        const elemError = elem.error as Error
        expect(elemError).toBeInstanceOf(Error)
        expect(elemError.message).toEqual(error.message)
        expect(elemError.stack).toEqual(error.stack)
    })
})