webdriverio-testing-library icon indicating copy to clipboard operation
webdriverio-testing-library copied to clipboard

Type mismatch on setupBrowser argument

Open hugueschabot opened this issue 2 years ago • 3 comments

If I create a new wdio (currently version 8.27) project with TypeScript and Testing Library, when I used setupBrowser I get a compilation error. However, the test can be executed normally so this is not a valid type error.

Example

import { expect, browser, $ } from "@wdio/globals";
import { setupBrowser } from "@testing-library/webdriverio";

describe("My Login application", () => {
  it("should login with valid credentials", async () => {
    const { getByRole } = setupBrowser(browser);
    // ...
  });
});

Compilation error:

Argument of type 'Browser' is not assignable to parameter of type 'BrowserBase'.
  Type 'Browser' is not assignable to type 'SelectorsBase'.
    The types returned by '$$(...)' are incompatible between these types.
      Type 'ChainablePromiseArray<ElementArray>' is not assignable to type 'Element[] | ChainablePromiseArrayBase<Promise<Element>> | Promise<Element[]>'.
        Type 'ChainablePromiseArray<ElementArray>' is missing the following properties from type 'Element[]': pop, push, concat, join, and 20 more.ts(2345)

Workaround

The workaround I found is to convince TypeScript that everything is okay by forcing a type cast: setupBrowser(browser as unknown as BrowserBase)

hugueschabot avatar Dec 22 '23 21:12 hugueschabot

Any update on this? The latest webdriverio released breaking changes

jerrywithaz avatar Feb 23 '24 15:02 jerrywithaz

Heya,

Sorry for the slow response, I'm planning on looking into this soon!

Hopefully I'll have a solution this week, but it may take longer as supporting multiple versions of WebdriverIO can take some finessing with regards to the types.

olivierwilkinson avatar Mar 04 '24 09:03 olivierwilkinson

This is happening since wdio-testing-lib defines it's own wdio-types which seem to be outdated with v8 i think.

I did this workaround

// global.d.ts
import type { WebdriverIOQueries } from '@testing-library/webdriverio';
import type { BrowserBase } from 'webdriverio';

declare module '@testing-library/webdriverio' {
  function setupBrowser<Browser extends BrowserBase>(browser: Browser): WebdriverIOQueries;
}

anuraghazra avatar Apr 04 '24 18:04 anuraghazra