0

我需要在 webdriverJS 测试脚本中执行一些节点需要命令,因为这些不会进入 webdriverJS 命令队列,我将它们包装在.then()函数中(以处理异步)

例如

var webdriver = require('selenium-webdriver');

// create webdriver instance so promise chain can be setup 
var promise_builder = new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome()).
                     build();

// wrap all functions in webdriver promises so they get managed by webdrivers
// command queue
promise_builder.sleep(0).then(function() {

    // Run "non-command-queue" commands
    var tests = require('./test_commands');
    tests(helpers, setup, webdriver, driver);

}).then(function(){
    // more non-webdriver commands
});

这里的问题(除了它不优雅的事实)是启动了浏览器实例 - 只是为了实现承诺链。

是否有更好的方法来创建初始承诺,例如 webdriver api 中用于创建承诺的静态方法?

4

2 回答 2

0

我会用它webdriver.promise.createFlow(callback)来启动一个新的控制流。

所以你会有这样的事情:

webdriver.promise.createFlow(function() {
    // Run "non-command-queue" commands
    var tests = require('./test_commands');
    tests(helpers, setup, webdriver, driver);
}).then(function(){
    // more non-webdriver commands
});

文档:http ://selenium.googlecode.com/git/docs/api/javascript/namespace_webdriver_promise.html

更新

我现在倾向于webdriver.promise.controlFlow.execute()@the_velour_fog 所描述的选项,因为after在创建新的 controlFlow 时出现挂钩失败的错误。猜猜创建一个新的流程会与 mocha 异步功能混淆。

于 2016-03-30T19:10:35.297 回答
0

这似乎有效:

// create an instance of webdriver.promise.ControlFlow
var flow = webdriver.promise.controlFlow();

// use webdriver.promise.controlFlow#execute() to schedule statements into command queue
flow.execute(function() {

    // Run "non-command-queue" commands
    var tests = require('./test_commands');
    tests(helpers, setup, webdriver, driver);

}).then(function(){
    // more non-webdriver commands
});

可以在此Webdriver JS 网站/文档站点上找到解释,即

承诺管理器的核心是 ControlFlow 类。您可以使用 webdriver.promise.controlFlow() 获取此类的实例。使用 execute() 函数将任务排入队列。一旦队列中的任务(如果有的话)完成,任务总是在事件循环的未来轮次中执行。

于 2015-10-06T02:50:17.237 回答