我是量角器的新手。如果您想知道为什么将功能文件分成多个文件夹,是因为我想告诉哪个浏览器在报告黄瓜时失败。如果仅在1个文件夹specs: 'features/*.feature'
中运行所有4个浏览器,那么我就无法确定黄瓜报告最后哪个浏览器测试失败。
黄瓜报告: https://github.com/damianszczepanik/cucumber-reporting
在学习这个新框架的同时,我一直在尝试在硒网格上以相同的规格(例如,登录/注销IE,Safari,Firefox,Chrome)运行多个浏览器测试。我注意到在4台不同机器上的硒网格上运行4个不同的浏览器有时会并行失败,但是当我在1台机器上运行1个浏览器测试时,它通过了。失败的原因之一是浏览器之一无法在页面上找到元素,或者浏览器被卡住。
运行多个浏览器测试的最佳实践是什么?您是要在同一规格文件上运行并行测试,还是要在并行测试中帮助在不同规格文件上运行?这里的特征文件路径就像
功能/chrome/login.feature
功能/safari/login.feature
功能/firefox/login.feature
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
framework: 'custom',
// path relative to the current config file
frameworkPath: require.resolve('protractor-cucumber-framework'),
multiCapabilities:
[{
'browserName': 'chrome',
specs: 'features/chrome/*.feature'
},
{
'browserName': 'firefox',
specs: 'features/firefox/*.feature'
},
{
'browserName': 'internet explorer',
specs: 'features/ie/*.feature'
},
{
'browserName': 'safari',
specs: 'features/safari/*.feature'
}],
maxSessions: 2,
baseUrl: 'https://localhost:8080',
cucumberOpts: {
strict: true,
require: [
'hooks/hooks.js',
'specs/*Spec.js'
],
tags: [
"@runThis",
"~@ignoreThis"
],
profile: false,
format: 'json:e2e/reports/cucumber-report.json',
resultJsonOutputFile: 'e2e/reports/cucumber-report.json'
},
onPrepare: function() {
const fs = require('fs');
const path = require('path');
const directory = 'e2e/reports';
//cleans up the json results from the previous build when using node flake
// fs.readdir(directory, (err, files) => {
// if (err) throw err;
// for (const file of files) {
// fs.unlink(path.join(directory, file), err => {
// if (err) throw err;
// });
// }
// });
var chai = require('chai');
chai.use(require('chai-as-promised'));
global.expect = chai.expect;
browser.ignoreSynchronization = true;
browser.manage().window().maximize();
browser.waitForAngular(false);
}
}
Feature: Login to see the dashboard pages and logout
@runThis
Scenario: Open the browser and login
Given I am on the login page
When I should be able to login with my credentials
When I logout
Then I should be able to see login page
LoginSpec.js
let loginPage = require('../pages/loginPage.js');
const username = 'xxx';
const password = 'xxx';
module.exports = function() {
this.Given('I am on the login page', function() {
browser.get("https://localhost:8080");
});
this.When('I should be able to login with my credentials', function() {
loginPage.setUsername(username);
loginPage.setPassword(password);
loginPage.clickLogin();
loginPage.loaded(loginPage.HAMBERBURGER_MENU_ICON_CLASS);
});
this.When('I logout', function() {
loginPage.openSideMenu();
loginPage.clickLogout();
loginPage.clickLogoutPopup();
});
this.Then('I should be able to see login page', {timeout: 120 * 1000}, async function () {
expect(await element(by.id(loginPage.LOGIN_BUTTON_ID)).isPresent()).to.equal(true);
});
};
答案 0 :(得分:0)
在多个浏览器上进行测试的目的是检查每个浏览器上的应用程序兼容性。为了实现此目标,我们应该在所有浏览器上运行所有规范文件。 如果我们同意这一点,那么您可以使用multiCapabilites在每个浏览器上并行运行规范。以下是用于在两个浏览器上运行规范的conf.js。
// An example configuration file.
exports.config = {
directConnect: false,
// Capabilities to be passed to the webdriver instance.
multiCapabilities: [{
'browserName': 'chrome'
},
{
'browserName': 'firefox'
}],
// Framework to use. Jasmine is recommended.
framework: 'jasmine',
// Spec patterns are relative to the current working directory when
// protractor is called.
specs: ['example_spec.js'],
// Options to be passed to Jasmine.
jasmineNodeOpts: {
defaultTimeoutInterval: 30000
}
};
答案 1 :(得分:0)
更容易更正您尝试的配置文件。因此,您能否发布config.js文件,该文件用于在多个浏览器上并行运行测试。 同样有趣的是,您是否正在针对硒网格(例如浏览器堆栈等)使用任何基于云的解决方案,还是使用自己的红外硒网格?
答案 2 :(得分:0)
回答您的原始问题“运行多个浏览器测试的最佳实践是什么?”
您可以对两个都使用并行测试: 1)为了加快测试的执行速度,无论您使用多少浏览器或操作系统完成应用程序测试。
2)要同时验证您的应用程序在不同浏览器/操作系统版本上的行为。
要实现1),您只能将功能对象与maxInstances和shardTestFiles属性一起使用,例如:
capabilities : {
browserName : 'chrome',
maxinstances: 10 ,// if you want to run 10 specs in parallels //which speed up your test execution time by 10 times
shardTestFiles: true,
},
specs: 'features/**/*.feature'
要实现2),您可以使用如下所示的multiCapabilities对象
multiCapabilities:
[{
'browserName': 'chrome's,
},
{
'browserName': 'firefox',
{
'browserName': 'internet explorer',
{
'browserName': 'safari',
}],
specs: 'features/**/*.feature'