Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

вытащить лог консоли из FireFox когда тест фейлится

firefox
webdriver
Теги: #<Tag:0x00007f7b652948d8> #<Tag:0x00007f7b65294720>

(Konstantin) #1

можно ли както при фэйле теста получить лог консоли из FireFox?


(Stan) #2

http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/logging/Logs.html


(Dmtiry Kovpak) #3

(Konstantin) #4

я тоже немного погуглил и нашел вот это https://gist.github.com/pastuhov/43674b195dc293ffd847
и там есть метод который можно переделать под свои нужды.

/**
 * Проверяем отсутствие ошибок в консоли.
 */
public function dontSeeJsError()

(Sergey Korol) #5

Только вот FF драйвер не трекает console errors.


(Stan) #6

Только сейчас понял как давно не ранил ничего в ФФ :slight_smile:

C другой стороны я почти никогда не пользовался стандартным апи селениума, потому что мне не нравилось что он всегда флашит консоль после каждого получение доступа к логам. Самый логичный способ сделать тоже самое - повесить хук на window.onerror и собирать варнинги в каком-нибудь обьекте, чтобы в любой момент теста их можно было вытащить (первый пример из гугла - https://mguillem.wordpress.com/2011/10/11/webdriver-capture-js-errors-while-running-tests/)


(Павел) #7

На практиці використовуємо трекінг помилок (Java framework), що виникали під час прогонки тестів (не тільки JavaScript, але і 400, 500 errors, be more accurate - everything that browser tracks with SEVERE level, will show in code further).
Перше. Код самого класу для збору помилок.

public class ConsoleErrorsHandler {

    private Logger log = LoggerFactory.getLogger(ConsoleErrorsHandler.class);
    private List<String> knownErrors = new ArrayList<>();
    private String registeredErrors = "";

    public ConsoleErrorsHandler() {
        addKnownErrors();
    }

    public void collectErrors(ITestResult result) {
        String test = result.getName();
        List<String> newlyLoggedErrors = getBrowserLevelSevereMessages();

        if (newlyLoggedErrors.isEmpty()) return;

        registeredErrorsLoop:
        for (String error : newlyLoggedErrors) {
            if (registeredErrors.contains(error)) continue registeredErrorsLoop;

            for (String knownError: knownErrors) {
                if (error.contains(knownError)) continue registeredErrorsLoop;
            }

            log.error(error);
            registeredErrors += "\n<=== TEST: " + test + " ===>\nError text: " + error + "\n";
        }
    }

    public void checkForErrorsAndAssert() {
        if (!registeredErrors.isEmpty()) {
            throw new AssertionError("There were JavaScript errors:\n" + registeredErrors);
        }
    }

    public ConsoleErrorsHandler addErrorToKnownList(String... errors) {
        for (String error: errors) {
            knownErrors.add(error);
        }
        return this;
    }

    public List<String> getKnownErrors() {
        return knownErrors;
    }

    private void addKnownErrors() {
//        knownErrors.add("400 (Bad Request)");
//        knownErrors.add("403 (Forbidden)");
//        knownErrors.add("403 (Access is denied)");
//        knownErrors.add("404 (Not Found)");
//        knownErrors.add("404 (OK)");
    }

    private List<String> getBrowserLevelSevereMessages() {
        List<String> severMessages = new ArrayList<>();

        // This WebDriver feature works only for Chrome, Firefox and Safari browsers
        // Returning empty list to skip getting logs for other browsers
        if (Driver.isIE() || Driver.isIpad()) {
            return severMessages;
        }

        LogEntries entries = DRIVER().manage().logs().get(LogType.BROWSER);
        List<LogEntry> severeEntries = entries.filter(Level.SEVERE);
        severMessages.addAll(severeEntries.stream().map(LogEntry::getMessage).collect(Collectors.toList()));

        return severMessages;
    }
}

Для витягування логів використовується те що може Selenium з коробки:
LogEntries entries = DRIVER().manage().logs().get(LogType.BROWSER);

Також є можливість додавати відомі помилки, тобто ті, які потрібно ігнорувати під час проходження тестів. Це можна робити як глобально, додавши в цьому класі, так і в окремому тестовому класі через:

public ConsoleErrorsHandler addErrorToKnownList(String... errors) {
    for (String error: errors) {
        knownErrors.add(error);
    }
    return this;
}

З практики, можемо відстежувати помилки в ФФ, Хромі і Сафарі, на ІЕ і айПад Сафарі проблеми, Селеніум кидає помилки, що не може витягнути логи.

Як це прикрутити до тестів. Якщо тестовий клас буде наслідуватись від приблизного BaseTest, то так:

public abstract class BaseTest {

    private Logger log = LoggerFactory.getLogger(BaseTest.class);
    protected String testMethodName = "";
    protected ConsoleErrorsHandler consoleErrors = new ConsoleErrorsHandler();

    @BeforeClass
    public void beforeClass() {
        WebDriverManager.setWebDriver();
    }

    @AfterMethod
    public void afterMethod(ITestResult result) {
        consoleErrors.collectErrors(result);
    }

    @AfterClass(alwaysRun = true)
    public void browserConsoleErrors() {
        consoleErrors.checkForErrorsAndAssert();
        WebDriverManager.closeWebDriver();
    }

}

І якщо потрібно добавити відому помилку в тестову класі, то так:

public class CreateGoogleAnalyticsTests extends BaseTest {

    @BeforeClass(alwaysRun = true)
    public void setUp() {
        consoleErrors.addErrorToKnownList("googleusercontent");
    }
...

}

І якщо така помилка випадково буде з"являтись, то тест на ній падати не буде. Здається для чого це, з практири, є такі штуки, що на них вплинути не можеш або навіть валідні ситуації, коли пробуєш залогінитись чи витягнути інформацію юзером в якого обмежений доступ і тут 403 помилка. Колектор після функціональної валідації (успішної) все одно буде падати і приходиться в тестовий клас додавати такі помилки як відомі.

Останнє, в Алюр репорті може виглядати приблизно так:


(Sergey Korol) #8

И часто вы получаете SEVERE от FF?


(Павел) #9

Так, правильне зауваження - не отримуємо. Основним браузером є Хром і під час перевірки, просто дивились, щоб при витягуванні логів не було ексепшенів.
Для ФФ є бага на це: https://github.com/seleniumhq/selenium/issues/1161

Але на Хромі все працює круто - девелопери гарно відзиваються, допомагає дебажити і знаходити швидше функціональну регресію в їхніх бранчах.


(Sergey Korol) #10

Линк на этот баг был опубликован в пятом сообщении данной темы.
И ТС спрашивал как раз по поводу ФФ, а не хрома.


(5am) #11

странно, у меня нет метода logs()
C#, 2.48


(Константин) #12

Обновись до 2.52


(5am) #13

спасибо.