Description
Using BiDi network interception in JavaScript bindings, a single page navigation can trigger MaxListenersExceededWarning from Node.js.
What I was trying to do:
- Intercept requests with
BEFORE_REQUEST_SENT
- Immediately call
network.continueRequest() without modifying the request
Expected behavior:
- Navigation succeeds without Node listener warnings
Actual behavior:
- Node emits
MaxListenersExceededWarning from Selenium BiDi internals while handling the intercepted requests
Relevant context:
- Repro is a single self-contained script
- Browser used in repro: Firefox with BiDi enabled
- Site used for repro navigation:
https://www.selenium.dev/
Observed warning:
(node:47356) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 message listeners added to [WebSocket]. MaxListeners is 10.
at /.../node_modules/selenium-webdriver/bidi/index.js:117:32
at Index.send (/.../node_modules/selenium-webdriver/bidi/index.js:97:12)
at Network.continueRequest (/.../node_modules/selenium-webdriver/bidi/network.js:320:21)
Reproducible Code
// Run with:
// node --trace-warnings test/max-listeners-repro.js
import { Builder, By, until } from 'selenium-webdriver';
import { Network as getNetwork } from 'selenium-webdriver/bidi/network.js';
import { AddInterceptParameters } from 'selenium-webdriver/bidi/addInterceptParameters.js';
import { ContinueRequestParameters } from 'selenium-webdriver/bidi/continueRequestParameters.js';
import { InterceptPhase } from 'selenium-webdriver/bidi/interceptPhase.js';
import firefox from 'selenium-webdriver/firefox.js';
const driver = await new Builder()
.forBrowser('firefox')
.setFirefoxOptions(new firefox.Options().enableBidi())
.build();
const network = await getNetwork(driver);
await network.addIntercept(new AddInterceptParameters(InterceptPhase.BEFORE_REQUEST_SENT));
await network.beforeRequestSent(async (event) => {
const requestId = event.request.request;
const params = new ContinueRequestParameters(requestId);
await network.continueRequest(params);
});
await driver.get('https://www.selenium.dev/');
await driver.wait(until.elementLocated(By.css('body')), 5000);
await driver.quit();
Description
Using BiDi network interception in JavaScript bindings, a single page navigation can trigger
MaxListenersExceededWarningfrom Node.js.What I was trying to do:
BEFORE_REQUEST_SENTnetwork.continueRequest()without modifying the requestExpected behavior:
Actual behavior:
MaxListenersExceededWarningfrom Selenium BiDi internals while handling the intercepted requestsRelevant context:
https://www.selenium.dev/Observed warning:
Reproducible Code
// Run with: // node --trace-warnings test/max-listeners-repro.js import { Builder, By, until } from 'selenium-webdriver'; import { Network as getNetwork } from 'selenium-webdriver/bidi/network.js'; import { AddInterceptParameters } from 'selenium-webdriver/bidi/addInterceptParameters.js'; import { ContinueRequestParameters } from 'selenium-webdriver/bidi/continueRequestParameters.js'; import { InterceptPhase } from 'selenium-webdriver/bidi/interceptPhase.js'; import firefox from 'selenium-webdriver/firefox.js'; const driver = await new Builder() .forBrowser('firefox') .setFirefoxOptions(new firefox.Options().enableBidi()) .build(); const network = await getNetwork(driver); await network.addIntercept(new AddInterceptParameters(InterceptPhase.BEFORE_REQUEST_SENT)); await network.beforeRequestSent(async (event) => { const requestId = event.request.request; const params = new ContinueRequestParameters(requestId); await network.continueRequest(params); }); await driver.get('https://www.selenium.dev/'); await driver.wait(until.elementLocated(By.css('body')), 5000); await driver.quit();