在 selenium 中测试后处理网络错误
Handling network errors after a test in selenium
问题
我在 C# 中搜索了很多解决方案,但其中 none 对我有用。
我不能使用它们,因为缺少我无法导入的对象,或者这些对象已被弃用。 (例如 DesiredCapabilities)
我想做什么
我想做的就是在执行测试后,检查测试过程中是否出现问题。
当出现问题时,测试应该失败并显示消息。 (Assert.Fail)
这里的问题是我拿不到我想看的日志。
我会展示我的尝试。
版本 1:
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.SetLoggingPreference("performance", LogLevel.All);
var logs = driver.Manage().Logs.GetLog("performance");
这对我有用,但这里的问题是我看不出真正的问题所在。
消息输出只是告诉我发生了一些错误,但不是什么错误。
这是公认的解决方案,您可以在此处看到:
Unable to get Chrome Performance logs in Selenium C#
版本 2:
与版本 1 相同,稍有变化
var logs = driver.Manage().Logs.GetLog(LogType.Browser);
这里的问题是我只得到一个日志,但我想从执行中获取所有日志。
版本 3:
在我看来,这是最新的解决方案,但我再次遇到访问对象的问题。
C# Selenium 4: Setup request interception
版本 4:
我没有把它联系起来,因为它不是直接的硒,但也许这会有所帮助。
更新:不是这样的。
编辑 - 版本 5:
还有一些 official examples 带有 Chrome DevTools,但其中不多是 C#
类似 this 的东西应该可以工作,但我需要在我的测试中而不是在控制台应用程序中使用它。
这是我目前的状态:
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.0 中解决这个问题:)
这是来自 .
的 alpha 和 beta 的一些工作代码
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 }");
}
看起来很相似,但 CreateDevToolsSession 已更改为 GetDevToolsSession。
同时更新官方示例:
https://www.selenium.dev/documentation/support_packages/chrome_devtools/
问题
我在 C# 中搜索了很多解决方案,但其中 none 对我有用。 我不能使用它们,因为缺少我无法导入的对象,或者这些对象已被弃用。 (例如 DesiredCapabilities)
我想做什么
我想做的就是在执行测试后,检查测试过程中是否出现问题。 当出现问题时,测试应该失败并显示消息。 (Assert.Fail) 这里的问题是我拿不到我想看的日志。
我会展示我的尝试。
版本 1:
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.SetLoggingPreference("performance", LogLevel.All);
var logs = driver.Manage().Logs.GetLog("performance");
这对我有用,但这里的问题是我看不出真正的问题所在。 消息输出只是告诉我发生了一些错误,但不是什么错误。
这是公认的解决方案,您可以在此处看到:
Unable to get Chrome Performance logs in Selenium C#
版本 2:
与版本 1 相同,稍有变化
var logs = driver.Manage().Logs.GetLog(LogType.Browser);
这里的问题是我只得到一个日志,但我想从执行中获取所有日志。
版本 3:
在我看来,这是最新的解决方案,但我再次遇到访问对象的问题。
C# Selenium 4: Setup request interception
版本 4:
我没有把它联系起来,因为它不是直接的硒,但也许这会有所帮助。
更新:不是这样的。
编辑 - 版本 5:
还有一些 official examples 带有 Chrome DevTools,但其中不多是 C#
类似 this 的东西应该可以工作,但我需要在我的测试中而不是在控制台应用程序中使用它。
这是我目前的状态:
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.0 中解决这个问题:)
这是来自
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 }");
}
看起来很相似,但 CreateDevToolsSession 已更改为 GetDevToolsSession。
同时更新官方示例: https://www.selenium.dev/documentation/support_packages/chrome_devtools/