Angularjs 在量角器中创建和解决承诺

Angularjs 在量角器中创建和解决承诺,angularjs,selenium,protractor,Angularjs,Selenium,Protractor,我正在编写一个测试用例,用于使用量角器在Angular应用程序的页面中添加商店信息,最初我正在计算我已经拥有的商店数量,在测试块完成后,我希望数量会增加一个,因此我通过以下创建承诺的链接来实现这一点 我希望测试结束时存储计数相同。count()正在解析一个promise,并且在testPromise()中打印正确的存储计数值,但在调用testPromise()时在它的块中打印。然后,方法它永远不会进入“then”块 最终结果是 Message: Expected 6 to be 1. Sta

我正在编写一个测试用例,用于使用量角器在Angular应用程序的页面中添加商店信息,最初我正在计算我已经拥有的商店数量,在测试块完成后,我希望数量会增加一个,因此我通过以下创建承诺的链接来实现这一点

我希望测试结束时存储计数相同。count()正在解析一个promise,并且在testPromise()中打印正确的存储计数值,但在调用testPromise()时在它的块中打印。然后,方法它永远不会进入“then”块

最终结果是

Message:
 Expected 6 to be 1.
 Stacktrace:
  Error: Failed expectation
我还从这个链接中进一步研究了webdriver.promise.promise(),并尝试使用它创建承诺并解决其价值,但不确定问题出在哪里。我收到的错误消息是“预期6为NaN”或“预期6为1”,我是否未正确解析承诺或写入“then”阻止?希望您能就此问题提供一些见解/帮助。

要在量角器中创建承诺,您必须编写:

var deferred = protractor.promise.defer();
var promise = deferred.promise;

回调 回调是异步调用的。 您可以注册一个(或多个)“成功时”回调:

promise.then(function() {
   ...
});
您还可以注册一个(或多个)“出错”回调:

promise.then(null, function() {
   ...
});
这些注册可以链接:

promise.then(function() {
   ...
}).then(function() {
   ...
}).then(null, function() {
   ...
}).then(function() {

}, function() {
   ...
}).then(onSuccess, onFailure);

决议 成功 成功解析承诺时,将调用“on success”回调:

deferred.fulfill(value);
deferred.reject(new Error('a problem occurs'));
失败 成功解析承诺时,将调用“on failure”回调:

deferred.fulfill(value);
deferred.reject(new Error('a problem occurs'));

在代码中 你错过了解决问题的步骤。你必须履行诺言


中有一个更完整的参考,这里有一个用于量角器的用户定义函数的工作示例,它创建并实现(或拒绝)一个承诺:

// Get the text of an element and convert to an integer.
// Returns a promise.
function getTextAsInteger(element, radix) {
  // Specify a default radix for the call to parseInt.
  radix = radix || 10;
  // Create a promise to be fulfilled or rejected later.
  var deferred = protractor.promise.defer();
  // Get the text from the element. The call to getText
  // returns a promise.
  element.getText().then(
    function success(text) {
      var num = parseInt(text, radix);
      if (!isNaN(num)) {
        // Successfully converted text to integer.
        deferred.fulfill(num);
      } else {
        // Error converting text to integer.
        deferred.reject('could not parse "$1" into an integer'
          .replace('$1', text));
      }
    },
    function error(reason) {
      // Reject our promise and pass the reason from the getText rejection.
      deferred.reject(reason);
    });

  // Return the promise. This will be resolved or rejected
  // when the above call to getText is resolved.
  return deferred.promise;
}
函数将
元素
作为参数,并调用其
getText()
方法,该方法本身返回一个承诺。成功调用
getText()
,将文本解析为整数并实现承诺。如果
getText()
拒绝,我们将原因传递给我们自己的拒绝调用

要使用此函数,请传入元素承诺:

var numField = element(by.id('num-field'));
getTextAsInteger(numField).then(
    function success(num) {
        console.log(num);
    }, 
    function error(reason) {
        console.error(reason);
    });
或:


我也遇到了同样的问题,并通过为预期的物品数量创建承诺来解决它:

it('should accept valid data for adding new store', function() {
    // Given
    let expectedCountAfterNewRow = items.count().then((cnt)=>{return cnt+1}); 
    // Note: items.count() is a promise so the expected count should a promise too

    // When
    /* Code for adding test fields in store page */

    // Then
   expect(items.count()).toEqual(expectedCountAfterNewRow);
});

有人能用这个举个更具体的例子吗?我已经试着按照这个答案做了,但仍然没有成功。@BlakeBiker我想你应该问你自己的问题,描述你的具体问题上面指向webdriver文档的链接似乎已经过时了。@Chuck Vanderlinden fix link我需要从量角器包导入什么才能使用量角器,允诺,延期?我的IDE在那一行抱怨“找不到名称‘量角器’”。