Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/playwright-cloudflare/examples/todomvc/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { Fetcher } from '@cloudflare/workers-types';
import { launch, fs } from "@cloudflare/playwright";
import { launch } from "@cloudflare/playwright";
import { expect } from "@cloudflare/playwright/test";
import fs from "@cloudflare/playwright/fs";

interface Env {
MYBROWSER: Fetcher;
Expand Down
1 change: 1 addition & 0 deletions packages/playwright-cloudflare/fs.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from 'fs';
2 changes: 0 additions & 2 deletions packages/playwright-cloudflare/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ import { Playwright, Browser } from './types/types';

export * from './types/types';

export const fs: typeof FS;

/**
* @public
*/
Expand Down
13 changes: 12 additions & 1 deletion packages/playwright-cloudflare/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,18 @@
"import": "./lib/esm/internal.js",
"require": "./lib/cjs/internal.js",
"default": "./lib/esm/internal.js"
}
},
"./fs": {
"types": "./fs.d.ts",
"import": "./lib/esm/bundles/fs.js",
"require": "./lib/cjs/bundles/fs.js",
"default": "./lib/esm/bundles/fs.js"
},
"./lib/*": {
"import": "./lib/esm/playwright-core/src/*.js",
"require": "./lib/cjs/playwright-core/src/*.js",
"default": "./lib/esm/playwright-core/src/*.js"
}
},
"scripts": {
"generate-injected:core": "cd ../.. && node ./utils/generate_injected.js",
Expand Down
3 changes: 0 additions & 3 deletions packages/playwright-cloudflare/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import './patch';
import fs from 'fs';

import { createInProcessPlaywright } from 'playwright-core/lib/inProcessFactory';

Expand All @@ -11,8 +10,6 @@ import { wrapClientApis } from './cloudflare/wrapClientApis';
import { kBrowserCloseMessageId } from 'playwright-core/lib/server/chromium/crConnection';
import { isUnderTest } from 'playwright-core/lib/utils';

export { fs };

const playwright = createInProcessPlaywright();
wrapClientApis();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import { setCurrentTestFile } from '@cloudflare/playwright/internal';
import { test, expect } from '../workerFixtures';
import { launch, connect, sessions, BrowserWorker, Browser, history, acquire } from '@cloudflare/playwright';

setCurrentTestFile("browser-rendering/api.spec.ts");

async function launchAndGetSession(endpoint: BrowserWorker): Promise<[Browser, string]> {
const browser = await launch(endpoint);
const sessionId = (browser as any).__sessionIdForTest;
Expand Down Expand Up @@ -55,5 +52,3 @@ test(`should add new session to history when launching browser`, async ({ env })

await launchedBrowse.close();
});

setCurrentTestFile(undefined);
248 changes: 124 additions & 124 deletions packages/playwright-cloudflare/tests/src/tests.ts
Original file line number Diff line number Diff line change
@@ -1,129 +1,129 @@
import './browser-rendering/api.spec.ts';
import '@cloudflareTests/browser-rendering/api.spec';

import '../workerTests/page/elementhandle-bounding-box.spec.ts';
import '../workerTests/page/elementhandle-click.spec.ts';
import '../workerTests/page/elementhandle-content-frame.spec.ts';
import '../workerTests/page/elementhandle-convenience.spec.ts';
import '../workerTests/page/elementhandle-eval-on-selector.spec.ts';
import '../workerTests/page/elementhandle-misc.spec.ts';
import '../workerTests/page/elementhandle-owner-frame.spec.ts';
import '../workerTests/page/elementhandle-press.spec.ts';
import '../workerTests/page/elementhandle-query-selector.spec.ts';
import '../workerTests/page/elementhandle-screenshot.spec.ts';
import '../workerTests/page/elementhandle-scroll-into-view.spec.ts';
import '../workerTests/page/elementhandle-select-text.spec.ts';
import '../workerTests/page/elementhandle-type.spec.ts';
import '../workerTests/page/elementhandle-wait-for-element-state.spec.ts';
import '../workerTests/page/eval-on-selector-all.spec.ts';
import '../workerTests/page/eval-on-selector.spec.ts';
import '../workerTests/page/expect-boolean.spec.ts';
import '../workerTests/page/expect-matcher-result.spec.ts';
import '../workerTests/page/expect-misc.spec.ts';
import '../workerTests/page/expect-timeout.spec.ts';
import '../workerTests/page/expect-to-have-text.spec.ts';
import '../workerTests/page/expect-to-have-value.spec.ts';
import '../workerTests/page/frame-evaluate.spec.ts';
import '../workerTests/page/frame-frame-element.spec.ts';
import '../workerTests/page/frame-goto.spec.ts';
import '../workerTests/page/frame-hierarchy.spec.ts';
// import '../workerTests/page/interception.spec.ts';
import '../workerTests/page/jshandle-as-element.spec.ts';
import '../workerTests/page/jshandle-evaluate.spec.ts';
import '../workerTests/page/jshandle-json-value.spec.ts';
import '../workerTests/page/jshandle-properties.spec.ts';
import '../workerTests/page/jshandle-to-string.spec.ts';
import '../workerTests/page/locator-click.spec.ts';
import '../workerTests/page/locator-convenience.spec.ts';
import '../workerTests/page/locator-element-handle.spec.ts';
import '../workerTests/page/locator-evaluate.spec.ts';
import '../workerTests/page/locator-frame.spec.ts';
import '../workerTests/page/locator-highlight.spec.ts';
import '../workerTests/page/locator-is-visible.spec.ts';
import '../workerTests/page/locator-list.spec.ts';
import '../workerTests/page/locator-misc-1.spec.ts';
import '../workerTests/page/locator-misc-2.spec.ts';
import '../workerTests/page/locator-query.spec.ts';
import '../workerTests/page/matchers.misc.spec.ts';
import '../workerTests/page/network-post-data.spec.ts';
import '../workerTests/page/page-accessibility.spec.ts';
import '../workerTests/page/page-add-init-script.spec.ts';
import '../workerTests/page/page-add-locator-handler.spec.ts';
import '../workerTests/page/page-add-script-tag.spec.ts';
import '../workerTests/page/page-add-style-tag.spec.ts';
import '../workerTests/page/page-autowaiting-basic.spec.ts';
import '../workerTests/page/page-autowaiting-no-hang.spec.ts';
import '../workerTests/page/page-basic.spec.ts';
import '../workerTests/page/page-check.spec.ts';
import '../workerTests/page/page-click-during-navigation.spec.ts';
import '../workerTests/page/page-click-react.spec.ts';
import '../workerTests/page/page-click-scroll.spec.ts';
import '../workerTests/page/page-click-timeout-1.spec.ts';
import '../workerTests/page/page-click-timeout-2.spec.ts';
import '../workerTests/page/page-click-timeout-3.spec.ts';
import '../workerTests/page/page-click-timeout-4.spec.ts';
import '../workerTests/page/page-click.spec.ts';
import '../workerTests/page/page-close.spec.ts';
import '../workerTests/page/page-dialog.spec.ts';
import '../workerTests/page/page-dispatchevent.spec.ts';
import '../workerTests/page/page-drag.spec.ts';
import '../workerTests/page/page-emulate-media.spec.ts';
import '../workerTests/page/page-evaluate-handle.spec.ts';
import '../workerTests/page/page-evaluate-no-stall.spec.ts';
import '../workerTests/page/page-evaluate.spec.ts';
import '../workerTests/page/page-event-console.spec.ts';
import '../workerTests/page/page-event-load.spec.ts';
import '../workerTests/page/page-event-network.spec.ts';
import '../workerTests/page/page-event-pageerror.spec.ts';
import '../workerTests/page/page-event-popup.spec.ts';
import '../workerTests/page/page-event-request.spec.ts';
import '../workerTests/page/page-expose-function.spec.ts';
import '../workerTests/page/page-fill.spec.ts';
import '../workerTests/page/page-focus.spec.ts';
import '../workerTests/page/page-goto.spec.ts';
import '../workerTests/page/page-history.spec.ts';
import '../workerTests/page/page-keyboard.spec.ts';
// import '../workerTests/page/page-leaks.spec.ts';
import '../workerTests/page/page-mouse.spec.ts';
import '../workerTests/page/page-navigation.spec.ts';
import '../workerTests/page/page-network-idle.spec.ts';
import '../workerTests/page/page-network-request.spec.ts';
import '../workerTests/page/page-network-response.spec.ts';
import '../workerTests/page/page-network-sizes.spec.ts';
import '../workerTests/page/page-object-count.spec.ts';
import '../workerTests/page/page-request-continue.spec.ts';
import '../workerTests/page/page-request-fallback.spec.ts';
import '../workerTests/page/page-request-fulfill.spec.ts';
import '../workerTests/page/page-request-intercept.spec.ts';
import '../workerTests/page/page-route.spec.ts';
// import '../workerTests/page/page-screenshot.spec.ts';
import '../workerTests/page/page-select-option.spec.ts';
import '../workerTests/page/page-set-content.spec.ts';
import '../workerTests/page/page-set-extra-http-headers.spec.ts';
// import '../workerTests/page/page-set-input-files.spec.ts';
import '../workerTests/page/page-strict.spec.ts';
import '../workerTests/page/page-wait-for-function.spec.ts';
import '../workerTests/page/page-wait-for-load-state.spec.ts';
import '../workerTests/page/page-wait-for-navigation.spec.ts';
import '../workerTests/page/page-wait-for-request.spec.ts';
import '../workerTests/page/page-wait-for-response.spec.ts';
import '../workerTests/page/page-wait-for-selector-1.spec.ts';
import '../workerTests/page/page-wait-for-selector-2.spec.ts';
import '../workerTests/page/page-wait-for-url.spec.ts';
import '../workerTests/page/queryselector.spec.ts';
import '../workerTests/page/retarget.spec.ts';
import '../workerTests/page/selectors-css.spec.ts';
import '../workerTests/page/selectors-frame.spec.ts';
import '../workerTests/page/selectors-get-by.spec.ts';
import '../workerTests/page/selectors-misc.spec.ts';
import '../workerTests/page/selectors-react.spec.ts';
import '../workerTests/page/selectors-register.spec.ts';
import '../workerTests/page/selectors-role.spec.ts';
import '../workerTests/page/selectors-text.spec.ts';
import '../workerTests/page/selectors-vue.spec.ts';
import '../workerTests/page/wheel.spec.ts';
import '../workerTests/page/workers.spec.ts';
import '@workerTests/page/elementhandle-bounding-box.spec';
import '@workerTests/page/elementhandle-click.spec';
import '@workerTests/page/elementhandle-content-frame.spec';
import '@workerTests/page/elementhandle-convenience.spec';
import '@workerTests/page/elementhandle-eval-on-selector.spec';
import '@workerTests/page/elementhandle-misc.spec';
import '@workerTests/page/elementhandle-owner-frame.spec';
import '@workerTests/page/elementhandle-press.spec';
import '@workerTests/page/elementhandle-query-selector.spec';
import '@workerTests/page/elementhandle-screenshot.spec';
import '@workerTests/page/elementhandle-scroll-into-view.spec';
import '@workerTests/page/elementhandle-select-text.spec';
import '@workerTests/page/elementhandle-type.spec';
import '@workerTests/page/elementhandle-wait-for-element-state.spec';
import '@workerTests/page/eval-on-selector-all.spec';
import '@workerTests/page/eval-on-selector.spec';
import '@workerTests/page/expect-boolean.spec';
import '@workerTests/page/expect-matcher-result.spec';
import '@workerTests/page/expect-misc.spec';
import '@workerTests/page/expect-timeout.spec';
import '@workerTests/page/expect-to-have-text.spec';
import '@workerTests/page/expect-to-have-value.spec';
import '@workerTests/page/frame-evaluate.spec';
import '@workerTests/page/frame-frame-element.spec';
import '@workerTests/page/frame-goto.spec';
import '@workerTests/page/frame-hierarchy.spec';
// import '@workerTests/page/interception.spec';
import '@workerTests/page/jshandle-as-element.spec';
import '@workerTests/page/jshandle-evaluate.spec';
import '@workerTests/page/jshandle-json-value.spec';
import '@workerTests/page/jshandle-properties.spec';
import '@workerTests/page/jshandle-to-string.spec';
import '@workerTests/page/locator-click.spec';
import '@workerTests/page/locator-convenience.spec';
import '@workerTests/page/locator-element-handle.spec';
import '@workerTests/page/locator-evaluate.spec';
import '@workerTests/page/locator-frame.spec';
import '@workerTests/page/locator-highlight.spec';
import '@workerTests/page/locator-is-visible.spec';
import '@workerTests/page/locator-list.spec';
import '@workerTests/page/locator-misc-1.spec';
import '@workerTests/page/locator-misc-2.spec';
import '@workerTests/page/locator-query.spec';
import '@workerTests/page/matchers.misc.spec';
import '@workerTests/page/network-post-data.spec';
import '@workerTests/page/page-accessibility.spec';
import '@workerTests/page/page-add-init-script.spec';
import '@workerTests/page/page-add-locator-handler.spec';
import '@workerTests/page/page-add-script-tag.spec';
import '@workerTests/page/page-add-style-tag.spec';
import '@workerTests/page/page-autowaiting-basic.spec';
import '@workerTests/page/page-autowaiting-no-hang.spec';
import '@workerTests/page/page-basic.spec';
import '@workerTests/page/page-check.spec';
import '@workerTests/page/page-click-during-navigation.spec';
import '@workerTests/page/page-click-react.spec';
import '@workerTests/page/page-click-scroll.spec';
import '@workerTests/page/page-click-timeout-1.spec';
import '@workerTests/page/page-click-timeout-2.spec';
import '@workerTests/page/page-click-timeout-3.spec';
import '@workerTests/page/page-click-timeout-4.spec';
import '@workerTests/page/page-click.spec';
import '@workerTests/page/page-close.spec';
import '@workerTests/page/page-dialog.spec';
import '@workerTests/page/page-dispatchevent.spec';
import '@workerTests/page/page-drag.spec';
import '@workerTests/page/page-emulate-media.spec';
import '@workerTests/page/page-evaluate-handle.spec';
import '@workerTests/page/page-evaluate-no-stall.spec';
import '@workerTests/page/page-evaluate.spec';
import '@workerTests/page/page-event-console.spec';
import '@workerTests/page/page-event-load.spec';
import '@workerTests/page/page-event-network.spec';
import '@workerTests/page/page-event-pageerror.spec';
import '@workerTests/page/page-event-popup.spec';
import '@workerTests/page/page-event-request.spec';
import '@workerTests/page/page-expose-function.spec';
import '@workerTests/page/page-fill.spec';
import '@workerTests/page/page-focus.spec';
import '@workerTests/page/page-goto.spec';
import '@workerTests/page/page-history.spec';
import '@workerTests/page/page-keyboard.spec';
// import '@workerTests/page/page-leaks.spec';
import '@workerTests/page/page-mouse.spec';
import '@workerTests/page/page-navigation.spec';
import '@workerTests/page/page-network-idle.spec';
import '@workerTests/page/page-network-request.spec';
import '@workerTests/page/page-network-response.spec';
import '@workerTests/page/page-network-sizes.spec';
import '@workerTests/page/page-object-count.spec';
import '@workerTests/page/page-request-continue.spec';
import '@workerTests/page/page-request-fallback.spec';
import '@workerTests/page/page-request-fulfill.spec';
import '@workerTests/page/page-request-intercept.spec';
import '@workerTests/page/page-route.spec';
// import '@workerTests/page/page-screenshot.spec';
import '@workerTests/page/page-select-option.spec';
import '@workerTests/page/page-set-content.spec';
import '@workerTests/page/page-set-extra-http-headers.spec';
// import '@workerTests/page/page-set-input-files.spec';
import '@workerTests/page/page-strict.spec';
import '@workerTests/page/page-wait-for-function.spec';
import '@workerTests/page/page-wait-for-load-state.spec';
import '@workerTests/page/page-wait-for-navigation.spec';
import '@workerTests/page/page-wait-for-request.spec';
import '@workerTests/page/page-wait-for-response.spec';
import '@workerTests/page/page-wait-for-selector-1.spec';
import '@workerTests/page/page-wait-for-selector-2.spec';
import '@workerTests/page/page-wait-for-url.spec';
import '@workerTests/page/queryselector.spec';
import '@workerTests/page/retarget.spec';
import '@workerTests/page/selectors-css.spec';
import '@workerTests/page/selectors-frame.spec';
import '@workerTests/page/selectors-get-by.spec';
import '@workerTests/page/selectors-misc.spec';
import '@workerTests/page/selectors-react.spec';
import '@workerTests/page/selectors-register.spec';
import '@workerTests/page/selectors-role.spec';
import '@workerTests/page/selectors-text.spec';
import '@workerTests/page/selectors-vue.spec';
import '@workerTests/page/wheel.spec';
import '@workerTests/page/workers.spec';

import '../workerTests/library/browsercontext-pages.spec.ts';
import '@workerTests/library/browsercontext-pages.spec';

export const skipTests: string[][] = [
["page/elementhandle-screenshot.spec.ts", "element screenshot", "path option should create subdirectories"], // Error: Error: [unenv] fs.readFile is not implemented yet!
Expand Down
19 changes: 9 additions & 10 deletions packages/playwright-cloudflare/tests/src/testsServer.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { connect, sessions, limits, acquire } from '@cloudflare/playwright';

import { testSuites, TestRunner, setUnderTest } from '@cloudflare/playwright/internal';
import { setAssetsUrl, setCurrentBrowser, setCurrentEnv } from './workerFixtures';
import { setCurrentContext } from './workerFixtures';

import { skipTests } from './tests';

Expand All @@ -21,32 +21,31 @@ const skipTestsFullTitles = new Set(skipTests.map(t => t.join(' > ')));
setUnderTest(true);

export default {

async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
const timeout = url.searchParams.has('timeout') ? parseInt(url.searchParams.get('timeout')!, 10) * 1000 : 10_000;
const sessionId = url.searchParams.get('sessionId') ?? undefined;
const file = url.pathname.substring(1);

const upgradeHeader = request.headers.get('Upgrade');

if (upgradeHeader !== 'websocket') {
const suites = await testSuites();
const response = file ? suites.find(s => s.file === file) : suites;
return response ? Response.json(response) : new Response('Not found', { status: 404 });
}

const webSocketPair = new WebSocketPair();
const [client, server] = Object.values(webSocketPair);
server.accept();

setCurrentEnv(env);

const browser = await connectBrowser(env, sessionId);
setCurrentBrowser(browser);
// we need to run browser rendering in dev remote mode,
// so URL will ne a public one which is what we need
setAssetsUrl(url.origin);
const assetsUrl = url.origin;

setCurrentContext({ env, browser, assetsUrl });

const testRunner = new TestRunner({ timeout });

Expand All @@ -60,14 +59,14 @@ export default {
}

console.log(`🧪 Running ${fullTitle}`);

testRunner.runTest(file, testId)
.then(result => send(server, result))
.catch(e => server.close(1011, e.message));
});
server.addEventListener('close', () => {
browser.close().catch(e => console.error(e));
setCurrentBrowser(undefined);
setCurrentContext(undefined);
});

return new Response(null, {
Expand Down
Loading