我正在尝试升级我们在代码库中用于自动化测试的 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);
});
不再工作。测试确实完成了,但报告门户只是将每个测试标记为通过。
有人对我如何解决这个问题有任何建议吗?