使用 Selenium 步骤定义从 CucumberJS 执行回调
Executing callback from a CucumberJS with Selenium step definition
我正在用 Selenium 和 PhantomJS 试用 CucumberJS。我已经成功 作为向导。
所以现在我正在测试一些基本的步骤定义,但对如何在步骤结束时执行回调有些困惑。这很好用:
module.exports = function () {
this.World = require("../support/world.js").World;
this.Given(/^I am visiting Google$/, function (callback) {
this.driver.get('http://www.google.com')
.then(function() {
callback();
});
});
};
驱动程序点击 Google.com,直到加载请求的文档后才会触发回调。但是我发现这个语法有点罗嗦,所以我想也许我可以在我的第一个 promise 之后直接将 callback
传递给 then()
,就像这样:
module.exports = function () {
this.World = require("../support/world.js").World;
this.Given(/^I am visiting Google$/, function (callback) {
this.driver.get('http://www.google.com')
.then(callback);
});
};
这不过是失败了,似乎console.log
callback
。这是输出:
Scenario: Googling # features/theGoogle.feature:6
Given I am visiting Google # features/theGoogle.feature:7
[object Object]
(::) failed steps (::)
[object Object]
这是怎么回事?我期待 callback
可以简单地传递给 then()
函数并在承诺完成后执行。为什么将它包装在一个匿名函数中使其工作?
正在发生的事情是使用 driver.get().then
的参数调用 callback
。
换句话说,是这样的:
this.driver.get('http://www.google.com')
.then(function(result) {
callback(result);
});
问题是,如果以某些东西作为第一个参数调用回调,cucumber 的回调将认为失败,因为它应该是 callback(new Error('Something went wrong'))
.
中的错误
对我来说,这足以完全禁止使用回调。 Selenium 是完全面向承诺的,只有当你想让你的生活更轻松时,你才应该遵守承诺。这是完美的,因为 cucumber.js 接受承诺 returned 而不是回调,所以这是最好的方法:
// Be sure to omit the last parameter of the function, usually "callback"
this.Given(/^I am visiting Google$/, function () {
return this.driver.get('http://www.google.com');
});
如果承诺最终被拒绝,该步骤将失败,或者如果承诺已完成,则继续下一步。但在这两种情况下,黄瓜都会等待最后一个承诺,所以你需要做的总是 return 任何步骤的最后一个承诺,因为 Selenium 只会 resolve/reject 前一个承诺之后的最后一个承诺已解决。一切看起来都好多了不是吗?
我正在用 Selenium 和 PhantomJS 试用 CucumberJS。我已经成功
所以现在我正在测试一些基本的步骤定义,但对如何在步骤结束时执行回调有些困惑。这很好用:
module.exports = function () {
this.World = require("../support/world.js").World;
this.Given(/^I am visiting Google$/, function (callback) {
this.driver.get('http://www.google.com')
.then(function() {
callback();
});
});
};
驱动程序点击 Google.com,直到加载请求的文档后才会触发回调。但是我发现这个语法有点罗嗦,所以我想也许我可以在我的第一个 promise 之后直接将 callback
传递给 then()
,就像这样:
module.exports = function () {
this.World = require("../support/world.js").World;
this.Given(/^I am visiting Google$/, function (callback) {
this.driver.get('http://www.google.com')
.then(callback);
});
};
这不过是失败了,似乎console.log
callback
。这是输出:
Scenario: Googling # features/theGoogle.feature:6
Given I am visiting Google # features/theGoogle.feature:7
[object Object]
(::) failed steps (::)
[object Object]
这是怎么回事?我期待 callback
可以简单地传递给 then()
函数并在承诺完成后执行。为什么将它包装在一个匿名函数中使其工作?
正在发生的事情是使用 driver.get().then
的参数调用 callback
。
换句话说,是这样的:
this.driver.get('http://www.google.com')
.then(function(result) {
callback(result);
});
问题是,如果以某些东西作为第一个参数调用回调,cucumber 的回调将认为失败,因为它应该是 callback(new Error('Something went wrong'))
.
对我来说,这足以完全禁止使用回调。 Selenium 是完全面向承诺的,只有当你想让你的生活更轻松时,你才应该遵守承诺。这是完美的,因为 cucumber.js 接受承诺 returned 而不是回调,所以这是最好的方法:
// Be sure to omit the last parameter of the function, usually "callback"
this.Given(/^I am visiting Google$/, function () {
return this.driver.get('http://www.google.com');
});
如果承诺最终被拒绝,该步骤将失败,或者如果承诺已完成,则继续下一步。但在这两种情况下,黄瓜都会等待最后一个承诺,所以你需要做的总是 return 任何步骤的最后一个承诺,因为 Selenium 只会 resolve/reject 前一个承诺之后的最后一个承诺已解决。一切看起来都好多了不是吗?