selenium 像在Chrome DevTools中一样捕获网络请求

o2gm4chl  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(588)

我目前正在研究 selenium 。我需要捕获所有的网络请求,以便在Chrome DevTools中看到它们。有办法做到这一点吗?

RequestIntercepted事件没有帮助
过去几天我一直在寻找解决办法,但一无所获。我也很感激其他图书馆的建议。
我需要:执行某些命令或脚本(如在Selenium中),拦截网络请求。
我的代码:

  1. Imports OpenQA.Selenium
  2. Imports OpenQA.Selenium.Chrome
  3. Imports OpenQA.Selenium.DevTools
  4. Imports OpenQA.Selenium.DevTools.V107.Network
  5. Public Class SeleniumTest
  6. Private Driver As OpenQA.Selenium.IWebDriver
  7. Private Session As OpenQA.Selenium.DevTools.DevToolsSession
  8. Private WithEvents Network As OpenQA.Selenium.DevTools.V107.Network.NetworkAdapter
  9. Public Async Sub Load(Url As String)
  10. Driver = New ChromeDriver(New ChromeOptions)
  11. Dim DevTools As IDevTools = Driver
  12. Session = DevTools.GetDevToolsSession()
  13. Network = Session.GetVersionSpecificDomains(Of OpenQA.Selenium.DevTools.V107.DevToolsSessionDomains).Network
  14. Await Network.Enable(New EnableCommandSettings())
  15. Driver.Navigate.GoToUrl(Url)
  16. End Sub
  17. Public Sub Click()
  18. Try
  19. Dim elem As IWebElement = Driver.FindElement(By.ClassName("video-holder"))
  20. elem.Click()
  21. Catch ex As Exception
  22. End Try
  23. End Sub
  24. Private Sub Network_ResponseReceived(sender As Object, e As ResponseReceivedEventArgs) Handles Network.ResponseReceived
  25. Debug.WriteLine(e.Response.Url)
  26. End Sub
  27. End Class
vfhzx4xs

vfhzx4xs1#

有一种简单的方法可以通过selenium捕获网络调用。我目前使用的是Selenium 4.6.0.NET 7
您需要从devtools会话启用网络并订阅DevToolsEventReceived

  1. const string Url = @"https://stackoverflow.com/questions/74419089/capture-network-requests-like-in-chrome-devtools";
  2. using var driver = new ChromeDriver();
  3. IDevTools devTools = driver;
  4. DevToolsSession session = devTools.GetDevToolsSession();
  5. await session.Domains.Network.EnableNetwork();
  6. session.DevToolsEventReceived += OnReceive;
  7. driver.Navigate().GoToUrl(Url);
  8. void OnReceive(object? sender, DevToolsEventReceivedEventArgs e)
  9. {
  10. if (e.EventName == EventName.responseReceived.ToString())
  11. {
  12. var data = JsonConvert.SerializeObject(e.EventData);
  13. Console.WriteLine(data);
  14. }
  15. }
  16. // Just for demo purposes, in a real world app you might want to await
  17. // here in order to not stop the execution
  18. Console.ReadLine();
  19. // This is a custom `enum` to help you choose the appropriate event name
  20. public enum EventName
  21. {
  22. requestWillBeSentExtraInfo,
  23. requestWillBeSent,
  24. responseReceivedExtraInfo,
  25. responseReceived,
  26. attachedToTarget,
  27. detachedFromTarget
  28. }
展开查看全部

相关问题