From d3f0e6ca095e546a71d2792c5fe42974b1d24d11 Mon Sep 17 00:00:00 2001 From: Nikolay Vitkov <34244704+Lightning00Blade@users.noreply.github.com> Date: Mon, 15 Apr 2024 11:20:26 +0200 Subject: [PATCH] feat(webdriver): support Network interception (#12272) The provides support for Network interception for the WebDriver protocol. More information on current state of WebDriver support can be found [here](https://pptr.dev/webdriver-bidi). This is a Puppteer side implementation for the Network interception feature, some vendors may not support all properties that you can send through Puppeteer, please be aware. You should try to display the error in your event handler as so: ```ts page.on('request', request => { void request .continue({ // Your overrides }) .catch(error => { // The error will not propagate to the process console.error(error); // If you want to stop the process in NodeJS also use process.exit(1); }); }); const response = await page.goto(''); ``` The following issues track state of vendor implementation, that Puppeteer relies on: Chrome: https://github.com/GoogleChromeLabs/chromium-bidi/issues/2035 Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=1853882 and https://bugzilla.mozilla.org/show_bug.cgi?id=1850680 Release Notes: feat(webdriver): support page.setExtraHTTPHeaders Source-Link: https://github.com/puppeteer/puppeteer/commit/140f012b518ac6fa0e3586de4e8529508c485f4f feat(webdriver): support priority for request interception Source-Link: https://github.com/puppeteer/puppeteer/commit/08bc8542ea9228fc339367916e8321b7bd0f6767 feat(webdriver): basic support for HTTPRequest.respond() Source-Link: https://github.com/puppeteer/puppeteer/commit/cd881104562f1b3b527f85234344dff47f5e8697 --- docs/webdriver-bidi.md | 38 ++++++++++++++++++++------------------ test/TestExpectations.json | 20 ++++++-------------- 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/docs/webdriver-bidi.md b/docs/webdriver-bidi.md index 266bf018c69..3e41f315c26 100644 --- a/docs/webdriver-bidi.md +++ b/docs/webdriver-bidi.md @@ -18,8 +18,8 @@ Firefox integration is nearing feature parity with its previous CDP-based approa To gauge the capabilities of WebDriver BiDi, we utilized the comprehensive [Puppeteer test suite](https://puppeteer.github.io/ispuppeteerwebdriverbidiready/) -- For Firefox, there are currently under [60](https://puppeteer.github.io/ispuppeteerwebdriverbidiready/firefox-delta.json) failing tests compared to the CDP implementation, while over [82](https://puppeteer.github.io/ispuppeteerwebdriverbidiready/firefox-delta.json) new tests successfully utilize WebDriver BiDi, demonstrating its growing potential. -- For Chrome, around 68% of tests pass with WebDriver BiDi, indicating room for improvement compared to the CDP-based approach. +- For Firefox, there are currently under [30](https://puppeteer.github.io/ispuppeteerwebdriverbidiready/firefox-delta.json) failing tests compared to the CDP implementation, while over [140](https://puppeteer.github.io/ispuppeteerwebdriverbidiready/firefox-delta.json) new tests successfully utilize WebDriver BiDi, demonstrating its growing potential. +- For Chrome, around 85% of tests pass with WebDriver BiDi, indicating room for improvement compared to the CDP-based approach. ## Get started @@ -41,17 +41,28 @@ This is an exciting step towards a more unified and efficient cross-browser auto ## Puppeteer features supported over WebDriver BiDi -- Browser and page automation +- Browser automation + - Puppeteer.launch - Browser.close - - Frame.goto() (except `referer` and `referrerPolicy`) + - Browser.userAgent() + +- Page automation + - Page.bringToFront - Page.goBack() - Page.goForward() - Page.goto (except `referer` and `referrerPolicy`) + - Frame.goto() (except `referer` and `referrerPolicy`) - Page.reload (except for `ignoreCache` parameter) - Page.setViewport (`width`, `height`, `deviceScaleFactor` only) - - Puppeteer.launch + - Page.cookies() + - Page.setCookie() + - Page.deleteCookie() + - Page.workers() + - PageEvent.WorkerCreated + - PageEvent.WorkerDestroyed + - Page.setExtraHTTPHeaders() - [Script evaluation](https://pptr.dev/guides/evaluate-javascript): @@ -100,13 +111,9 @@ This is an exciting step towards a more unified and efficient cross-browser auto - BrowserContext.clearPermissionOverrides() - BrowserContext.overridePermissions() -## Puppeteer features not yet supported over WebDriver BiDi - - [Request interception](https://pptr.dev/guides/request-interception) - - - HTTPRequest.abort() + - HTTPRequest.abort() (no custom error support) - HTTPRequest.abortErrorReason() - - HTTPRequest.client() - HTTPRequest.continue() - HTTPRequest.continueRequestOverrides() - HTTPRequest.failure() @@ -117,6 +124,8 @@ This is an exciting step towards a more unified and efficient cross-browser auto - HTTPRequest.responseForRequest() - Page.setRequestInterception() +## Puppeteer features not yet supported over WebDriver BiDi + - Various emulations (most are supported with Chrome) - Page.emulate() (supported only in Chrome) @@ -134,6 +143,7 @@ This is an exciting step towards a more unified and efficient cross-browser auto - CDP-specific features - Page.createCDPSession() (supported only in Chrome) + - HTTPRequest.client() (supported only in Chrome) - Tracing (supported only in Chrome) - Coverage (supported only in Chrome) @@ -141,7 +151,6 @@ This is an exciting step towards a more unified and efficient cross-browser auto - Other methods: - - Browser.userAgent() - Frame.isOOPFrame() - Frame.waitForDevicePrompt() - HTTPResponse.buffer() @@ -152,8 +161,6 @@ This is an exciting step towards a more unified and efficient cross-browser auto - Input.dragOver() - Input.drop() - Page.authenticate() - - Page.cookies() - - Page.deleteCookie() - Page.emulateNetworkConditions() - Page.isDragInterceptionEnabled() - Page.isJavaScriptEnabled() (supported only in Chrome) @@ -162,15 +169,10 @@ This is an exciting step towards a more unified and efficient cross-browser auto - Page.queryObjects() (supported only in Chrome) - Page.screencast() (supported only in Chrome) - Page.setBypassServiceWorker() - - Page.setCookie() - Page.setDragInterception() - - Page.setExtraHTTPHeaders() - Page.setOfflineMode() - Page.setUserAgent() - Page.waitForDevicePrompt() - Page.waitForFileChooser() - - Page.workers() - PageEvent.popup - - PageEvent.WorkerCreated - - PageEvent.WorkerDestroyed - Target.opener() diff --git a/test/TestExpectations.json b/test/TestExpectations.json index f6cbc8a7d61..ac93862a349 100644 --- a/test/TestExpectations.json +++ b/test/TestExpectations.json @@ -2733,6 +2733,12 @@ "expectations": ["TIMEOUT"], "comment": "When navigating to page with authentication the command response (error) never comes without interception" }, + { + "testIdPattern": "[network.spec] network Page.setExtraHTTPHeaders should throw for non-string header values", + "platforms": ["darwin", "linux", "win32"], + "parameters": ["firefox", "webDriverBiDi"], + "expectations": ["PASS"] + }, { "testIdPattern": "[network.spec] network Page.setExtraHTTPHeaders should work", "platforms": ["darwin", "linux", "win32"], @@ -3980,20 +3986,6 @@ "expectations": ["SKIP"], "comment": "TODO: add a comment explaining why this expectation is required (include links to issues)" }, - { - "testIdPattern": "[waittask.spec] waittask specs Frame.waitForSelector should survive cross-process navigation", - "platforms": ["darwin", "linux", "win32"], - "parameters": ["chrome", "webDriverBiDi"], - "expectations": ["SKIP"], - "comment": "TODO: add a comment explaining why this expectation is required (include links to issues)" - }, - { - "testIdPattern": "[waittask.spec] waittask specs Frame.waitForSelector should survive cross-process navigation", - "platforms": ["darwin", "linux", "win32"], - "parameters": ["firefox", "webDriverBiDi"], - "expectations": ["SKIP"], - "comment": "TODO: add a comment explaining why this expectation is required (include links to issues)" - }, { "testIdPattern": "[waittask.spec] waittask specs Frame.waitForSelector should survive cross-process navigation", "platforms": ["darwin", "linux", "win32"],