在 C 中获取 selenium 中请求的标头#

Get the Headers of Requests in selenium at C#

提问人:Mohammad Ebrahimi 提问时间:11/5/2023 最后编辑:Brian Tompsett - 汤莱恩Mohammad Ebrahimi 更新时间:11/12/2023 访问量:59

问:

我有一个硒刮板,可以打开站点并登录它。该网站是由 react 或 react native 编写的,页面数据来自 API。 我希望当 selenium 打开浏览器并登录它时,也可以捕获 Get 和 Post 请求。 我想从其中一个 API 请求中获取特定标头。

我尝试了很多方法,例如browsermobproxy(与.net 6不兼容)和其他方法,但没有人无法解决我的问题。 我也试过这个:

ChromeOptions options = new ChromeOptions();
options.AddArgument("user-data-dir=C:\\Users\\Test\\AppData\\Local\\Google\\Chrome\\User Data");

// Create a new ChromeDriver object.
IWebDriver driver = new ChromeDriver(options);

// Navigate to the target website.
driver.Navigate().GoToUrl("https://test.com/");

// Get the network requests.
List<NetworkRequest> requests = driver.GetNetworkRequests();

// Print the request details to the console.
foreach (NetworkRequest request in requests)
{
    Console.WriteLine($"Request URL: {request.Url}");
    Console.WriteLine($"Request Method: {request.Method}");
    Console.WriteLine($"Request Status Code: {request.StatusCode}");
    Console.WriteLine($"Request Headers:");
    foreach (var header in request.Headers)
    {
        Console.WriteLine($"  {header.Key}: {header.Value}");
    }
    Console.WriteLine();
}

// Close the browser.
driver.Quit();
C# Selenium-WebDriver 监控

评论


答:

0赞 ggeorge 11/9/2023 #1

您可以将 devtools 与 chrome 驱动程序一起使用

using var driver = new ChromeDriver();

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

session.DevToolsEventReceived += OnDevToolsEventReceived;

void OnDevToolsEventReceived(object? sender, DevToolsEventReceivedEventArgs e)
{
    if (e.EventName == "requestWillBeSentExtraInfo")
    {
        var requestHeaders = e.EventData["headers"];
    }
    if (e.EventName == "responseReceivedExtraInfo")
    {
        var responseHeaders = e.EventData["headers"];
    }  
}

driver.Navigate().GoToUrl("https://stackoverflow.com/");
0赞 Mohammad Ebrahimi 11/12/2023 #2

我用这个,它解决了我的问题

ChromeOptions options = new ChromeOptions();
options.SetLoggingPreference("performance", LogLevel.All);
options.AddArgument("user-data-dir=C:\\Users\\Test\\AppData\\Local\\Google\\Chrome\\User Data");
IWebDriver driver = new ChromeDriver(options);
driver.Navigate().GoToUrl("https://test.com/");
var performanceLogs = driver.Manage().Logs.GetLog("performance");
// Find Specific Request
var jsonText = performanceLogs.Where(p => p.Message.Contains("some of the api url or the header name")).FirstOrDefault();
//Header
string pattern = "\"The Header Name\":\"([^\"]+)\"";
Match match = Regex.Match(jsonText.ToString(), pattern);
string Header= "";
if (match.Success)
{
Header= match.Groups[1].Value;
Console.WriteLine("Header: " + Header);
}
else
{
Console.WriteLine("Header not found.");
}
driver.Quit();