我使用selenium-webdriver进行NodeJS测试。我想以一种同步方式制作selenium-webdriver API,以使我的测试非常简洁。getTitle()安排一个命令来检索当前页面的标题。此API返回一个webdriver.promise.Promise例如用selenium-webdriverdriver.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');更新(本杰明·格伦鲍姆回应):通过bluebird API将Promise.coroutine与yield一起使用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 APIvar mb = new myBrowser();var title = mb.getTitle(driver)// KO, It' an object Promise, not string titleconsole.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(节点3.0)或更高版本),则可以将yield与bluebird中的Promise.coroutine一起使用(可以在旧版本中通过与标志):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(); // ...})();
10-07 21:47