Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Short answer: a Selenium Grid URL and Chrome’s remote-debugging address are different endpoints. Use the Grid URL (commonly http://grid-host:4444) to create and control a remote WebDriver session. Use Chrome’s debugging address (for example, grid-host:9222 when Chrome was explicitly started with remote debugging enabled) to inspect a browser target through DevTools. Opening the Grid page will not automatically open the headless browser’s DevTools.

Understand which “debugging page” you need

Selenium documentation describes RemoteWebDriver as a client on one machine controlling a browser on another. The client sends commands to a Selenium server or Grid; the Grid then creates or routes a browser session on a node. Chrome’s remote-debugging service is a separate browser-level interface based on the Chrome DevTools Protocol (CDP).

Goal Address or API What it shows
Check Grid health, nodes, slots, and session state Grid server address, such as http://grid-host:4444, and /status Grid deployment information and WebDriver availability
Inspect a particular Chrome target with browser DevTools Chrome’s remote-debugging service, at the host and port used when Chrome was launched Browser-level targets and DevTools functionality; the exact frontend URL depends on the deployment

A standalone Selenium Grid listens on http://localhost:4444 by default according to the Selenium Project’s Grid documentation. That page and its status endpoint are not established as Chrome’s DevTools page. Selenium’s JavaScript Chromium API documents a debuggerAddress such as localhost:9222; that is the address of a Chromium remote-debugging server, not the Grid endpoint.

Prerequisites and network assumptions

  • A Selenium server or Grid is running on the machine or cluster that can launch Chrome.
  • The client can reach the Grid hostname and port. Do not use localhost unless the client process and Grid share that network namespace.
  • Chrome and ChromeDriver major versions match. Selenium calls this out in its Chrome-specific documentation.
  • Chrome is started with remote debugging enabled if you intend to attach to its debugging service. A normal WebDriver session does not, by itself, prove that a debugging port is exposed.
  • Firewall, container, Kubernetes, or SSH routing allows the required client-to-Grid and, separately, client-to-debugger paths. Do not expose a debugging port publicly without an access-control design.

Selenium’s Grid getting-started guide lists Java 11 or newer, a browser, and a driver among its setup requirements. Selenium Manager can configure drivers when enabled, but the browser and server topology still determine which addresses are reachable.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Start a remote headless session through Selenium Grid

First create the session through the Grid. The following Java pattern uses a reachable Grid URL and Chrome’s headless flag. It is an illustrative pattern; adapt the URL, credentials, capabilities, and deployment-specific routing to your environment.

  1. Start or obtain a standalone Grid, Hub/Node deployment, or distributed Grid on the host that runs Chrome.
  2. Set gridUrl to the hostname visible from the process running your test.
  3. Create ChromeOptions and add the headless argument.
  4. Construct RemoteWebDriver, navigate to the page, and perform your checks.
  5. Always call quit() so the Grid can release the slot.

Selenium’s Remote WebDriver guide shows the same separation: the remote server URL is supplied to the driver while browser options describe the requested session.

import java.net.URL;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebDriver;

public class RemoteHeadless {
  public static void main(String[] args) throws Exception {
    URL gridUrl = new URL("http://grid-host:4444");
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--headless=new");

    WebDriver driver = new RemoteWebDriver(gridUrl, options);
    try {
      driver.get("https://example.com");
      System.out.println(driver.getTitle());
    } finally {
      driver.quit();
    }
  }
}

The headless flag controls how Chrome renders; it does not create a browser DevTools page. A session can be healthy while no remotely reachable CDP endpoint exists.

Attach Selenium to an existing Chrome debugging address

Use this route only when Chrome was launched with a remote-debugging server and the process using Selenium can reach that server. In Selenium’s JavaScript Chromium API, debuggerAddress accepts a hostname:port value. The documented example is localhost:9222; replace it with an address that is meaningful from your runtime.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');

(async function attach() {
  const options = new chrome.Options();
  options.debuggerAddress('browser-host:9222');

  const driver = await new Builder()
    .forBrowser('chrome')
    .setChromeOptions(options)
    .build();

  try {
    console.log(await driver.getTitle());
  } finally {
    await driver.quit();
  }
})();

The API reference is at selenium.dev’s Chromium API documentation. This mechanism is not the same as passing a Grid URL to RemoteWebDriver. In a remote deployment, browser-host:9222 must resolve and route from the process that uses the option; a port reachable only inside a browser container will not work from your laptop.

The exact Chrome launch command, target-discovery path, tunneling method, authentication, and firewall policy vary by bare-metal host, Docker, Kubernetes, CI runner, and hosted browser service. Confirm the endpoint in that environment rather than assuming that one universal URL will open the desired tab.

Grid topologies and the address you should use

Standalone Grid

Standalone runs the Grid and browser components together and is the simplest single-machine arrangement. Use its server address for WebDriver creation and its UI or /status endpoint for Grid diagnostics.

Hub and Node

A Hub accepts sessions and routes them to one or more Nodes. The client normally connects to the Hub’s advertised URL, while the Node launches Chrome. A Chrome debugging port on a Node is a separate route and may not be reachable from the client unless your network explicitly permits it.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Distributed deployments

Separate Router, Distributor, Session Map, Event Bus, and Node services can use multiple ports and hosts. Follow the topology and port guidance in Selenium’s Grid documentation. Diagnose each hop independently: client to Grid, Grid to Node, Node to Chrome, and (if required) client to Chrome’s debugger.

Choosing CDP or WebDriver BiDi

CDP is Chrome-specific and version-sensitive. Selenium warns that its CDP support is not designed as a stable testing API and that available features depend heavily on the browser version. The Selenium Chrome DevTools Protocol page documents the supported, generated interfaces.

Use CDP when you specifically need Chrome features such as browser-level network or console instrumentation and your Chrome/Selenium versions support the required domain. For cross-browser event streaming and longer-term standards alignment, evaluate WebDriver BiDi, which Selenium presents as the standards-based direction in its WebDriver documentation. Verify the exact binding and browser support before committing to an API.

How to diagnose the most common failures

The Grid page opens, but there is no DevTools view

You opened the Grid service, not Chrome’s debugger. Use the browser’s configured debugging address and ensure that Chrome was launched with remote debugging enabled. The Grid UI reports Grid state; it is not proof that a browser target is exposed.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

localhost:4444 or localhost:9222 points to the wrong machine

localhost always means the machine or container where the connecting process runs. Replace it with a routable hostname or IP, or provide an intentional tunnel. Check DNS, container network membership, firewall rules, and listening sockets on the destination.

Session creation returns a connection or timeout error

  • Confirm the Grid URL and port from the client’s network namespace.
  • Open the Grid status endpoint and verify that a Node and matching browser are available.
  • Check that Chrome and ChromeDriver major versions match.
  • Inspect Grid and Node logs for rejected capabilities, exhausted slots, or a crashed browser.

The debugger address is refused

Chrome may not have been started with remote debugging, the port may be bound only to an inaccessible interface, a container port may not be published, or a firewall may block it. Fix the deployment’s routing and access controls; do not assume that adding a Selenium capability can create an absent server.

CDP commands fail after a browser upgrade

CDP domains and Selenium’s generated bindings track browser versions. Check the Selenium and Chrome versions, select the supported CDP version, or move the use case to WebDriver BiDi where the required capability is available.

The code works locally but not in CI

CI often changes network namespaces, user permissions, browser binaries, and available shared memory. Log the effective Grid URL, browser version, driver version, session capabilities, and the hostname from which the debugger address is resolved. Keep secrets out of logs.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Reliability, performance, and security considerations

  • Keep paths explicit: treat Grid control traffic and CDP traffic as separate dependencies with separate health checks.
  • Use stable hostnames: avoid hard-coding ephemeral container IPs; route through the service name or controlled proxy appropriate to your platform.
  • Limit exposure: a debugging endpoint can provide powerful browser control. Restrict it to trusted networks, authenticate at the proxy where supported, and avoid public exposure.
  • Match capacity to parallelism: Grid slots, CPU, RAM, and browser startup time determine how many sessions can run reliably. Distributed Grid helps when you need multiple machines or browser/OS combinations.
  • Clean up sessions: use a finally block and quit drivers even after assertion failures.
  • Record versions: Chrome, ChromeDriver, Selenium, and CDP compatibility should be part of your build diagnostics.

Or skip the browser setup

If your goal is simply a clean screenshot or PDF of a remote page rather than interactive Selenium debugging, ScreenshotNeo provides a single HTTP request. It removes cookie/consent banners, newsletter popups, and chat widgets before capture; bot checks, blank pages, failed loads, timeouts, and cache hits are not billed, with the result identified by response headers. Its MCP server provides take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients.

See the complete parameter and response documentation at ScreenshotNeo’s API docs. This cURL request captures Stripe as WebP:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Equivalent Python:

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Equivalent Node.js:

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

Every plan includes the features; the Free plan provides 1,000 screenshots per month without a card, and paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account.

Frequently asked questions

Can Selenium open Chrome’s DevTools UI in headless mode?

Headless mode removes the normal visible window. You can connect to Chrome’s remote-debugging service when it is enabled and reachable, but the exact DevTools frontend URL and target exposure depend on how Chrome is launched and networked.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Is port 9222 mandatory?

No. Selenium’s JavaScript documentation uses localhost:9222 as an example. The actual debugging port is whichever port your Chrome deployment configures and exposes.

Can I use the Grid URL as debuggerAddress?

No. The Grid URL creates and manages WebDriver sessions; debuggerAddress identifies a Chromium remote-debugging server.

Should new projects use CDP or BiDi?

Choose based on the required browser features and binding support. CDP is Chrome-specific and version-dependent; BiDi is Selenium’s standards-based cross-browser direction.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.