можно ли както при фэйле теста получить лог консоли из FireFox?
я тоже немного погуглил и нашел вот это codeception page load wait helper · GitHub
и там есть метод который можно переделать под свои нужды.
/**
* Проверяем отсутствие ошибок в консоли.
*/
public function dontSeeJsError()
Только сейчас понял как давно не ранил ничего в ФФ
C другой стороны я почти никогда не пользовался стандартным апи селениума, потому что мне не нравилось что он всегда флашит консоль после каждого получение доступа к логам. Самый логичный способ сделать тоже самое - повесить хук на window.onerror и собирать варнинги в каком-нибудь обьекте, чтобы в любой момент теста их можно было вытащить (первый пример из гугла - WebDriver: capture JS errors while running tests | Marc Guillemot's blog)
На практиці використовуємо трекінг помилок (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 помилка. Колектор після функціональної валідації (успішної) все одно буде падати і приходиться в тестовий клас додавати такі помилки як відомі.
Останнє, в Алюр репорті може виглядати приблизно так:
И часто вы получаете SEVERE
от FF?
Так, правильне зауваження - не отримуємо. Основним браузером є Хром і під час перевірки, просто дивились, щоб при витягуванні логів не було ексепшенів.
Для ФФ є бага на це: Firefox: logs().get( "browser" ) doesn't show console errors? · Issue #1161 · SeleniumHQ/selenium · GitHub
Але на Хромі все працює круто - девелопери гарно відзиваються, допомагає дебажити і знаходити швидше функціональну регресію в їхніх бранчах.
Линк на этот баг был опубликован в пятом сообщении данной темы.
И ТС спрашивал как раз по поводу ФФ, а не хрома.
странно, у меня нет метода logs()
C#, 2.48
Обновись до 2.52
спасибо.