我正在尝试在Webdriver上下文之外使用WebDriverJS promise。我有一个实用程序,可以启动代理,设置自定义标头,停止代理等。我想在启动浏览器之前启动并设置自定义标头(在初始化webdriver之前)。该实用程序中的所有方法都返回WebdriverJS的承诺。这是代码,
BrowserProxy.prototype = {
'start': function () {
var d = webdriver.promise.defer();
someAsync(
//here promise is either fulfilled or rejected;
//d.reject(err) or d.fulfill();
);
return d;
},
'setHeaders': function () {
//similar stuff like start method
},
'stop': function () {
//similar stuff like start method
}
}
在这个文件之外,我在下面做,但是在浏览器启动之前所有代理方法都会执行。
browserProxy.start();
//initialize driver
browserProxy.setHeaders();
driver.get('http://www.google.com);
browserProxy.stop();
但是如果我用then
方法链接调用,则需要流程方法。我不知道为什么。有人可以帮忙吗?
答案 0 :(得分:3)
我认为你的问题的答案是:Selenium" Control Flow"。控制流包含所有对selenium API的调用,如下所述:Control Flow。
如果你想按顺序执行"" (同步)一些" async"在selenium上下文中的任务,您应该将它添加到主控制流。 (请注意,您也可以创建自定义流程)
您的代码应如下所示:
BrowserProxy.prototype = {
'start': function () {
var flow = webdriver.promise.controlFlow();
flow.execute(function(){
var aPromiseToResolveWhenAsyncTaskEnds = webdriver.promise.defer();
doAnAsyncTask().then(function(){
aPromiseToResolveWhenAsyncTaskEnds.fulfill();
});
return aPromiseToResolveWhenAsyncTaskEnds.promise;
});
},
'setHeaders': function () {
//similar stuff like start method
},
'stop': function () {
//similar stuff like start method
}
}