Reputation: 21
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?
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
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
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