javascript - 如何以同步方式制作Promise API?

标签 javascript node.js selenium-webdriver promise synchronous

我使用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) 或更高版本),您可以将 yieldPromise.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/

相关文章:

node.js - Mongoose - 按标准在子文档中查找

javascript - 在 Knockoutjs 中异步加载页面

javascript - 使用 Javascript(真正)实时更新数据

javascript - 如何提取脚本标签内的属性值?

javascript - Selenium Webdriver Java - 创建按钮并按下它

python - 在 Selenium 和 Python 中找到下一个兄弟元素?

java - Selenium 的问题,我不知道应该使用哪个定位器

javascript - 简单的 Javascript 在 FireFox 中不起作用(但在所有其他浏览器中都起作用)

node.js - 如何加快 Mongoose 中的 MongoDB 查询速度?

javascript - 检索mysql列的最大值