Skip to content

[🐛 Bug]: [nodejs][bidi] MaxListenersExceededWarning when calling network.continueRequest() in beforeRequestSent #17380

@vitalets

Description

@vitalets

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();

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-nodejsJavaScript BindingsI-defectSomething is not working as intended

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions