在 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/