我需要在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的静态方法?
答案 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异步功能创建一个新的流程混乱。