是否可以使用selenium拦截网络流量

问题描述 投票:0回答:1

在 C# 中使用 Selenium 时,是否有任何库或方法可以拦截 POST 响应正文?我的意思是类似于 python 中的 selenium-wire 的库,它允许人们查看流量并获取响应消息。到目前为止,我已经尝试过这样的方法:Catching Network Traffic With Selenium C# 但它不输出任何网络流量或响应正文。

c# .net selenium-webdriver firefox automation
1个回答
0
投票

是的,有办法!我花了很长时间才弄清楚,进行了大量研究,并得到了与我一起工作的几个开发人员的一些帮助。我将尝试用代码示例尽可能地解释它:

因此,为了拦截传入的网络流量,我就是这样做的(因为我的解决方案需要完整的请求 URL):

        IDevTools devTools = (IDevTools)driver;
        DevToolsSession session = devTools.GetDevToolsSession();
        var domains = session.GetVersionSpecificDomains<DevToolsSessionDomains>();
        await domains.Network.Enable(new EnableCommandSettings());
        domains.Network.Session.DevToolsEventReceived += Session_DevToolsEventReceived;

然后,您需要单击按钮/执行需要响应的任何功能。就我而言,单击按钮即可生成报告。然后,您需要“Session_DevToolsEvenReceived”,它是:

        static void Session_DevToolsEventReceived(object? sender, DevToolsEventReceivedEventArgs e)
        {
            _url ??= e.EventData["documentURL"]?.ToString();
        }

这将获取请求 URL 并将其存储到字符串中。然后,我这样做的方法是将调用 api 的代码放在一个单独的类中,但像这样调用它,以便将响应存储在变量中:

var result = await Call.GetData(x, x, x, _url)

您需要确保所使用的测试方法是公共异步任务而不是 void。我的示例中的“x”是允许访问 api(userId、accountId 和organizationId)的数字,所以为什么我必须将它们标记为“x”。现在,下一个片段是调用 api 来获取响应的代码,并将请求 URL 传递给它。这是在我的解决方案中的一个单独的类文件中

namespace ApiCall
{
    public class Call
    {
        private static HttpClient httpClient = new HttpClient();
        public Call()
        {}
        public static async Task<string> GetData(int userId, int accountId, int organisationId, string requestId)
        {
            var request = new HttpRequestMessage(HttpMethod.Get, requestId);           
            request.Headers.Add("Accept", "text/plain");
            request.Headers.Add("UserId", userId.ToString());
            request.Headers.Add("AccountId", accountId.ToString());
            request.Headers.Add("OrganisationId", organisationId.ToString());
            var response = await httpClient.SendAsync(request);
            response.EnsureSuccessStatusCode();
            return await response.Content.ReadAsStringAsync();
        }
    }
}

我很欣赏这篇文章很长,但我希望它能提供一些见解,并帮助您实现您所需要的。我发现它还没有被广泛记录!请告诉我你过得怎么样!

© www.soinside.com 2019 - 2024. All rights reserved.