量角器等待事件

时间:2017-03-03 15:18:43

标签: angularjs protractor

在它期间...会做一些事情....在角度编码的网站上进行功能测试,我有一个计数器字段,当给定的作业完成其后台任务时递增。

如何让量角器等到计数器从0变为1?

我已尝试过browser.wait,onprepare和isdisplay,但时间因作业而异。

基本上,我希望测试执行以下操作:  登录网站 按照一些按钮点击提交作业 验证计数器为0,当作业完成时,等待计数器为1 然后继续其他测试操作

由于

2 个答案:

答案 0 :(得分:1)

您可以编写自己的自定义函数来验证计数器值。此自定义函数可以传递给browser.wait函数。

假设以下是文件:

HTML文件

<html ng-app="myApp" ng-controller="MainController">

<head>
  <title>{{title}}</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.min.js"></script>
  <script src="src/app.js"></script>
</head>

<body>

  <div ng-controller="MyController">

    <div class="main">{{data}}</div>

    <div class="counter">{{counterVal}}</div>

    <button class="counter-btn" ng-click="increaseCounter()">Increase Counter</button>

  </div>
</body>

</html>

JS(Angular)文件

angular.module('myApp', [])
  .controller('MainController', MainController)
  .controller('MyController', MyController);

function MainController($scope) {
  $scope.title = 'Protractor test';
}

function MyController($scope, $timeout) {

  $scope.data = 'Hi!';
  $scope.counterVal = 0;

  $scope.increaseCounter = function () {

    // Async call, can be a network call.
    $timeout(function () {
      $scope.counterVal++;
    }, 1000);
  }

}

量角器测试文件

describe('localhost test page', function () {

  it('should open webpage', function () {

    browser.get('http://localhost/angularjs/index.html');

    expect(element(by.css('.main')).getText()).toEqual('Hi!');
    expect(element(by.css('.counter')).getText()).toEqual('0');

    // Click the button.
    element(by.css('.counter-btn')).click();

    browser.wait(waitForCounterIncrease('1'));

    // Click again
    element(by.css('.counter-btn')).click();

    browser.wait(waitForCounterIncrease('2'));

  });

  // This is the custom funtion.
  // Note: If condition is not met, this function will timeout based on the settings.
  function waitForCounterIncrease(val) {

    return function () {
      var deferred = protractor.promise.defer();
      element(by.css('.counter')).getText()
        .then(function (counterVal) {
          console.log(counterVal)
          if (counterVal === val) {
            deferred.fulfill(counterVal);
          }
        });
      return deferred.promise;
    }
  }

});

如果您运行上述测试,则​​应通过验证计数器值。

答案 1 :(得分:0)

通过使用done处理执行流程,您可以使Protractor停止任何非浏览器操作。 @cnishina here在同一个但不同的背景下有一个美丽的答案

describe('Step 1:Log in and wait for Job to complete', function _loginTo() {
    it('wait for Job to finish', function _setupStart(done) {
         //Regular Protractor Commands
         doLogin();
         submitJob();

         //Initiate the wait function. Wait till watever the state you need
         waitForJobToBeFinished().then(function(){
         done();
         }) 
    });
});