Как отловить JS ошибки в консоли браузера, в момент их появления?

Проблема заключается в том, что мне нужно сделать скриншот в момент появления JS error.

я попробовал после каждого СТЕПА в моих тестах specflow добавить проверку в

DriverManager.GetWebDriver().Manage().Logs.GetLog(LogType.Browser);

на появление новых ошибок. правильно ли я сделал? или есть решение получше

А что вы потом делаете с этой строкой ? Записываете в переменную и парсите или что ?

Вторая статья из поиска гугла показывает решения этой проблемы на разных языках - Capturing JavaScript error in Selenium - Stack Overflow

видимо вы не поняли. решение, что вы дали по ссылке - это просто лог всех JS ошибок ПОСЛЕ выполнения теста

а в моем случае - мне нужно чтобы срабатывало какоенибудь исключение сразу после того как появилась JS ошибка. чтобы сделать скриншот

Ну сам вебдрайвер не знает о том что надо бросать какие либо ексепшены на случай когда ошибки в javascript log валятся. Как вариант, на каждый клик, или другой чих вы можете проверять если у вас ошибки в логах и если есть, то делать скриншот, но это сильно замедлит тест ( мне так кажется). В общем, короткий ответ на ваш вопрос - на сколько мне известно, вебдрайвер не предоставляет возможность бросать ексепшены на появление ошибок джаваскрипта. Вам нужно писать свои велосипеды.

1 лайк

Можно внедрить какой то свой кусок кода на страничку который будет мониторить аутпут и как-то страшно ломать страницу с сообщением

Вот хорошая статья по этому поводу.
В комментах как раз ваш способ описывал

спасибо! большое. но почему-то я выставил
options.SetLoggingPreference(LogType.Browser, LogLevel.Severe);

но в логах DriverManager.GetWebDriver().Manage().Logs.GetLog(LogType.Browser); все равно пишет ворнинги

как достать только ошибки?

Покажите код запуска браузера

если степы атомарные, можно воспользоваться атрибутом

[AfterStep]
public void CheckBrowserLogs()
{
     var logs = WebDriver.Manage().Logs.GetLog(LogType.Browser);
     foreach (var l in logs)
     {
         ........................................
     }
}

Этот метод возвращает колекцию LogEntry, которые можно фильтровать по

public enum LogLevel
  {
    All,
    Debug,
    Info,
    Warning,
    Severe,
    Off,
  }

всем спасибо. сделал так:

    [AfterStep]   public void ErrorLog()
   {
        //Checking for JS errors after every step 

        if (JSErrors.Any())
            if (!JSErrors.IsSameOrEqualTo(DriverManager.GetWebDriver().Manage().Logs.GetLog(LogType.Browser)))
            {
                CommonComponentSteps.MakeScreenshot("JSError_");
            }

        JSErrors = DriverManager.GetWebDriver().Manage().Logs.GetLog(LogType.Browser)
            .Select(it => it.Level == LogLevel.Severe);

        //Logging NEW JS Errors
        foreach (var entry in JSErrors)
        {
            TestLogger.Message(">>" + entry);
            Console.WriteLine(entry.ToString());
        }
    }

работает быстро.