如何在不创建webdriver实例的情况下创建webdriverjs承诺?

时间:2015-10-05 07:21:31

标签: selenium-webdriver webdriverjs

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

e.g。

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中用于创建promise的静态方法?

2 个答案:

答案 0 :(得分: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 website/docs site上找到解释,即

  

Prom Manager的核心是ControlFlow类。您可以使用webdriver.promise.controlFlow()获取此类的实例。任务使用execute()函数排队。任务总是在事件循环的未来转向中执行,一旦在队列中它之前的那些(如果有的话)已经完成。

答案 1 :(得分: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

更新

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