当前位置: 首页 > 面试题库 >

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

萧煜
2023-03-14
问题内容

我正在编写一个测试用例,用于使用Protractor在Angular应用程序的页面中添加商店信息,在这里我最初是在计算已经拥有的商店数量,并且在完成测试块后,我希望该数量增加一,因此通过遵循创建承诺的链接来做到这一点如何在量角器中创建和操纵承诺?

describe('myApp', function() {
  var items,startCount;

  var testPromise = function(){
    items = element.all(by.repeater('store in storelist'));
    var deferred = protractor.promise.defer();
    items.count().then(function(orgCount){
       startCount = orgCount;
       console.log('Start Count: '+ startCount); //prints correct value e.g, 6
    }, function(error){
       console.log(error);
    });
    return deferred.promise;
  };

it('should accept valid data for adding new store', function() {
   var cNum = null;
   testPromise().then(function(result){
      cNum = result;
      console.log('cNUm value: '+ cNum); //this value doesn't get printed in console
   });
   /* Code for adding test fields in store page */

   expect(items.count()).toBe(cNum+1);
 });
});

我希望测试结束时商店的数量是相同的。count()正在解决一个承诺,并且商店计数的正确值会打印在testPromise()中,但是当我调用testPromise()时会在该块中打印。那么方法就永远不会出现在``then’‘块中

最终结果说

Message:
 Expected 6 to be 1.
 Stacktrace:
  Error: Failed expectation

我还通过此链接http://selenium.googlecode.com/git/docs/api/javascript/class_webdriver_promise_Promise.html对webdriver.promise.Promise()进行了更多研究,并尝试使用它来创建承诺并解决其价值但不确定是什么问题。我收到错误消息说“期望6为NaN”或“期望6为1”是我没有解决承诺还是没有正确编写“
then”块?希望对这个问题有一些见解/帮助。


问题答案:

这是一个用于Protractor中的用户定义函数的工作示例,该函数创建并实现(或拒绝)promise:

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

该函数以element参数为参数,并调用其getText()方法,该方法本身返回一个Promise。成功调用时getText(),将文本解析为整数并兑现承诺。如果getText()拒绝,我们会将原因传递给我们自己的拒绝电话。

要使用此功能,请传递一个元素promise:

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

要么:

var numField = element(by.id('num-field'));
expect(getTextAsInteger(numField)).toEqual(jasmine.any(Number));
expect(getTextAsInteger(numField)).toBeGreaterThan(0);


 类似资料:
  • 问题内容: 我想使用Node Http模块直接调用服务器以设置我的量角器测试。Http基于回调,我想将其变为promise。 例如,我想让这个函数返回promise: 因此,问题是:我需要什么并代替“以某种方式创造承诺”才能使之起作用? 问题答案: 量角器使用WebDriver的承诺,并在“量角器”上全局公开该API。所以你应该能够做 有关完整的WebDriverJS Promise API,请参

  • 问题内容: 库具有此整齐的功能,可以解决多个promise并将其分散到单独的参数中: 如果对数组有保证,则可以使用点差代替。传播函数将值“传播”在实现处理程序的参数上。 在量角器中,我们尝试使用来自的内置函数。 问题: 是否可以使用“传播”功能? 用例示例: 我们已经实现了一个自定义的茉莉花匹配器,以检查元素是否聚焦。在这里,在进行相等比较之前,我们需要解决两个诺言。目前,我们正在使用和: 理想情

  • 问题内容: 我想做这样的事情: 因此,我想声明一个承诺,可以使用then来解决。但是,此承诺可能会被另一个返回内容的承诺覆盖。以后我想解决诺言是否有内容。这可能吗?我尝试过: 但是,当用户在场时这不起作用。有任何想法吗? 问题答案: 就像Bixi所写的那样,您可以使用将承诺或价值包装到承诺中。如果您传递给的是承诺,则将返回该承诺,否则将创建一个新的承诺,并直接使用您传递的值来解决。类似以下内容:

  • 问题内容: 我对angular中的$ q库如何工作有一个不错的想法,但是我不确定量角器或web-driver- js如何使用它们。(特别是因为我认为量角器/网络驱动程序/角度之间的利用率略有不同) 例如,我在量角器教程中看到的示例代码似乎是逐行编写的,并且假定上一个在下一个之前完成。(例如,browser.get(url)后跟browser.getTitle())是否存在某种隐含的承诺?(我不必手

  • 当我试图对chrome运行量角器测试时,我得到以下错误。

  • 问题内容: 在我的控制器中,我从另一项服务中获得了承诺。我在其中添加了“ then”子句,但从未调用过“ then”。 看到这个矮人:http ://plnkr.co/edit/dX0Oz1?p=preview (javascript版本) “ fakeLongRunningPromise”会创建一个承诺,该承诺会在2秒后自动解决。 一旦履行了诺言,我便在控制器本身中向控制台发送了一条便条。 我可