Skip to content

Commit

Permalink
fix(webdriverio): updated WebdriverIO to 8.16.7 and switched to its n…
Browse files Browse the repository at this point in the history
…ew global types

WebdriverIO 8.16 relies on global types for Browser and Element, so instead of using `import {
Browser, Element } from 'webdriverio'` we now need to use `import 'webdriverio'` and then refer to
those types as WebdriverIO.Element and WebdriverIO.Browser
  • Loading branch information
jan-molak committed Sep 15, 2023
1 parent 96b315f commit ecd96b2
Show file tree
Hide file tree
Showing 9 changed files with 55 additions and 46 deletions.
@@ -1,3 +1,5 @@
import 'webdriverio';

import type { Serenity} from '@serenity-js/core';
import { AnsiDiffFormatter, ArtifactArchiver, Cast, TakeNotes } from '@serenity-js/core';
import type { TestRunnerAdapter } from '@serenity-js/core/lib/adapter/index.js';
Expand All @@ -7,7 +9,6 @@ import type { Capabilities } from '@wdio/types';
import * as deepmerge from 'deepmerge';
import type { EventEmitter } from 'events';
import { isRecord } from 'tiny-types/lib/objects/isRecord.js';
import type { Browser } from 'webdriverio';

import type { WebdriverIOConfig } from '../config/index.js';
import { BrowseTheWebWithWebdriverIO } from '../screenplay/index.js';
Expand Down Expand Up @@ -77,7 +78,7 @@ export class WebdriverIOFrameworkAdapter {
diffFormatter: config.serenity.diffFormatter ?? new AnsiDiffFormatter(),

actors: config.serenity.actors || Cast.where(actor => actor.whoCan(
BrowseTheWebWithWebdriverIO.using(global.browser as unknown as Browser),
BrowseTheWebWithWebdriverIO.using(global.browser as unknown as WebdriverIO.Browser),
TakeNotes.usingAnEmptyNotepad(),
)),

Expand Down
@@ -1,5 +1,6 @@
import 'webdriverio';

import { BrowseTheWeb } from '@serenity-js/web';
import type { Browser, Element } from 'webdriverio';

import { WebdriverIOBrowsingSession } from '../models/index.js';

Expand Down Expand Up @@ -37,9 +38,9 @@ import { WebdriverIOBrowsingSession } from '../models/index.js';
*
* @group Abilities
*/
export class BrowseTheWebWithWebdriverIO extends BrowseTheWeb<Element> {
export class BrowseTheWebWithWebdriverIO extends BrowseTheWeb<WebdriverIO.Element> {

static using(browserInstance: Browser): BrowseTheWebWithWebdriverIO {
static using(browserInstance: WebdriverIO.Browser): BrowseTheWebWithWebdriverIO {
return new BrowseTheWebWithWebdriverIO(new WebdriverIOBrowsingSession(browserInstance));
}
}
@@ -1,9 +1,10 @@
import 'webdriverio';

import { LogicError } from '@serenity-js/core';
import { CorrelationId } from '@serenity-js/core/lib/model/index.js';
import type { BrowserCapabilities, ModalDialogHandler } from '@serenity-js/web';
import { BrowsingSession } from '@serenity-js/web';
import type { Page } from 'puppeteer-core';
import type { Browser } from 'webdriverio';

import { WebdriverIOPage } from '../models/index.js';
import { WebdriverIOErrorHandler } from './WebdriverIOErrorHandler.js';
Expand All @@ -17,7 +18,7 @@ import { WebdriverIOPuppeteerModalDialogHandler } from './WebdriverIOPuppeteerMo
*/
export class WebdriverIOBrowsingSession extends BrowsingSession<WebdriverIOPage> {

constructor(protected readonly browser: Browser) {
constructor(protected readonly browser: WebdriverIO.Browser) {
super();

if (! browser.$ || ! browser.$$) {
Expand Down
@@ -1,8 +1,9 @@
import 'webdriverio';

import { Timestamp } from '@serenity-js/core';
import type { CookieData} from '@serenity-js/web';
import { Cookie, CookieMissingError } from '@serenity-js/web';
import { ensure, isDefined } from 'tiny-types';
import type { Browser } from 'webdriverio';

/**
* WebdriverIO-specific implementation of {@apilink Cookie}.
Expand All @@ -12,7 +13,7 @@ import type { Browser } from 'webdriverio';
export class WebdriverIOCookie extends Cookie {

constructor(
private readonly browser: Browser,
private readonly browser: WebdriverIO.Browser,
cookieName: string,
) {
super(cookieName);
Expand Down
@@ -1,6 +1,7 @@
import 'webdriverio';

import type { ModalDialog} from '@serenity-js/web';
import { AbsentModalDialog, AcceptedModalDialog, DismissedModalDialog, ModalDialogHandler } from '@serenity-js/web';
import type { Browser } from 'webdriverio';

import type { WebdriverIOErrorHandler } from './WebdriverIOErrorHandler.js';
import { WebdriverProtocolErrorCode } from './WebdriverProtocolErrorCode.js';
Expand Down Expand Up @@ -28,7 +29,7 @@ export class WebdriverIOModalDialogHandler extends ModalDialogHandler {
private currentHandler: () => Promise<void>;

constructor(
private readonly browser: Browser,
private readonly browser: WebdriverIO.Browser,
private readonly errorHandler: WebdriverIOErrorHandler,
) {
super();
Expand Down
13 changes: 7 additions & 6 deletions packages/webdriverio/src/screenplay/models/WebdriverIOPage.ts
@@ -1,9 +1,10 @@
import 'webdriverio';

import { List, LogicError } from '@serenity-js/core';
import type { CorrelationId } from '@serenity-js/core/lib/model/index.js';
import type { Cookie, CookieData, ModalDialogHandler, PageElement, PageElements, Selector } from '@serenity-js/web';
import { BrowserWindowClosedError, ByCss, Key, Page, PageElementsLocator } from '@serenity-js/web';
import { URL } from 'url';
import type { Browser, Element } from 'webdriverio';

import { WebdriverIOExistingElementLocator, WebdriverIOLocator, WebdriverIORootLocator } from './locators/index.js';
import type { WebdriverIOBrowsingSession } from './WebdriverIOBrowsingSession.js';
Expand All @@ -16,13 +17,13 @@ import { WebdriverIOPageElement } from './WebdriverIOPageElement.js';
*
* @group Models
*/
export class WebdriverIOPage extends Page<Element> {
export class WebdriverIOPage extends Page<WebdriverIO.Element> {

private lastScriptExecutionSummary: LastScriptExecutionSummary;

constructor(
session: WebdriverIOBrowsingSession,
private readonly browser: Browser,
private readonly browser: WebdriverIO.Browser,
modalDialogHandler: ModalDialogHandler,
private readonly errorHandler: WebdriverIOErrorHandler,
pageId: CorrelationId,
Expand All @@ -35,7 +36,7 @@ export class WebdriverIOPage extends Page<Element> {
);
}

createPageElement(nativeElement: Element): PageElement<Element> {
createPageElement(nativeElement: WebdriverIO.Element): PageElement<WebdriverIO.Element> {
return new WebdriverIOPageElement(
new WebdriverIOExistingElementLocator(
this.rootLocator,
Expand All @@ -46,13 +47,13 @@ export class WebdriverIOPage extends Page<Element> {
);
}

locate(selector: Selector): PageElement<Element> {
locate(selector: Selector): PageElement<WebdriverIO.Element> {
return new WebdriverIOPageElement(
new WebdriverIOLocator(this.rootLocator, selector, this.errorHandler)
)
}

locateAll(selector: Selector): PageElements<Element> {
locateAll(selector: Selector): PageElements<WebdriverIO.Element> {
return List.of(
new PageElementsLocator(
new WebdriverIOLocator(this.rootLocator, selector, this.errorHandler)
Expand Down
@@ -1,8 +1,9 @@
import 'webdriverio';

import { LogicError } from '@serenity-js/core';
import type { SwitchableOrigin } from '@serenity-js/web';
import { Key, PageElement, SelectOption } from '@serenity-js/web';
import * as scripts from '@serenity-js/web/lib/scripts/index.js';
import type { Browser, Element } from 'webdriverio';

import type { WebdriverIOLocator } from './locators/index.js';
import { WebdriverProtocolErrorCode } from './WebdriverProtocolErrorCode.js';
Expand All @@ -12,7 +13,7 @@ import { WebdriverProtocolErrorCode } from './WebdriverProtocolErrorCode.js';
*
* @group Models
*/
export class WebdriverIOPageElement extends PageElement<Element> {
export class WebdriverIOPageElement extends PageElement<WebdriverIO.Element> {
of(parent: WebdriverIOPageElement): WebdriverIOPageElement {
return new WebdriverIOPageElement(this.locator.of(parent.locator))
}
Expand All @@ -28,7 +29,7 @@ export class WebdriverIOPageElement extends PageElement<Element> {
}

// eslint-disable-next-line unicorn/consistent-function-scoping
async function removeCharactersFrom(browser: Browser | Element, inputElement: Element, numberOfCharacters: number): Promise<void> {
async function removeCharactersFrom(browser: WebdriverIO.Browser | WebdriverIO.Element, inputElement: WebdriverIO.Element, numberOfCharacters: number): Promise<void> {
await browser.execute(
/* c8 ignore next */
function focusOn(element: any) {
Expand Down Expand Up @@ -150,7 +151,7 @@ export class WebdriverIOPageElement extends PageElement<Element> {

async switchTo(): Promise<SwitchableOrigin> {
try {
const element: Element = await this.locator.nativeElement()
const element: WebdriverIO.Element = await this.locator.nativeElement()

if (element.error) {
throw element.error;
Expand Down Expand Up @@ -258,10 +259,10 @@ export class WebdriverIOPageElement extends PageElement<Element> {

// based on https://github.com/webdriverio/webdriverio/blob/dec6da76b0e218af935dbf39735ae3491d5edd8c/packages/webdriverio/src/utils/index.ts#L98

private async browserFor(nativeElement: Element | Browser): Promise<Element | Browser> {
const element = nativeElement as Element;
private async browserFor(nativeElement: WebdriverIO.Element | WebdriverIO.Browser): Promise<WebdriverIO.Element | WebdriverIO.Browser> {
const element = nativeElement as WebdriverIO.Element;
return element.parent
? this.browserFor(element.parent as (Element | Browser))
? this.browserFor(element.parent)
: nativeElement
}
}
@@ -1,7 +1,8 @@
import 'webdriverio';

import { f, LogicError } from '@serenity-js/core';
import type { PageElement, RootLocator, Selector } from '@serenity-js/web';
import { ByCss, ByCssContainingText, ByDeepCss, ById, ByTagName, ByXPath, Locator } from '@serenity-js/web';
import type { Element } from 'webdriverio';

import type { WebdriverIOErrorHandler } from '../WebdriverIOErrorHandler.js';
import { WebdriverIOPageElement } from '../WebdriverIOPageElement.js';
Expand All @@ -12,10 +13,10 @@ import type { WebdriverIORootLocator } from './WebdriverIORootLocator.js';
*
* @group Models
*/
export class WebdriverIOLocator extends Locator<Element, string> {
export class WebdriverIOLocator extends Locator<WebdriverIO.Element, string> {

constructor(
parent: RootLocator<Element>,
parent: RootLocator<WebdriverIO.Element>,
selector: Selector,
private readonly errorHandler: WebdriverIOErrorHandler,
) {
Expand Down Expand Up @@ -61,7 +62,7 @@ export class WebdriverIOLocator extends Locator<Element, string> {
}
}

async nativeElement(): Promise<Element> {
async nativeElement(): Promise<WebdriverIO.Element> {
try {
return await this.resolveNativeElement();
}
Expand All @@ -70,7 +71,7 @@ export class WebdriverIOLocator extends Locator<Element, string> {
}
}

protected async resolveNativeElement(): Promise<Element> {
protected async resolveNativeElement(): Promise<WebdriverIO.Element> {
const parent = await this.parent.nativeElement();

if (parent.error) {
Expand All @@ -86,28 +87,28 @@ export class WebdriverIOLocator extends Locator<Element, string> {
return element;
}

async allNativeElements(): Promise<Array<Element>> {
async allNativeElements(): Promise<Array<WebdriverIO.Element>> {
const parent = await this.parent.nativeElement();
return parent.$$(this.nativeSelector());
}

of(parent: WebdriverIOLocator): Locator<Element, string> {
of(parent: WebdriverIOLocator): Locator<WebdriverIO.Element, string> {
return new WebdriverIOLocator(parent, this.selector, this.errorHandler);
}

closestTo(child: WebdriverIOLocator): Locator<Element, string> {
closestTo(child: WebdriverIOLocator): Locator<WebdriverIO.Element, string> {
return new WebdriverIOParentElementLocator(this.parent, this.selector, child, this.errorHandler);
}

locate(child: WebdriverIOLocator): Locator<Element, string> {
locate(child: WebdriverIOLocator): Locator<WebdriverIO.Element, string> {
return new WebdriverIOLocator(this, child.selector, this.errorHandler);
}

element(): PageElement<Element> {
element(): PageElement<WebdriverIO.Element> {
return new WebdriverIOPageElement(this);
}

async allElements(): Promise<Array<PageElement<Element>>> {
async allElements(): Promise<Array<PageElement<WebdriverIO.Element>>> {
const elements = await this.allNativeElements();

return elements.map(childElement =>
Expand All @@ -128,34 +129,34 @@ export class WebdriverIOLocator extends Locator<Element, string> {
*/
export class WebdriverIOExistingElementLocator extends WebdriverIOLocator {
constructor(
parentRoot: RootLocator<Element>,
parentRoot: RootLocator<WebdriverIO.Element>,
selector: Selector,
errorHandler: WebdriverIOErrorHandler,
private readonly existingNativeElement: Element,
private readonly existingNativeElement: WebdriverIO.Element,
) {
super(parentRoot, selector, errorHandler);
}

async nativeElement(): Promise<Element> {
async nativeElement(): Promise<WebdriverIO.Element> {
return this.existingNativeElement;
}

async allNativeElements(): Promise<Array<Element>> {
async allNativeElements(): Promise<Array<WebdriverIO.Element>> {
return [ this.existingNativeElement ];
}
}

class WebdriverIOParentElementLocator extends WebdriverIOLocator {
constructor(
parentRoot: RootLocator<Element>,
parentRoot: RootLocator<WebdriverIO.Element>,
selector: Selector,
private readonly child: WebdriverIOLocator,
errorHandler: WebdriverIOErrorHandler
) {
super(parentRoot, selector, errorHandler);
}

protected override async resolveNativeElement(): Promise<Element> {
protected override async resolveNativeElement(): Promise<WebdriverIO.Element> {
const cssSelector = this.asCssSelector(this.selector);
const child = await this.child.nativeElement();

Expand All @@ -169,7 +170,7 @@ class WebdriverIOParentElementLocator extends WebdriverIOLocator {
);
}

override async allNativeElements(): Promise<Array<Element>> {
override async allNativeElements(): Promise<Array<WebdriverIO.Element>> {
return [ await this.nativeElement() ];
}
}
@@ -1,21 +1,22 @@
import 'webdriverio';

import { RootLocator } from '@serenity-js/web';
import type { Browser, Element } from 'webdriverio';

/**
* WebdriverIO-specific implementation of {@apilink RootLocator}.
*
* @group Models
*/
export class WebdriverIORootLocator extends RootLocator<Browser> {
constructor(private readonly browser: Browser) {
export class WebdriverIORootLocator extends RootLocator<WebdriverIO.Browser> {
constructor(private readonly browser: WebdriverIO.Browser) {
super();
}

async isPresent(): Promise<boolean> {
return true;
}

async nativeElement(): Promise<Pick<Browser, '$' | '$$'>> {
async nativeElement(): Promise<Pick<WebdriverIO.Browser, '$' | '$$'>> {
return this.browser;
}

Expand Down

0 comments on commit ecd96b2

Please sign in to comment.