Транспортир afterEach извлекает browser.manage(). Logs() во вспомогательную функцию

Моя общая цель - извлечь browser.manage(). Logs() во вспомогательную функцию. Я иду к этой цели, включая browser.manage().logs() функциональность внутри afterEach Звоните внутри теста.

Я знаю, что мой тест выдает ошибку консоли.

Встроенная версия browser.manage().logs() распечатает ошибку. Ни afterEach ни checkConsole распечатает логи.

Что мне нужно сделать, чтобы это исправить?
Это встроенный browser.manage().logs() восстановить ошибку и очистить журнал? Я попробовал каждую комбинацию, чтобы все они были закомментированы, и единственная, которая когда-либо работала, это встроенная версия.

у меня тоже есть protractor-screenshoter-plugin настроен и отчет, который он производит, показывает ошибку консоли под Show browsers logs кнопка. Это как-то захватывает ошибки и предотвращает browser.manage().logs() от получения?

conf.ts

import { browser, Config } from 'protractor';

export let config: Config = {
    plugins: [{
        package: 'protractor-screenshoter-plugin',
        screenshotPath: './protractor/screenshots',
        screenshotOnExpect: 'failure+success',
        screenshotOnSpec: 'none',
        withLogs: true,
        writeReportFreq: 'asap',
        imageToAscii: 'none',
        clearFoldersBeforeTest: true
    }],

    capabilities: {
        'browserName': 'chrome',
        chromeOptions: {
            args: [ '--disable-gpu', '--window-size=1440x900', '--headless'],
        },
        'moz:firefoxOptions': {
            args: [ '-headless' ],
        },
        'loggingPrefs' : {"driver": "ALL", "server": "ALL", "browser": "ALL"}
    },

    directConnect: true,
    framework: 'jasmine2',

    baseUrl: 'https://localhost/',
    rootElement: 'app',

    getPageTimeout: 10000,
    allScriptsTimeout: 11000,
    jasmineNodeOpts: {
        defaultTimeoutInterval: 52000,
        onComplete: null,
        showColors: true,
        includeStackTrace: true,
    },

    onPrepare: function() {
        // returning the promise makes protractor wait for the reporter config before executing tests
        return browser.getProcessedConfig().then(function(pconfig) {
            // console.log("pconfig", pconfig);
        });
    }
};

console_helper.ts

import { browser } from 'protractor';

export let checkConsole = () => {
    browser.manage().logs().get('browser').then((browserLog: any) => {
        // this also fails to print the error message
        console.log("browserLog", browserLog);
   });
}

project.ts

import { browser, element, by, ExpectedConditions } from 'protractor';
const EC = ExpectedConditions;

import { checkConsole } from "./helpers/console_helper";


afterEach(function() {
    browser.manage().logs().get('browser').then(function(browserLogs) {
        // this fails to print the error message
        console.log("browserLogs", browserLogs); 
    });
});

it("should click on the button and redirect", () => {
    browser.get('/url-it-needs');
    browser.wait(EC.urlContains('/url-it-needs'), 5000);
    let button = element(by.cssContainingText('button', 'BUTTON TEXT'));
    browser.wait(EC.visibilityOf(button), 5000);
    browser.wait(EC.elementToBeClickable(button), 5000);
    button.click();
    browser.sleep(500);  // wait for the error to be returned from the backend
    /* 
    // this will print the proper error message
   browser.manage().logs().get('browser').then(function(browserLogs) {
          console.log("browserlogs Inline", browserLogs);
     });  */

   // this times out
   browser.wait(browser.getCurrentUrl().then((url: string) => {
       console.log("URL after click", url);
       expect(url).toMatch("/properUrl");
   }, 5000);
  });

2 ответа

Решение

Мы используем аналогичный механизм для чтения консоли, когда тест не пройден. Наше решение выглядит примерно так:

export function printConsole () {
    return browser.manage().logs().get('browser').then(browserLog => {
        browserLog.forEach(log => console.error(log.message));
    })
    .catch(() => console.log('Could not get browser log.'));
};

Возможно, имеет смысл немного изменить его, чтобы он также возвращал журнал:

export function getConsole () {
    return browser.manage().logs().get('browser')
    .catch(() => console.log('Could not get browser log.'));
};

export function printConsole () {
    return getConsole.then(browserLog => {
        browserLog.forEach(log => console.error(log.message));
    });
};

Таким образом, вы также можете использовать его для утверждений, то есть проверить length === 0 утверждать, что никаких консольных ошибок нет.

Каждый раз после того, как вы прочитаете в своем тестовом примере. Журналы будут пустыми. Итак, у вас нет журналов в.

Вы можете попробовать удалить browser.manage().logs() в вашем тестовом примере и держите его только в afterEach.

Другие вопросы по тегам