0

我正在尝试升级我们在代码库中用于自动化测试的 selenium 和报告门户代理版本。我们正在尝试升级到 selenium hub 4.0 和 reportportal/agent-js-jasmine 5.0.0。

升级似乎有效,但是我遇到了几个问题,第一个问题我认为没什么大不了的,但仍然有点痛苦,直到测试完成后,日志才会显示在报告门户中,以前您可以在测试进行时跟踪日志。

此外,当测试完成并通过或失败时,它实际上永远不会完成,它只会继续进行,直到最终超时。

这是我们的 protractor.conf.js 文件:

    /* eslint-disable no-undef */
    const ReportportalAgent = require('@reportportal/agent-js-jasmine');
    const { SpecReporter } = require('jasmine-spec-reporter');
    const suiteSettings = require('./suiteSettings');
    const settings = require('./settings');
    const logger = require('./tests/helpers/logger');
    
    // This is a temporary solution because we have issues if instances=nodes. For now balance between nodes and instances that instances < 3
    const nodeReduceCount = 5;
    let isBrowserOpen = false;
    
    exports.config = {
        framework: 'jasmine',
        seleniumAddress: settings.seleniumHubHost,
        capabilities: {
            'shardTestFiles': true,
            'maxInstances': Math.max(settings.countOfStreams - nodeReduceCount, 1),
            'browserName': settings.browser,
            'loggingPrefs': {
                performance: 'INFO',
            },
            'moz:firefoxOptions': getFirefoxOptions(),
            'goog:chromeOptions': getChromeOptions(),
        },
        suites: [
            suiteSettings.suite,
        ],
        jasmineNodeOpts: {
            defaultTimeoutInterval: settings.jasmineTimeout,
            isVerbose: false,
            includeStackTrace: true,
            realtimeFailure: false,
        },
        onPrepare: async () => {
            const jasmineEnv = jasmine.getEnv();
            const capabilities = await browser.getCapabilities();
            const config = await browser.getProcessedConfig();
    
            global.consoleReporter = [];
        console.log(capabilities);

        if (!settings.useReportPortal) {
            registerReporter(jasmineEnv);
        } else {
            registerConsoleReporter(jasmineEnv);
        }

        jasmineEnv.beforeEach(async () => {
            jasmine.DEFAULT_TIMEOUT_INTERVAL = settings.jasmineTimeout;

            const criticalCheck = String(config.specs);

            if (criticalCheck.includes('critical')) {
                process.env.RUN_WITH_SERVICE_WORKER = 'true';
            } else {
                process.env.RUN_WITH_SERVICE_WORKER = '';
            }

            if (isBrowserOpen) {
                browser.restart();
            }

            await browser.driver.manage().window().setSize(settings.viewPort.width, settings.viewPort.height);

            isBrowserOpen = true;

            await logger.logMessage(`Opening Link ${settings.newPlanUrl()}`);

            await browser.waitForAngularEnabled(false);
            await browser.get(settings.newPlanUrl());
        });
    },
};

    function registerReporter(jasmineEnv) {
        jasmineEnv.addReporter(new SpecReporter({
            spec: {
                displayStacktrace: true,
            },
        }));

    const config = {
        id: browser.params.id,
        ...settings.reportPortal,
    };

    const agent = new ReportportalAgent(config);
    const reporter = agent.getJasmineReporter();
    jasmineEnv.addReporter(reporter);

    jasmineEnv.afterAll(async (done) => {
        await agent.getPromiseFinishAllItems(agent.tempLaunchId);
        done();
    });

    global.reporter = reporter;
    global.agent = agent;

    return agent;
}

function registerConsoleReporter(jasmineEnv) {
    jasmineEnv.afterEach(async () => {
        await browser.takeScreenshot().then((png) => {
            const testSuite = settings.currentSuite;
            const date = new Date();
            const currentDay = `(Time-${date.getHours()}-${date.getMinutes()}-${date.getSeconds()})`;
            logger.writeScreenShot(png, `screenshots/${currentDay}_${testSuite}.png`);
        });
    });
    jasmineEnv.afterAll(async () => {
        await console.log('\n---------------------------------');
        await console.log('Test Results');
        await global.consoleReporter.forEach((testResult) => {
            console.log(testResult);
        });
        await console.log('---------------------------------');
    });
}

function getFirefoxOptions() {
    const options = {};

    if (settings.headless) {
        options.args = ['--headless'];
    }

    return options;
}

function getChromeOptions() {
    const options = {
        args: [
            '--disable-gpu',
            '--no-sandbox',
            '--disable-extensions',
            '--disable-dev-shm-usage',
            '--disable-infobars',
        ],
    };

    if (settings.headless) {
        options.args.push('--headless');

        options.perfLoggingPrefs = {
            enableNetwork: true,
        };
    }

    return options;
}

现在我知道它与:await agent.getPromiseFinishAllItems(agent.tempLaunchId);

在网上看时,我看到这个承诺引起了人们的注意,我正在阅读论坛https://github.com/angular/protractor/issues/1938并尝试了其中一个建议:

jasmineEnv.afterAll(async (done) => {
    process.nextTick(done);
});

现在这确实有效并且测试确实完成了但它的状态为中断,我假设是由于没有得到那个承诺?我想知道是否可能由于某种原因它没有得到 tempLaunchId 但我要记录这个所以不要认为是这种情况。

不确定它是否会有所帮助,但这是我们在运行测试时调用的 start.js 文件:

const protractorFlake = require('protractor-flake');
const AgentJasmine = require('@reportportal/agent-js-jasmine');
const reportportalConfig = require('./settings').reportPortal;

const agent = new AgentJasmine(reportportalConfig);

agent.getLaunchStartPromise()
    .then((launchData) => {
        protractorFlake({
            maxAttempts: 1,
            protractorArgs: [
                './protractor.conf.js',
                '--params.id',
                launchData.id,
            ],
        }, (status) => {
            agent.getExitPromise()
                .then(() => {
                    process.exit(status);
                });
        });
    });

所以我的一个或多个问题是有没有办法使用这个承诺,让它真正起作用?我一直在尝试研究这个但找不到解决问题的方法,我一直在关注这里的文档:https ://www.npmjs.com/package/@reportportal/agent-js-jasmine但可以'没有看到我可能会错过什么?而且,有没有办法改变它,以便在测试运行时日志显示在报告门户中,而不仅仅是在最后?

编辑:

这样做:

 jasmineEnv.afterAll(async (done) => {
    process.nextTick(done);
});

不再工作。测试确实完成了,但报告门户只是将每个测试标记为通过。

有人对我如何解决这个问题有任何建议吗?

4

0 回答 0