Network

Commands

This section contains the APIs related to network commands.

Add network intercept

Selenium v4.18

    void canAddIntercept() {
        try (Network network = new Network(driver)) {
            String intercept =
                    network.addIntercept(new AddInterceptParameters(InterceptPhase.BEFORE_REQUEST_SENT));
            Assertions.assertNotNull(intercept);
        }
    }

Selenium v4.18

    wait.until { response_events.any? }
    
    expect(response_events).not_to be_empty
  end

  it 'continues network request' do

Selenium v4.18

    const intercept = await network.addIntercept(new AddInterceptParameters(InterceptPhase.BEFORE_REQUEST_SENT))
    assert.notEqual(intercept, null)
  })

Selenium v4.18

def test_intercept_network_requests(driver):
    request_events = []

    def on_request(event):
        request_events.append(event)

    driver.bidi_connection.add_network_request_listener(on_request)

    driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html")

    wait = WebDriverWait(driver, 5)
    wait.until(lambda _: len(request_events) > 0)

    assert len(request_events) > 0

Remove network intercept

Selenium v4.18

    void canRemoveIntercept() {
        try (Network network = new Network(driver)) {
            String intercept =
                    network.addIntercept(new AddInterceptParameters(InterceptPhase.BEFORE_REQUEST_SENT));
            Assertions.assertNotNull(intercept);
            network.removeIntercept(intercept);
        }
    }

Selenium v4.18

    const network = await Network(driver)
    const intercept = await network.addIntercept(new AddInterceptParameters(InterceptPhase.BEFORE_REQUEST_SENT))
    assert.notEqual(intercept, null)

    await network.removeIntercept(intercept)
  })

Selenium v4.18

def test_intercept_network_requests(driver):
    request_events = []

    def on_request(event):
        request_events.append(event)

    driver.bidi_connection.add_network_request_listener(on_request)

    driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html")

    wait = WebDriverWait(driver, 5)
    wait.until(lambda _: len(request_events) > 0)

    assert len(request_events) > 0

Continue request blocked at authRequired phase with credentials

Selenium v4.18

    @Test
    void canContinueWithAuthCredentials() {
        try (Network network = new Network(driver)) {
            network.addIntercept(new AddInterceptParameters(InterceptPhase.AUTH_REQUIRED));
            network.onAuthRequired(
                    responseDetails ->
                            network.continueWithAuth(
                                    responseDetails.getRequest().getRequestId(),
                                    new UsernameAndPassword("admin", "admin")));
            driver.get("https://the-internet.herokuapp.com/basic_auth");
            String successMessage = "Congratulations! You must have the proper credentials.";
            WebElement elementMessage = driver.findElement(By.tagName("p"));
            Assertions.assertEquals(successMessage, elementMessage.getText());
        }
    }

Selenium v4.18

    await network.addIntercept(new AddInterceptParameters(InterceptPhase.AUTH_REQUIRED))

    await network.authRequired(async (event) => {
      await network.continueWithAuth(event.request.request, 'admin','admin')
    })
    await driver.get('https://the-internet.herokuapp.com/basic_auth')

    const successMessage = 'Congratulations! You must have the proper credentials.'

    let elementMessage = await driver.findElement(By.tagName('p')).getText()
    assert.equal(elementMessage, successMessage)
  })

Selenium v4.18

    auth_events = []

    def on_auth_required(event):
        auth_events.append(event)

    driver.bidi_connection.add_auth_required_listener(on_auth_required)

Continue request blocked at authRequired phase without credentials

Selenium v4.18

    @Test
    void canContinueWithoutAuthCredentials() {
        try (Network network = new Network(driver)) {
            network.addIntercept(new AddInterceptParameters(InterceptPhase.AUTH_REQUIRED));
            network.onAuthRequired(
                    responseDetails ->
                            // Does not handle the alert
                            network.continueWithAuthNoCredentials(responseDetails.getRequest().getRequestId()));
            driver.get("https://the-internet.herokuapp.com/basic_auth");
            Alert alert = wait.until(ExpectedConditions.alertIsPresent());
            alert.dismiss();
            Assertions.assertTrue(driver.getPageSource().contains("Not authorized"));
        }
    }

Selenium v4.18

    await network.addIntercept(new AddInterceptParameters(InterceptPhase.AUTH_REQUIRED))

    await network.authRequired(async (event) => {
      await network.continueWithAuthNoCredentials(event.request.request)
    })

    await driver.get('https://the-internet.herokuapp.com/basic_auth')
    const alert = await driver.wait(until.alertIsPresent())
    await alert.dismiss()

    let source = await driver.getPageSource()
    assert.equal(source.includes('Not authorized'), true)
  })

Cancel request blocked at authRequired phase

Selenium v4.18

    void canCancelAuth() {
        try (Network network = new Network(driver)) {
            network.addIntercept(new AddInterceptParameters(InterceptPhase.AUTH_REQUIRED));
            network.onAuthRequired(
                    responseDetails ->
                            // Does not handle the alert
                            network.cancelAuth(responseDetails.getRequest().getRequestId()));
            driver.get("https://the-internet.herokuapp.com/basic_auth");
            Assertions.assertTrue(driver.getPageSource().contains("Not authorized"));
        }
    }

Selenium v4.18

    await network.addIntercept(new AddInterceptParameters(InterceptPhase.AUTH_REQUIRED))

    await network.authRequired(async (event) => {
      await network.cancelAuth(event.request.request)
    })

    await driver.get('https://the-internet.herokuapp.com/basic_auth')
    let source = await driver.getPageSource()
    assert.equal(source.includes('Not authorized'), true)
  })
})

Fail request

Selenium v4.18

    void canFailRequest() {
        try (Network network = new Network(driver)) {
            network.addIntercept(new AddInterceptParameters(InterceptPhase.BEFORE_REQUEST_SENT));
            network.onBeforeRequestSent(
                    responseDetails -> network.failRequest(responseDetails.getRequest().getRequestId()));
            driver.manage().timeouts().pageLoadTimeout(Duration.of(5, ChronoUnit.SECONDS));
            Assertions.assertThrows(TimeoutException.class, () -> driver.get("https://the-internet.herokuapp.com/basic_auth"));
            }
    }
}

Events

This section contains the APIs related to network events.

Before Request Sent

Selenium v4.15

    void canListenToBeforeRequestSentEvent()
            throws ExecutionException, InterruptedException, TimeoutException {
        try (Network network = new Network(driver)) {
            CompletableFuture<BeforeRequestSent> future = new CompletableFuture<>();
            network.onBeforeRequestSent(future::complete);
            driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html");

            BeforeRequestSent requestSent = future.get(5, TimeUnit.SECONDS);
            String windowHandle = driver.getWindowHandle();
            Assertions.assertEquals(windowHandle, requestSent.getBrowsingContextId());
            Assertions.assertEquals("get", requestSent.getRequest().getMethod().toLowerCase());
        }
    }

Selenium v4.15

    driver.network.add_authentication_handler('test', 'test')
    driver.navigate.to url_for('basicAuth')
    expect(driver.find_element(tag_name: 'h1').text).to eq('authorized')
  end

  it 'intercepts network requests' do
    request_events = []
    
    driver.bidi_connection.add_network_request_listener do |event|
      request_events << event
    end
    
    driver.navigate.to 'https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html'

Selenium v4.18

  it('can listen to event before request is sent', async function () {
    let beforeRequestEvent = []
    const network = await Network(driver)
    await network.beforeRequestSent(function (event) {
      beforeRequestEvent.push(event)
    })

    await driver.get('https://www.selenium.dev/selenium/web/blank.html')

    const currentUrl = await driver.getCurrentUrl()
    const currentUrlFound = beforeRequestEvent.some(event => event.request.url.includes(currentUrl))
    assert(currentUrlFound, `${currentUrl} was not requested`)
  })

Selenium v4.15

def test_intercept_network_requests(driver):
    request_events = []

    def on_request(event):
        request_events.append(event)

    driver.bidi_connection.add_network_request_listener(on_request)

    driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html")

    wait = WebDriverWait(driver, 5)
    wait.until(lambda _: len(request_events) > 0)

    assert len(request_events) > 0

Response Started

Selenium v4.15

    void canListenToResponseStartedEvent()
            throws ExecutionException, InterruptedException, TimeoutException {
        try (Network network = new Network(driver)) {
            CompletableFuture<ResponseDetails> future = new CompletableFuture<>();
            network.onResponseStarted(future::complete);
            driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html");

            ResponseDetails response = future.get(5, TimeUnit.SECONDS);
            String windowHandle = driver.getWindowHandle();

            Assertions.assertEquals(windowHandle, response.getBrowsingContextId());
            Assertions.assertEquals("get", response.getRequest().getMethod().toLowerCase());
            Assertions.assertEquals(200L, response.getResponseData().getStatus());
        }
    }

Selenium v4.15

    wait.until { request_events.any? }
    
    expect(request_events).not_to be_empty
  end

  it 'intercepts network responses' do
    response_events = []
    
    driver.bidi_connection.add_network_response_listener do |event|
      response_events << event
    end
    
    driver.navigate.to 'https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html'

Selenium v4.18

    let onResponseStarted = []
    const network = await Network(driver)
    await network.responseStarted(function (event) {
      onResponseStarted.push(event)
    })

    await driver.get('https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html')

    assert.equal(onResponseStarted[0].request.method, 'GET')
    assert.equal(onResponseStarted[0].request.url, await driver.getCurrentUrl())
    assert.equal(onResponseStarted[0].response.url, await driver.getCurrentUrl())
  })

Selenium v4.15

def test_intercept_network_responses(driver):
    response_events = []

    def on_response(event):
        response_events.append(event)

    driver.bidi_connection.add_network_response_listener(on_response)

    driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html")

    wait = WebDriverWait(driver, 5)
    wait.until(lambda _: len(response_events) > 0)

    assert len(response_events) > 0

Response Completed

Selenium v4.15

    void canListenToResponseCompletedEvent()
            throws ExecutionException, InterruptedException, TimeoutException {
        try (Network network = new Network(driver)) {
            CompletableFuture<ResponseDetails> future = new CompletableFuture<>();
            network.onResponseCompleted(future::complete);
            driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html");

            ResponseDetails response = future.get(5, TimeUnit.SECONDS);
            String windowHandle = driver.getWindowHandle();

            Assertions.assertEquals(windowHandle, response.getBrowsingContextId());
            Assertions.assertEquals("get", response.getRequest().getMethod().toLowerCase());
            Assertions.assertEquals(200L, response.getResponseData().getStatus());
        }
    }

Selenium v4.18

  it('can subscribe to response completed', async function () {
    let onResponseCompleted = []
    const network = await Network(driver)
    await network.responseCompleted(function (event) {
      onResponseCompleted.push(event)
    })

    await driver.get('https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html')

    assert.equal(onResponseCompleted[0].request.method, 'GET')
    assert.equal(onResponseCompleted[0].request.url, await driver.getCurrentUrl())
    assert.equal(onResponseCompleted[0].response.fromCache, false)

Selenium v4.15

def test_intercept_network_requests(driver):
    request_events = []

    def on_request(event):
        request_events.append(event)

    driver.bidi_connection.add_network_request_listener(on_request)

    driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html")

    wait = WebDriverWait(driver, 5)
    wait.until(lambda _: len(request_events) > 0)

    assert len(request_events) > 0

Auth Required

Selenium v4.17

    void canListenToOnAuthRequiredEvent()
            throws ExecutionException, InterruptedException, TimeoutException {
        try (Network network = new Network(driver)) {
            CompletableFuture<ResponseDetails> future = new CompletableFuture<>();
            network.onAuthRequired(future::complete);
            driver.get("https://the-internet.herokuapp.com/basic_auth");

            ResponseDetails response = future.get(5, TimeUnit.SECONDS);
            String windowHandle = driver.getWindowHandle();
            Assertions.assertEquals(windowHandle, response.getBrowsingContextId());
            Assertions.assertEquals("get", response.getRequest().getMethod().toLowerCase());
            Assertions.assertEquals(401L, response.getResponseData().getStatus());
        }
    }
}

Selenium v4.17

    end
    
    driver.navigate.to 'https://www.selenium.dev/selenium/web/iframes.html'
  end
end

Selenium v4.17

    auth_events = []

    def on_auth_required(event):
        auth_events.append(event)

    driver.bidi_connection.add_auth_required_listener(on_auth_required)
Last modified May 22, 2026: fix tests and docs using them (11d973dea8)