Andy
Andy

Reputation: 21

Capture network requests like in Chrome DevTools

I am currently studying selenium. I need to capture all network requests in order to see them like in Chrome DevTools. Is there a way to do this?

Chrome_DevTools

RequestIntercepted event doesn't help

I've been trying to find a solution for the past few days and nothing. I would also appreciate any advice from other libraries.

What I need: execute some commands or scripts like in selenium, intercept network requests.

My code:

Imports OpenQA.Selenium
Imports OpenQA.Selenium.Chrome
Imports OpenQA.Selenium.DevTools
Imports OpenQA.Selenium.DevTools.V107.Network
Public Class SeleniumTest
    Private Driver As OpenQA.Selenium.IWebDriver
    Private Session As OpenQA.Selenium.DevTools.DevToolsSession
    Private WithEvents Network As OpenQA.Selenium.DevTools.V107.Network.NetworkAdapter
    Public Async Sub Load(Url As String)
        Driver = New ChromeDriver(New ChromeOptions)
        Dim DevTools As IDevTools = Driver
        Session = DevTools.GetDevToolsSession()
        Network = Session.GetVersionSpecificDomains(Of OpenQA.Selenium.DevTools.V107.DevToolsSessionDomains).Network
        Await Network.Enable(New EnableCommandSettings())
        Driver.Navigate.GoToUrl(Url)
    End Sub
    Public Sub Click()
        Try
            Dim elem As IWebElement = Driver.FindElement(By.ClassName("video-holder"))
            elem.Click()
        Catch ex As Exception
        End Try
    End Sub
    Private Sub Network_ResponseReceived(sender As Object, e As ResponseReceivedEventArgs) Handles Network.ResponseReceived
        Debug.WriteLine(e.Response.Url)
    End Sub
End Class

Upvotes: 1

Views: 3150

Answers (2)

ms777
ms777

Reputation: 31

The following works without any additional libraries with Selenium 4.6 and .NET 6 on Win10

using System;
using DevToolsSessionDomains = OpenQA.Selenium.DevTools.V107.DevToolsSessionDomains;
using Network = OpenQA.Selenium.DevTools.V107.Network;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.DevTools;

namespace Selenium$id {

    public class SeleniumTest  {

[STAThread]
        public void Start() {
            string url = "https://www.google.de/";
            Uri uri = new Uri(url);
            var driver = new ChromeDriver("C:\\Users\\martin\\git\\libraries\\selenium\\");
            var devTools = (OpenQA.Selenium.DevTools.IDevTools)driver;
            OpenQA.Selenium.DevTools.IDevToolsSession session = devTools.GetDevToolsSession();
            var domains = session.GetVersionSpecificDomains<DevToolsSessionDomains>();
            domains.Network.ResponseReceived += ResponseReceivedHandler;
            System.Threading.Tasks.Task task = domains.Network.Enable(new Network.EnableCommandSettings());
            task.Wait();
            driver.Navigate().GoToUrl(uri);
            var name = Console.ReadLine();
            Console.WriteLine("finished");
            driver.Dispose();

            void ResponseReceivedHandler(object sender, Network.ResponseReceivedEventArgs e)
            {
                Console.WriteLine($"Status: { e.Response.Status } : {e.Response.StatusText} | File: { e.Response.MimeType } | Url: { e.Response.Url }");
            }
        }
    }
}

Upvotes: 3

ggeorge
ggeorge

Reputation: 1630

There is a simple way to capture the network calls via selenium. I'm currently using Selenium 4.6.0 and .NET 7.

You need to enable network from a devtools session and to subscribe to DevToolsEventReceived :

const string Url = @"https://stackoverflow.com/questions/74419089/capture-network-requests-like-in-chrome-devtools";

using var driver = new ChromeDriver();

IDevTools devTools = driver;
DevToolsSession session = devTools.GetDevToolsSession();
await session.Domains.Network.EnableNetwork();
session.DevToolsEventReceived += OnReceive;

driver.Navigate().GoToUrl(Url);

void OnReceive(object? sender, DevToolsEventReceivedEventArgs e)
{
    if (e.EventName == EventName.responseReceived.ToString())
    {
        var data = JsonConvert.SerializeObject(e.EventData);
        Console.WriteLine(data);
    }    
}

// Just for demo purposes, in a real world app you might want to await 
// here in order to not stop the execution
Console.ReadLine();

// This is a custom `enum` to help you choose the appropriate event name
public enum EventName
{
    requestWillBeSentExtraInfo,
    requestWillBeSent,
    responseReceivedExtraInfo,
    responseReceived,
    attachedToTarget,   
    detachedFromTarget
}

Upvotes: 2

Related Questions