在 hooks.js 文件中添加 BeforeScenario 时,Selenium-cucumber.js 测试未能 运行
Selenium-cucumber.js test failed to run while adding a BeforeScenario in hooks.js file
框架使用:selenium-cucumber-js。
我正在尝试 运行 下面的 selenium-cucumber-js 测试。我想 运行 loginApp()
函数作为 BeforeScenario
写在 hooks.js 文件中。但是在 运行 进行测试时,它目前抛出以下错误。有人可以请教如何解决这个问题。
`C:\Tests\cucumber\node_modules\cucumber\lib\cucumber\runtime\event_broadcaster.js:30 process.nextTick(function(){ throw error; }); // prevent swallow by unhandled rejection
TypeError: node_modules\cucumber\lib\cucumber\support_code\library.js:17 scenario.loginApp is not a function
at C:\Tests\cucumber\step-definitions\hooks.js:4:51
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)
at Module.runMain (module.js:606:11)
at run (bootstrap_node.js:390:7)
at startup (bootstrap_node.js:150:9)`
/**/Feature:**
//cucumber/features
功能:登录并查找“注册”选项卡
Scenario: Check the register tab in application
When After login look for "Register" in navbar
//**lookfortab.js**
//cucumber/step-definitions
const expect = require('chai').expect;
module.exports = function() {
this.When(/^After login look for "([^"]*)" in navbar$/, function (registerText) {
let navText = By.css('div#nav>div>ul>li>a');
driver.wait(until.elementLocated(navText, 10000));
return driver.findElement(navText).getText().then(el => {
console.log("print text here:"+el);
const displayTxt = el;
expect(displayTxt).to.be.eql(registerText);
});
})
}
//login.js
//cucumber/page-objects
module.exports = {
loginApp(){
this.driver.helpers.loadPage('https://testingsite.com')
this.driver.findElement(by.id('HomeLogin_Username')).sendKeys("Tester");
this.driver.findElement(by.id('HomeLogin_Password')).sendKeys("SomePassword123");
let lgBtn = By.css('div#login-fields>div>button');
this.driver.findElement(lgBtn).click();
}
};
//hooks.js
//cucumber/step-definitions
module.exports = function () {
this.BeforeScenario(function(scenario, done) {
console.log('BeforeScenario: ' + scenario.loginApp());
done();
});
};
首先,请注意 selenium-cucumber-js
使用的是相当旧的 cucumber-js
版本(撰写本文时为 1.3.3 与 5.0.2)。在查阅 cucumber-js
文档或查找示例时请记住这一点。下面,我将发布指向 cucumber-js@1.3.3
文档的链接。
至于你的设置有什么问题:
传递给挂钩的 scenario
对象没有附加页面对象。它只包含一些关于场景和获取它的方法的元信息。以下是它们的列表:cucumber-js docs
- 如果您想从挂钩中引用页面对象,可以使用全局
page
,如下所述:Page objects - selenium-cucumber-js
- 您的
loginApp()
功能可能仍然无法工作,因为您正在以 this.driver
访问 webdriver 并以 this.driver.helpers
访问助手。它们也由 selenium-cucumber-js
全局定义:Helpers
因此,您的 hooks.js
应该如下所示:
module.exports = function () {
this.BeforeScenario(function(scenario, done) {
console.log('BeforeScenario: ' + page.login.loginApp());
done();
});
};
还有你的login.js
:
module.exports = {
loginApp(){
helpers.loadPage('https://example.com')
driver.findElement(by.id('HomeLogin_Username')).sendKeys("Tester");
driver.findElement(by.id('HomeLogin_Password')).sendKeys("SomePassword123");
let lgBtn = By.css('div#login-fields>div>button');
driver.findElement(lgBtn).click();
}
};
框架使用:selenium-cucumber-js。
我正在尝试 运行 下面的 selenium-cucumber-js 测试。我想 运行 loginApp()
函数作为 BeforeScenario
写在 hooks.js 文件中。但是在 运行 进行测试时,它目前抛出以下错误。有人可以请教如何解决这个问题。
`C:\Tests\cucumber\node_modules\cucumber\lib\cucumber\runtime\event_broadcaster.js:30 process.nextTick(function(){ throw error; }); // prevent swallow by unhandled rejection
TypeError: node_modules\cucumber\lib\cucumber\support_code\library.js:17 scenario.loginApp is not a function
at C:\Tests\cucumber\step-definitions\hooks.js:4:51
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)
at Module.runMain (module.js:606:11)
at run (bootstrap_node.js:390:7)
at startup (bootstrap_node.js:150:9)`
/**/Feature:**
//cucumber/features
功能:登录并查找“注册”选项卡
Scenario: Check the register tab in application
When After login look for "Register" in navbar
//**lookfortab.js**
//cucumber/step-definitions
const expect = require('chai').expect;
module.exports = function() {
this.When(/^After login look for "([^"]*)" in navbar$/, function (registerText) {
let navText = By.css('div#nav>div>ul>li>a');
driver.wait(until.elementLocated(navText, 10000));
return driver.findElement(navText).getText().then(el => {
console.log("print text here:"+el);
const displayTxt = el;
expect(displayTxt).to.be.eql(registerText);
});
})
}
//login.js
//cucumber/page-objects
module.exports = {
loginApp(){
this.driver.helpers.loadPage('https://testingsite.com')
this.driver.findElement(by.id('HomeLogin_Username')).sendKeys("Tester");
this.driver.findElement(by.id('HomeLogin_Password')).sendKeys("SomePassword123");
let lgBtn = By.css('div#login-fields>div>button');
this.driver.findElement(lgBtn).click();
}
};
//hooks.js
//cucumber/step-definitions
module.exports = function () {
this.BeforeScenario(function(scenario, done) {
console.log('BeforeScenario: ' + scenario.loginApp());
done();
});
};
首先,请注意 selenium-cucumber-js
使用的是相当旧的 cucumber-js
版本(撰写本文时为 1.3.3 与 5.0.2)。在查阅 cucumber-js
文档或查找示例时请记住这一点。下面,我将发布指向 cucumber-js@1.3.3
文档的链接。
至于你的设置有什么问题:
-
传递给挂钩的
scenario
对象没有附加页面对象。它只包含一些关于场景和获取它的方法的元信息。以下是它们的列表:cucumber-js docs- 如果您想从挂钩中引用页面对象,可以使用全局
page
,如下所述:Page objects - selenium-cucumber-js - 您的
loginApp()
功能可能仍然无法工作,因为您正在以this.driver
访问 webdriver 并以this.driver.helpers
访问助手。它们也由selenium-cucumber-js
全局定义:Helpers
因此,您的 hooks.js
应该如下所示:
module.exports = function () {
this.BeforeScenario(function(scenario, done) {
console.log('BeforeScenario: ' + page.login.loginApp());
done();
});
};
还有你的login.js
:
module.exports = {
loginApp(){
helpers.loadPage('https://example.com')
driver.findElement(by.id('HomeLogin_Username')).sendKeys("Tester");
driver.findElement(by.id('HomeLogin_Password')).sendKeys("SomePassword123");
let lgBtn = By.css('div#login-fields>div>button');
driver.findElement(lgBtn).click();
}
};