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

For a normal local Selenium session, do not set debuggerAddress. Create Chrome options and pass them to ChromeDriver; ChromeDriver will launch a new Chrome process. The capability is only for attaching to a Chrome instance that was already started with a DevTools debugging port. If you are using Selenium Grid, supply the Grid server URL to Remote WebDriver instead— that URL is not a debugger address.

What debuggerAddress actually controls

ChromeDriver supports two different session-creation patterns:

  • Launch mode: ChromeDriver starts Chrome, loads its automation extension, and owns the new WebDriver session.
  • Attach mode: ChromeDriver connects to an existing Chrome process through that process’s DevTools debugging server.

debuggerAddress belongs to the second pattern. It is a Chrome-specific capability containing a host and port such as 127.0.0.1:9222. It is not a required HTTP header, not a universal Selenium setting, and not the address of a Selenium Grid.

For a fresh local browser, leaving the capability out is the documented Selenium workflow. Selenium 4 uses browser-options objects for browser-specific capabilities, so the absence of debuggerAddress is intentional, not an incomplete configuration.

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.

Start a fresh local Chrome session

Python

Install Selenium 4 in the environment that will run the test:

python -m pip install -U selenium

This example launches Chrome, navigates to a page, reads its title, and closes the session. There is no debugger address anywhere in the configuration.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
# Add ordinary Chrome arguments here only when you need them.
# options.add_argument("--headless=new")

with webdriver.Chrome(options=options) as driver:
    driver.get("https://example.com")
    print(driver.title)

webdriver.Chrome(options=options) starts a local ChromeDriver-managed session. Selenium Manager can obtain a compatible driver in current Selenium 4 releases; in a managed environment you can also place a matching ChromeDriver on PATH.

Java

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class FreshChrome {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        // options.addArguments("--headless=new");

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

Do not add a capability named debuggerAddress to this launch-mode code. If you need a headless browser, proxy, user-agent, window size, or download preference, configure that through the appropriate ChromeOptions setting instead.

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

When attaching to an existing Chrome is appropriate

Attach mode is useful when another process has already launched Chrome and you must reuse that exact profile, logged-in state, or manually prepared window. The Chrome process must be started with remote debugging enabled, and ChromeDriver must be given the debugging host and port.

The exact launch command depends on your operating system and Chrome installation. Conceptually, it looks like this:

chrome --remote-debugging-port=9222 --user-data-dir=/tmp/selenium-profile

Then configure the capability through Chrome options:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

driver = webdriver.Chrome(options=options)
try:
    driver.get("https://example.com")
finally:
    driver.quit()

Use a profile directory that is not simultaneously in use by your normal Chrome installation. Reusing a live personal profile can cause profile-lock errors, data corruption, or unexpected tabs. Also make sure the debugging port is reachable from the machine running ChromeDriver; a port exposed beyond the local machine can give other processes control of the browser.

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

Why attached sessions can fail on otherwise valid commands

ChromeDriver loads an automation extension when it launches a new Chrome session. That extension supports some WebDriver operations, including browser-window resizing. An already-running Chrome process was not started with that extension, so certain commands can be unavailable in attach mode.

A common symptom is an error containing operation not supported when using remote debugging. ChromeDriver’s documented remedy is to rewrite the test so it launches a new Chrome session: remove the debuggerAddress capability and create the driver normally. This is the most reliable fix when you do not genuinely need an existing browser.

Do not work around the message by changing the Grid URL or by sending debuggerAddress as a request header. Those are different connection layers.

Local ChromeDriver versus Selenium Grid

“Without a debugger address” can also be confused with remote execution. A Selenium Grid session uses a Remote WebDriver URL, such as the endpoint supplied by your Grid or hosted provider. Your client sends WebDriver commands to that server and supplies browser options describing the desired browser.

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

Python Remote WebDriver example

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
# options.add_argument("--headless=new")

driver = webdriver.Remote(
    command_executor="http://grid-host:4444",
    options=options,
)
try:
    driver.get("https://example.com")
    print(driver.title)
finally:
    driver.quit()

Replace http://grid-host:4444 with the actual Grid URL for your environment. Do not put that URL in debuggerAddress; the Grid endpoint and Chrome’s DevTools endpoint are not interchangeable.

Java Remote WebDriver example

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

ChromeOptions options = new ChromeOptions();
WebDriver driver = new RemoteWebDriver(
    new URL("http://grid-host:4444"), options);
try {
    driver.get("https://example.com");
    System.out.println(driver.getTitle());
} finally {
    driver.quit();
}

The client still supplies an options instance for the browser. The Grid server then starts or allocates the browser on its node. Whether a node internally uses a debugging port is an implementation detail, not something your test should normally set.

Choosing the correct setup

Goal Driver construction Set debuggerAddress?
Start a new local Chrome webdriver.Chrome(options=options) or new ChromeDriver(options) No
Reuse an already running Chrome Chrome options with the DevTools host and port Yes
Run on Selenium Grid Remote WebDriver with the Grid URL and options No, unless a specific remote design explicitly requires attach mode

Choose based on who owns the browser process. If ChromeDriver should create and control it, use launch mode. If another process must remain the owner, use attach mode and accept that some commands may not be available.

Troubleshooting checklist

“Chrome failed to start” or the driver exits immediately

  • Confirm Chrome is installed and executable by the account running the test.
  • Use Selenium 4 and a browser/driver combination supported by your environment.
  • On a server, try the browser’s supported headless argument and provide a writable user-data directory.
  • Check that another process is not locking the profile directory.

“cannot connect to chrome at 127.0.0.1:9222”

  • Start Chrome with remote debugging enabled before constructing the driver.
  • Verify the host and port in debuggerAddress exactly match the running process.
  • Do not confuse the Chrome debugging port with the Grid’s WebDriver port.
  • Ensure a firewall, container network, or namespace is not hiding the port from ChromeDriver.

“operation not supported when using remote debugging”

The session is attached to an existing Chrome without ChromeDriver’s startup automation extension. Remove debuggerAddress and launch a new session. If attachment is mandatory, redesign the test around commands available in that mode rather than assuming every launch-mode command will work.

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

The test opens the wrong tab or profile

An attached browser may already contain several windows and tabs. Inspect the window handles and switch explicitly, or start a clean browser with a dedicated profile. Avoid attaching to a human’s everyday browser during automated tests.

The Grid session is rejected

Check the remote endpoint, credentials, network route, and browser options expected by the Grid provider. A Grid URL belongs in webdriver.Remote or RemoteWebDriver; putting it in Chrome’s debuggerAddress capability produces the wrong protocol flow.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Reliability and maintenance considerations

Launch mode gives each test a clearly defined browser owner and a repeatable starting state. Use a temporary profile, create the driver in setup, and call quit() in teardown. This avoids stale tabs and state leaking between tests.

Attach mode can preserve valuable state, but it couples the test to an external process, its lifetime, its profile, and its port. A manually closed browser, a changed port, or a profile lock can invalidate the session before the first assertion. It also has the documented command limitations caused by the missing startup extension. There is no official general performance or reliability ranking between the two modes; select the mode that matches your ownership requirement.

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

Or skip the browser setup

If your actual requirement is to obtain a clean image or PDF of a URL—not to interact with a live WebDriver session—ScreenshotNeo provides a one-request screenshot API. Its cleanup steps accept cookie or consent banners and remove more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be disabled. Bot checks, CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and the response identifies the page verdict and billing status in headers.

cURL (see the ScreenshotNeo API documentation):

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

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)

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}`);

ScreenshotNeo also offers an MCP server with take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients. Every plan includes its features; 1,000 screenshots per month are free without a card, and paid plans start at $5 for 3,000 screenshots. If that fits your task, sign up for the free 1,000-screenshot plan.

Frequently Asked Questions

Can I omit all Chrome options as well as debuggerAddress?

Yes. Selenium can construct a default Chrome session, although an explicit options object is useful when you need headless mode, a profile, proxy, or other browser settings.

Does removing debuggerAddress log me out of websites?

A newly launched session normally uses a fresh or test profile, so it will not inherit the cookies from an already running personal Chrome profile. If preserving that state is essential, attach deliberately or provide a controlled profile.

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.

Is a DevTools port the same as a WebDriver port?

No. The DevTools port is used by ChromeDriver to attach to Chrome; a WebDriver or Grid URL is the server endpoint that accepts Selenium commands.

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.