有人可以详细解释一下,为什么硒webdriverjs中的“某些”操作需要等待异步函数返回而其他人不需要?
在官方示例中,driver.get('http://www.google.com')
在使用driver.findElement
之前不使用任何保证来等待完成,但是在检索标题时,driver.getTitle()
在比较之前使用一个保证。
var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.chrome()).
build();
driver.get('http://www.google.com');
driver.findElement(webdriver.By.name('q')).sendKeys('webdriver');
driver.findElement(webdriver.By.name('btnG')).click();
driver.wait(function() {
return driver.getTitle().then(function(title) {
return title === 'webdriver - Google Search';
});
}, 1000);
driver.quit();
最佳答案
该文档解释了Control Flows部分中发生的情况。
在幕后,所有的承诺,即使您不需要自己处理。
如果没有特别告诉WebDriverJS,则有一个Promise Manager处理指令,以便在许多情况下为您处理Promise。文档提供了此示例。如果您给出以下指示:
driver.get(“http://www.google.com”);
driver.findElement(webdriver.By.name('q')).sendKeys('webdriver');
driver.findElement(webdriver.By.name('btnG')).click();
driver.getTitle().then(function(title) {
console.log(title);
});
承诺管理器将它们编织成这样:
driver.get(“http://www.google.com”).
then(function() {
return driver.findElement(webdriver.By.name('q'));
}).
then(function(q) {
return q.sendKeys('webdriver');
}).
then(function() {
return driver.findElement(webdriver.By.name('btnG'));
}).
then(function(btnG) {
return btnG.click();
}).
then(function() {
return driver.getTitle();
}).
then(function(title) {
console.log(title);
});
您需要处理
getTitle
返回的诺言的原因是console.log
不是WebDriverJS函数,因此不参与诺言管理。