@open-wa/driver-playwright 5.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +17 -0
- package/.turbo/turbo-lint.log +6 -0
- package/.turbo/turbo-test.log +14 -0
- package/CHANGELOG.md +21 -0
- package/LICENSE.md +67 -0
- package/README.md +19 -0
- package/dist/index.cjs +446 -0
- package/dist/index.d.cts +118 -0
- package/dist/index.d.cts.map +1 -0
- package/package.json +36 -0
- package/src/PlaywrightBrowser.ts +47 -0
- package/src/PlaywrightDriver.ts +114 -0
- package/src/PlaywrightElementHandle.ts +32 -0
- package/src/PlaywrightPage.ts +412 -0
- package/src/__tests__/PlaywrightPage.test.ts +144 -0
- package/src/index.ts +5 -0
- package/tsconfig.json +10 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { ConnectOptions, DisposableHandle, DriverCapabilities, IBrowser, IDriver, IDriverContext, IElementHandle, IFrame, IPage, LaunchOptions, NavigationWaitUntil, PageEventHandler, WaitForFunctionOptions } from "@open-wa/driver-interface";
|
|
2
|
+
import { Browser, CDPSession, ElementHandle, Page } from "playwright";
|
|
3
|
+
|
|
4
|
+
//#region src/PlaywrightDriver.d.ts
|
|
5
|
+
type PlaywrightBrowserType = 'chromium' | 'firefox' | 'webkit' | 'chrome' | 'msedge';
|
|
6
|
+
interface PlaywrightLaunchOptions extends LaunchOptions {
|
|
7
|
+
browser?: PlaywrightBrowserType;
|
|
8
|
+
channel?: 'chrome' | 'chrome-beta' | 'chrome-dev' | 'chrome-canary' | 'msedge' | 'msedge-beta' | 'msedge-dev' | 'msedge-canary';
|
|
9
|
+
}
|
|
10
|
+
declare class PlaywrightDriver implements IDriver {
|
|
11
|
+
readonly name: "playwright";
|
|
12
|
+
version?: string;
|
|
13
|
+
readonly capabilities: DriverCapabilities;
|
|
14
|
+
private playwright;
|
|
15
|
+
private ctx?;
|
|
16
|
+
private browserType;
|
|
17
|
+
constructor(browserType?: PlaywrightBrowserType);
|
|
18
|
+
init(ctx?: IDriverContext): Promise<void>;
|
|
19
|
+
launch(options?: PlaywrightLaunchOptions): Promise<IBrowser>;
|
|
20
|
+
connect(options: ConnectOptions): Promise<IBrowser>;
|
|
21
|
+
unwrap(): any;
|
|
22
|
+
has<C extends string>(cap: C): boolean;
|
|
23
|
+
require<C extends string>(cap: C): void;
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/PlaywrightBrowser.d.ts
|
|
27
|
+
declare class PlaywrightBrowser implements IBrowser {
|
|
28
|
+
private browser;
|
|
29
|
+
private browserType;
|
|
30
|
+
private capabilities;
|
|
31
|
+
readonly name: "playwright";
|
|
32
|
+
constructor(browser: Browser, browserType: PlaywrightBrowserType, capabilities: DriverCapabilities);
|
|
33
|
+
newPage(): Promise<IPage>;
|
|
34
|
+
pages(): Promise<IPage[]>;
|
|
35
|
+
close(): Promise<void>;
|
|
36
|
+
isConnected(): boolean;
|
|
37
|
+
versionString(): Promise<string>;
|
|
38
|
+
unwrap(): Browser;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region src/PlaywrightPage.d.ts
|
|
42
|
+
declare class PlaywrightPage implements IPage {
|
|
43
|
+
private page;
|
|
44
|
+
private capabilities;
|
|
45
|
+
readonly name: "playwright";
|
|
46
|
+
private readonly listenerWrappers;
|
|
47
|
+
private readonly requestInterceptionRoute;
|
|
48
|
+
private requestInterceptionEnabled;
|
|
49
|
+
constructor(page: Page, _browserType: PlaywrightBrowserType, capabilities: DriverCapabilities);
|
|
50
|
+
goto(url: string, options?: {
|
|
51
|
+
waitUntil?: NavigationWaitUntil;
|
|
52
|
+
timeoutMs?: number;
|
|
53
|
+
}): Promise<void>;
|
|
54
|
+
url(): string;
|
|
55
|
+
reload(): Promise<void>;
|
|
56
|
+
mainFrame(): IFrame;
|
|
57
|
+
evaluate<Arg, Ret>(fn: (arg: Arg) => Ret | Promise<Ret>, arg: Arg): Promise<Ret>;
|
|
58
|
+
evaluateScript<Ret = unknown>(script: string): Promise<Ret>;
|
|
59
|
+
addInitScript(script: string): Promise<DisposableHandle>;
|
|
60
|
+
setViewport(viewport: {
|
|
61
|
+
width: number;
|
|
62
|
+
height: number;
|
|
63
|
+
}): Promise<void>;
|
|
64
|
+
setUserAgent(ua: string): Promise<void>;
|
|
65
|
+
setRequestInterception(enabled: boolean): Promise<void>;
|
|
66
|
+
waitForSelector(selector: string, options?: {
|
|
67
|
+
timeoutMs?: number;
|
|
68
|
+
}): Promise<IElementHandle | null>;
|
|
69
|
+
waitForFunction(script: string, options?: WaitForFunctionOptions): Promise<void>;
|
|
70
|
+
waitForFunction<Arg>(fn: (arg: Arg) => boolean, arg: Arg, options?: WaitForFunctionOptions): Promise<void>;
|
|
71
|
+
$(selector: string): Promise<IElementHandle | null>;
|
|
72
|
+
$$(selector: string): Promise<IElementHandle[]>;
|
|
73
|
+
click(selector: string): Promise<void>;
|
|
74
|
+
type(selector: string, text: string, options?: {
|
|
75
|
+
delayMs?: number;
|
|
76
|
+
}): Promise<void>;
|
|
77
|
+
screenshot(options?: {
|
|
78
|
+
type?: 'png' | 'jpeg';
|
|
79
|
+
fullPage?: boolean;
|
|
80
|
+
}): Promise<Uint8Array>;
|
|
81
|
+
exposeFunction(name: string, fn: (...args: any[]) => any): Promise<void>;
|
|
82
|
+
on<K extends string>(event: K, handler: ((...args: any[]) => void | Promise<void>) | PageEventHandler<any>): DisposableHandle;
|
|
83
|
+
off<K extends string>(event: K, handler: ((...args: any[]) => void | Promise<void>) | PageEventHandler<any>): void;
|
|
84
|
+
close(): Promise<void>;
|
|
85
|
+
isClosed(): boolean;
|
|
86
|
+
has<C extends string>(cap: C): boolean;
|
|
87
|
+
require<C extends string>(cap: C): void;
|
|
88
|
+
cdp(): CDPSession;
|
|
89
|
+
setBypassServiceWorker(bypass: boolean): Promise<void>;
|
|
90
|
+
pdf(options?: {
|
|
91
|
+
path?: string;
|
|
92
|
+
format?: string;
|
|
93
|
+
}): Promise<Uint8Array>;
|
|
94
|
+
startTracing(options?: {
|
|
95
|
+
path?: string;
|
|
96
|
+
screenshots?: boolean;
|
|
97
|
+
}): Promise<void>;
|
|
98
|
+
stopTracing(): Promise<Uint8Array>;
|
|
99
|
+
unwrap(): Page;
|
|
100
|
+
private getWrapperSet;
|
|
101
|
+
private removeWrappedListener;
|
|
102
|
+
private wrapEventPayload;
|
|
103
|
+
}
|
|
104
|
+
//#endregion
|
|
105
|
+
//#region src/PlaywrightElementHandle.d.ts
|
|
106
|
+
declare class PlaywrightElementHandle implements IElementHandle {
|
|
107
|
+
private element;
|
|
108
|
+
constructor(element: ElementHandle);
|
|
109
|
+
click(): Promise<void>;
|
|
110
|
+
type(text: string): Promise<void>;
|
|
111
|
+
getAttribute(name: string): Promise<string | null>;
|
|
112
|
+
textContent(): Promise<string | null>;
|
|
113
|
+
dispose(): Promise<void>;
|
|
114
|
+
unwrap(): ElementHandle;
|
|
115
|
+
}
|
|
116
|
+
//#endregion
|
|
117
|
+
export { PlaywrightBrowser, type PlaywrightBrowserType, PlaywrightDriver, PlaywrightElementHandle, type PlaywrightLaunchOptions, PlaywrightPage };
|
|
118
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/PlaywrightDriver.ts","../src/PlaywrightBrowser.ts","../src/PlaywrightPage.ts","../src/PlaywrightElementHandle.ts"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@open-wa/driver-playwright",
|
|
3
|
+
"version": "5.0.0-alpha.0",
|
|
4
|
+
"description": "Playwright driver implementation for open-wa",
|
|
5
|
+
"main": "./dist/index.cjs",
|
|
6
|
+
"types": "./dist/index.d.cts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"require": "./dist/index.cjs",
|
|
10
|
+
"import": "./dist/index.cjs",
|
|
11
|
+
"types": "./dist/index.d.cts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"playwright": "^1.41.0",
|
|
16
|
+
"@open-wa/driver-interface": "5.0.0-alpha.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/node": "^25.9.1",
|
|
20
|
+
"typescript": "^6.0.3",
|
|
21
|
+
"vitest": "4.1.2"
|
|
22
|
+
},
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "https://github.com/open-wa/wa-automate-nodejs.git"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsdown src/index.ts --format cjs",
|
|
32
|
+
"dev": "tsdown src/index.ts --format cjs --watch",
|
|
33
|
+
"lint": "oxlint src",
|
|
34
|
+
"test": "vitest run"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { IBrowser, IPage, DriverCapabilities } from '@open-wa/driver-interface';
|
|
2
|
+
import type { Browser } from 'playwright';
|
|
3
|
+
import { PlaywrightPage } from './PlaywrightPage';
|
|
4
|
+
import { PlaywrightBrowserType } from './PlaywrightDriver';
|
|
5
|
+
|
|
6
|
+
export class PlaywrightBrowser implements IBrowser {
|
|
7
|
+
readonly name = 'playwright' as const;
|
|
8
|
+
|
|
9
|
+
constructor(
|
|
10
|
+
private browser: Browser,
|
|
11
|
+
private browserType: PlaywrightBrowserType,
|
|
12
|
+
private capabilities: DriverCapabilities
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
async newPage(): Promise<IPage> {
|
|
16
|
+
const page = await this.browser.newPage();
|
|
17
|
+
return new PlaywrightPage(page, this.browserType, this.capabilities);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async pages(): Promise<IPage[]> {
|
|
21
|
+
const contexts = this.browser.contexts();
|
|
22
|
+
const allPages: IPage[] = [];
|
|
23
|
+
|
|
24
|
+
for (const context of contexts) {
|
|
25
|
+
const pages = context.pages();
|
|
26
|
+
allPages.push(...pages.map(p => new PlaywrightPage(p, this.browserType, this.capabilities)));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return allPages;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async close(): Promise<void> {
|
|
33
|
+
await this.browser.close();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
isConnected(): boolean {
|
|
37
|
+
return this.browser.isConnected();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async versionString(): Promise<string> {
|
|
41
|
+
return this.browser.version();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
unwrap(): Browser {
|
|
45
|
+
return this.browser;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { IDriver, IBrowser, LaunchOptions, ConnectOptions, IDriverContext, DriverCapabilities } from '@open-wa/driver-interface';
|
|
2
|
+
import { PlaywrightBrowser } from './PlaywrightBrowser';
|
|
3
|
+
|
|
4
|
+
export type PlaywrightBrowserType = 'chromium' | 'firefox' | 'webkit' | 'chrome' | 'msedge';
|
|
5
|
+
|
|
6
|
+
export interface PlaywrightLaunchOptions extends LaunchOptions {
|
|
7
|
+
browser?: PlaywrightBrowserType;
|
|
8
|
+
channel?: 'chrome' | 'chrome-beta' | 'chrome-dev' | 'chrome-canary' | 'msedge' | 'msedge-beta' | 'msedge-dev' | 'msedge-canary';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class PlaywrightDriver implements IDriver {
|
|
12
|
+
readonly name = 'playwright' as const;
|
|
13
|
+
version?: string;
|
|
14
|
+
readonly capabilities: DriverCapabilities;
|
|
15
|
+
|
|
16
|
+
private playwright: any;
|
|
17
|
+
private ctx?: IDriverContext;
|
|
18
|
+
private browserType: PlaywrightBrowserType;
|
|
19
|
+
|
|
20
|
+
constructor(browserType: PlaywrightBrowserType = 'chromium') {
|
|
21
|
+
this.browserType = browserType;
|
|
22
|
+
|
|
23
|
+
this.capabilities = {
|
|
24
|
+
cdp: browserType === 'chromium' || browserType === 'chrome' || browserType === 'msedge'
|
|
25
|
+
? { supported: true, notes: 'Chromium-based only' }
|
|
26
|
+
: { supported: false, reason: 'CDP only available in Chromium browsers' },
|
|
27
|
+
requestInterception: { supported: true },
|
|
28
|
+
serviceWorkerBypass: { supported: true, notes: 'Different API than Puppeteer' },
|
|
29
|
+
stealth: { supported: false, reason: 'No puppeteer-extra equivalent' },
|
|
30
|
+
pdf: browserType === 'chromium' || browserType === 'chrome' || browserType === 'msedge'
|
|
31
|
+
? { supported: true, notes: 'Chromium-based only' }
|
|
32
|
+
: { supported: false, reason: 'PDF generation only in Chromium' },
|
|
33
|
+
tracing: { supported: true },
|
|
34
|
+
persistentContext: { supported: true },
|
|
35
|
+
browserExtensions: { supported: false, reason: 'Playwright limitation' },
|
|
36
|
+
exposeBinding: { supported: true },
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async init(ctx?: IDriverContext): Promise<void> {
|
|
41
|
+
this.ctx = ctx;
|
|
42
|
+
|
|
43
|
+
this.playwright = await import('playwright');
|
|
44
|
+
this.version = this.playwright.version || 'unknown';
|
|
45
|
+
|
|
46
|
+
this.ctx?.logger?.info('PlaywrightDriver initialized', {
|
|
47
|
+
version: this.version,
|
|
48
|
+
browserType: this.browserType
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async launch(options?: PlaywrightLaunchOptions): Promise<IBrowser> {
|
|
53
|
+
if (!this.playwright) await this.init();
|
|
54
|
+
|
|
55
|
+
const browserType = (options as PlaywrightLaunchOptions)?.browser || this.browserType;
|
|
56
|
+
const channel = (options as PlaywrightLaunchOptions)?.channel;
|
|
57
|
+
|
|
58
|
+
let browserEngine: any;
|
|
59
|
+
if (browserType === 'chrome' || browserType === 'msedge') {
|
|
60
|
+
browserEngine = this.playwright.chromium;
|
|
61
|
+
} else if (browserType === 'firefox') {
|
|
62
|
+
browserEngine = this.playwright.firefox;
|
|
63
|
+
} else if (browserType === 'webkit') {
|
|
64
|
+
browserEngine = this.playwright.webkit;
|
|
65
|
+
} else {
|
|
66
|
+
browserEngine = this.playwright[browserType];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const launchOptions: any = {
|
|
70
|
+
headless: options?.headless ?? true,
|
|
71
|
+
executablePath: options?.executablePath,
|
|
72
|
+
args: options?.args,
|
|
73
|
+
timeout: options?.timeoutMs,
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
if (channel) {
|
|
77
|
+
launchOptions.channel = channel;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const browser = await browserEngine.launch(launchOptions);
|
|
81
|
+
|
|
82
|
+
return new PlaywrightBrowser(browser, browserType, this.capabilities);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async connect(options: ConnectOptions): Promise<IBrowser> {
|
|
86
|
+
if (!this.playwright) await this.init();
|
|
87
|
+
|
|
88
|
+
const browser = await this.playwright.chromium.connect({
|
|
89
|
+
wsEndpoint: options.wsEndpoint,
|
|
90
|
+
timeout: options.timeoutMs,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
return new PlaywrightBrowser(browser, this.browserType, this.capabilities);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
unwrap(): any {
|
|
97
|
+
return this.playwright;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
has<C extends string>(cap: C): boolean {
|
|
101
|
+
return (this.capabilities as any)[cap]?.supported === true;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
require<C extends string>(cap: C): void {
|
|
105
|
+
if (!this.has(cap)) {
|
|
106
|
+
const capability = (this.capabilities as any)[cap];
|
|
107
|
+
throw new Error(
|
|
108
|
+
`Driver '${this.name}' does not support capability '${cap}'${
|
|
109
|
+
capability?.reason ? `: ${capability.reason}` : ''
|
|
110
|
+
}`
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { IElementHandle } from '@open-wa/driver-interface';
|
|
2
|
+
import type { ElementHandle } from 'playwright';
|
|
3
|
+
|
|
4
|
+
export class PlaywrightElementHandle implements IElementHandle {
|
|
5
|
+
constructor(private element: ElementHandle) {}
|
|
6
|
+
|
|
7
|
+
async click(): Promise<void> {
|
|
8
|
+
await this.element.click();
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
async type(text: string): Promise<void> {
|
|
12
|
+
await this.element.type(text);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async getAttribute(name: string): Promise<string | null> {
|
|
16
|
+
const value = await this.element.getAttribute(name);
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async textContent(): Promise<string | null> {
|
|
21
|
+
const text = await this.element.textContent();
|
|
22
|
+
return text;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async dispose(): Promise<void> {
|
|
26
|
+
await this.element.dispose();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
unwrap(): ElementHandle {
|
|
30
|
+
return this.element;
|
|
31
|
+
}
|
|
32
|
+
}
|