0

我正在寻找有关 SO 问题的更多帮助get a array of elements from findElement(By.className())

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

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

我已经尝试了几种方法(太多无法记录),并进行了数小时的谷歌搜索。我只是不知道如何从承诺中传回任何东西(一旦解决并且我们定义了 allHtml)。是的,我可以输出到控制台,但这在现实世界的测试场景中没有帮助,我需要根据实际与预期的比较来断言通过或失败。

承诺是痛苦的。它们对我来说是新的,在我把头缠在它们周围之前会很痛。

作为最后的手段(可能是唯一的解决方案),我将研究使用webdriver-sync以避免 webdriver javascript 版本的原生承诺。

任何帮助或指导将不胜感激,如果可能的话,一旦完全解决,如何将事情从承诺中传回。在我看来,Promise 似乎是关于在它们准备好时使用它们,而不是之前或之后。

谢谢,艾尔。

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
        });
    });
}
4

2 回答 2

0

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

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);    
      })

  });                                                                   
});
于 2016-09-08T14:44:15.767 回答
0

你不能。

异步函数仍然是异步函数。您不能从中返回结果。执行完成时结果不存在findElements

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


您说您使用的是 Gerkin,所以我假设您使用的是 Cucumber.js。查看它的文档

  this.Given(/^I am on the Cucumber.js GitHub repository$/, function (callback) {
    // Express the regexp above with the code you wish you had.
    // `this` is set to a World instance.
    // i.e. you may use this.browser to execute the step:

    this.visit('https://github.com/cucumber/cucumber-js', callback);

    // The callback is passed to visit() so that when the job's finished, the next step can
    // be executed by Cucumber.
  });

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

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

于 2016-09-08T14:07:57.373 回答