我使用selenium-webdriver用于使用 NodeJS 进行测试。 我想以同步方式制作 selenium-webdriver API,使我的测试非常简洁。
getTitle()安排一个命令来检索当前页面的标题。该API返回一个webdriver.promise.Promise
例如,我使用 selenium-webdriver
driver.getTitle().then(function(title) {
.....
});
driver.findElement(webdriver.By.name('q')).sendKeys('webdriver');
我怎样才能做到完全同步的API(使API Promise同步?),就像这样
var titleElement = driver.getTitle();
var qElement= driver.findElement(webdriver.By.name('q'));
qElement.sendKeys('webdriver');
更新(本杰明·格伦鲍姆回应):
将yield与bluebird中的Promise.coroutine一起使用API
function myBrowser() {
}
myBrowser.prototype.getTitle = Promise.coroutine(function* (driver) {
var title = yield driver.getTitle(); // yield makes it wait
console.log('prototype.getTitle: ' + title)
return title;
});
var driver = createDriver();
driver.get('https://www.google.fr/')
driver.getTitle().then(function(title) {
console.log('getTitle: ' + title)
});
// Use bluebird API
var mb = new myBrowser();
var title = mb.getTitle(driver)
// KO, It' an object Promise, not string title
console.log('main Process: ' + title)
输出
[INFO:CONSOLE(0)] main Process: [object Promise]
[INFO:CONSOLE(0)] getTitle: Google
[INFO:CONSOLE(0)] prototype.getTitle: Google
最佳答案
如果您使用的是新版本的 NodeJS(例如 io.js (node 3.0) 或更高版本),您可以将 yield
与 Promise.coroutine
一起使用来自 bluebird(这可以在旧版本中通过使用 --harmony-generators
标志运行来激活):
Promise.coroutine(function*(){
var title = yield driver.getTitle(); // yield makes it wait
yield driver.findElement(By.name("q")).sendKeys("webdriver");
})();
如果您像 T.J 建议的那样使用 babel,您还可以使用异步函数:
(async function(){
let title = await driver.getTitle();
// ...
})();
关于javascript - 如何以同步方式制作Promise API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32087317/