在 Selenium 中测试后处理网络错误

2023-12-31

问题

我在 C# 中搜索了很多解决方案,但没有一个适合我。 我无法使用它们,因为缺少无法导入的对象或这些对象已被弃用。 (例如所需的能力)

我想做的事

我想做的就是在执行测试后,检查测试过程中是否出现问题。 当出现问题时,测试应该失败并显示消息。 (断言。失败) 这里的问题是我无法获取我想查看的日志。

我将展示我所尝试过的。

版本1:

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.SetLoggingPreference("performance", LogLevel.All);
var logs = driver.Manage().Logs.GetLog("performance");

这对我有用,但问题是我看不出真正的问题是什么。 消息输出仅显示发生了一些错误,但没有显示具体错误。

这是公认的解决方案,如下所示:

如何使用 Chrome 在 Selenium Webdriver 中设置性能日志记录 https://stackoverflow.com/a/56333865/13163366

无法在 Selenium C# 中获取 Chrome 性能日志 https://stackoverflow.com/a/60553029/13163366

版本2:

与版本 1 相同,略有变化

var logs = driver.Manage().Logs.GetLog(LogType.Browser);

这里的问题是我只得到一份日志,但我想从执行中获取所有日志。

版本3:

在我看来,这似乎是最新的解决方案,但我再次在访问对象时遇到问题。

C# Selenium 4:设置请求拦截 https://stackoverflow.com/a/67335693/13163366

版本 4:

我没有绑定这个,因为那不是直接的硒,但也许这会有所帮助。

如何查看 HttpWebRequest 类发送的原始 HTTP 请求? https://stackoverflow.com/a/25683524/13163366

更新:它不是这样工作的。

编辑 - 版本 5:

还有一些官方例子 https://www.selenium.dev/documentation/support_packages/chrome_devtools/使用 Chrome DevTools,但其中不是很多都是用 C# 编写的

就像是this https://dotjord.wordpress.com/2020/09/13/how-to-capture-network-activity-with-selenium-4-in-asp-net-core-3-1/应该可以,但我需要在测试中使用它,而不是在控制台应用程序中。

这是我目前的状态:

IDevTools devTools = driver as IDevTools;
DevToolsSession session = devTools.CreateDevToolsSession();
session.Network.ResponseReceived += ResponseReceivedHandler;
session.Network.Enable(new EnableCommandSettings());

driver.Navigate().GoToUrl("https://google.com");

用这个方法:

public static void ResponseReceivedHandler(object sender, ResponseReceivedEventArgs e)
{
   Debug.WriteLine($"Url: { e.Response.Url } Status: { e.Response.Status } Type: { e.Response.MimeType } ");
}

更新2:

大多数时候我可以获得 e.Response.StatusText 消息并且总是有一个状态代码,我想看到的是网络选项卡中的 msg 对象。 (单击某个项目然后打开预览选项卡即可看到它)


我希望你能帮助我,它应该适用于 chrome 其他浏览器会很好,但特别是对于 chrome 它会有所帮助。


免责声明:Selenium 4+ 的长答案向下滚动:)

一个月前我自己解决了这个问题,现在可以知道真正的问题是什么,但在这里你可以找到一个如何在 Selenium 4.0 中做到这一点的工作示例:)

这是 alpha 和 beta 的一些工作代码,来自这个答案 https://stackoverflow.com/a/71671844/13163366.

chrome之前版本规格:(直到4.0.0 alpha 5)

IDevTools devTools = driver as IDevTools;
DevToolsSession session = devTools.CreateDevToolsSession();
session.Network.ResponseReceived += ResponseReceivedHandler;
session.Network.Enable(new EnableCommandSettings());
driver.Navigate().GoToUrl(url);

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

chrome后版本规格:(>4.0.0 alpha 5)

using DevToolsSessionDomains = OpenQA.Selenium.DevTools.V96.DevToolsSessionDomains;
var driver = new ChromeDriver();
var devTools = (IDevTools)driver;
IDevToolsSession session = devTools.GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<DevToolsSessionDomains>();
domains.Network.ResponseReceived += ResponseReceivedHandler;
await domains.Network.Enable(new OpenQA.Selenium.DevTools.V96.Network.EnableCommandSettings());
driver.Navigate().GoToUrl(url);

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

对于 Selenium 4+ 版本

我可以建议您使用版本和浏览器非特定的方法:(适用于 Chrome 和 Edge 以及 Selenium 4.8)

public void SetupNetworkLogging(IWebDriver driver)
{
    NetworkManager manager = new NetworkManager(driver);
    manager.NetworkResponseReceived += ResponseHandler;

    Task monitoring = manager.StartMonitoring();
    monitoring.Wait();
}

private void ResponseHandler(object sender, NetworkResponseReceivedEventArgs e)
{
    Console.WriteLine($"Http status: {e.ResponseStatusCode} : {e.ResponseBody} | Url: {e.ResponseUrl} ");
}

您还可以尝试使用 devtools 会话:

IDevTools devTools = driver as IDevTools;
var session = devTools.GetDevToolsSession();
var network = session.Domains.Network;

Task enableNetwork = network.EnableNetwork();
Task networkCaching = network.EnableNetworkCaching();
enableNetwork.Wait();
networkCaching.Wait();

我希望这对你有帮助 - 可以找到官方文档here https://www.selenium.dev/documentation/webdriver/bidirectional/. :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Selenium 中测试后处理网络错误 的相关文章

随机推荐