何时(何时没有)等待selenium webdriverjs完成?

时间:2014-10-16 01:27:52

标签: javascript selenium-webdriver

有人可以详细解释我,为什么"一些" selenium 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();

1 个答案:

答案 0 :(得分:4)

该文档解释了Control Flows部分中发生的情况。

在幕后,这是所有的承诺,即使你不需要自己处理它们。 如果您没有特别告诉WebDriverJS,那么有一个承诺管理器处理指令,以便在许多情况下,为您处理承诺。文档给出了这个例子。如果您提供以下说明:

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函数,因此不参与承诺管理。