我可以从承诺中返回数据吗?

时间:2016-09-08 14:03:10

标签: webdriverjs

我正在寻找有关SO问题get an array of elements from findElement(By.className())

的更多帮助

这是关于使用Selenium Webdriver的javascript实现自动化网站组件。

从引用问题中给出的示例中,我无法弄清楚如何将allHtml数组传递回调用方法,直到测试逻辑所在的小黄瓜步骤定义。

我已经尝试了几种方法(文档太多了),使用了数小时的Google搜索。我只是没有得到如何从一个承诺传回任何东西(一旦它被解决,我们已经定义了allHtml)。是的,我可以输出到控制台,但这在现实测试场景中没有帮助,我需要根据实际与预期的比较断言通过或失败。

承诺是痛苦的。他们对我来说是新手,直到我把头包住他们才会受伤。

作为最后的手段(也许只是解决方案)我将考虑使用webdriver-sync以避免使用javascript版本的webdriver本机的承诺。

如果可能的话,任何帮助或指导都将在理解如何从承诺完全解决后将其传递回去时受到赞赏。我觉得在他们准备好时,而不是在之前或之后使用的东西都是承诺。

谢谢,Al。

AddApplicationPage.prototype.getFilteredAppLibraryTemplates = function (context) {
    var eleArray = this.getAppLibraryTemplateIcons(context);
    return eleArray;
}

AddApplicationPage.prototype.getAppLibraryTemplateIcons = function (context) {

    var pendingElements = context.driver.findElements(By.className('appLibrary-templateIcon'))

    pendingElements.then(function (elements) {
        var pendingHtml = elements.map(function (elem) {
            return elem.getInnerHtml();
        });
        promise.all(pendingHtml).then(function (allHtml) {
            // how do i pass allHtml back up the food chain 
            // so i can do some comparison to the expected list
        });
    });
}

2 个答案:

答案 0 :(得分:0)

你不能。

异步函数仍然是异步函数。 You can't return the result from it。 <{1}}完成执行后,结果不存在。

承诺只是一个方便的对象,您可以随时返回,传递和分配回调函数。

你说你使用的是Gerkin,所以我假设你正在使用Cucumber.js。看看documentation

findElements

传递给传递给步骤定义的函数的第一个参数是在得到结果时调用的回调函数。

不要担心将结果传回。只需传递回调函数 forward ,并在完成后调用它。

答案 1 :(得分:0)

解决了它,够了。我的愿望是在小黄瓜步骤定义中对元素进行验证(与预期相比)。 我发现,如果我将承诺转换为数组转换为步骤定义,它也可以工作,并且不会掩盖验证过程。 更糟糕的情况是我会使用这个解决方案。

AddApplicationPage.prototype.getAppLibraryTemplateIcons = function (context) {
    return context.driver.findElements(appLibraryTemplateIcon);
}

this.Then(/^I should see matching filtered results$/, function () {

  var pedingElements = addApplicationPage.getAppLibraryTemplateIcons(this);

  pedingElements.then(function (elements) {

      var pendingHtml = elements.map(function (elem) {
          return elem.getInnerHtml();
      });

      promise.all(pendingHtml).then(function (allHtml) {
          var expectedHtml = ["Google Apps"];        
          expect(expectedHtml).to.deep.equal(allHtml);    
      })

  });                                                                   
});