Protractor sendKeys завершается ошибкой при использовании angular-http-auth для отображения окна входа

Я использую angular-http-auth и пример из http://witoldsz.github.io/angular-http-auth/ для отображения формы входа в систему.

Вот страница index.html:

<!DOCTYPE html>
<html ng-app="rdx">
<head>
  <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
  <link rel="stylesheet" href="css/styles.css">
</head>

<body class="auth">

  <div id="login-holder" style="display:none">
    <div id="loginbox">
      <div id="login-inner" ng-controller="UserController">
        <div class="row">
          <div class="col-sm-6 col-sm-offset-2">
            <div class="page-header"><h1>Please Sign In</h1></div>
            <div ng-if="message" class="panel panel-danger">
              <div class="panel-heading">Error</div>
              <div class="panel-body">{{message}}</div>
            </div>

            <form name="form" ng-submit="submit()">
              <div class="form-group">
                <label class="control-label">Username</label>
                <input class="form-control" ng-model="user.username" type="text" name="username" placeholder="Username" />
              </div>
              <div class="form-group">
                <label class="control-label">Password</label>
                <input class="form-control" ng-model="user.password" type="password" name="password" placeholder="Password" />
              </div>
              <input id="login-button" class="btn btn-primary" type="submit" value="Login" />
            </form>
          </div>
        </div>
        <div class="clear"></div>
      </div>
    </div>
  </div>

  <div id="content">
    <nav class="navbar navbar-inverse" role="navigation">
    <div class="navbar-header">
      <a class="navbar-brand" href="#">AngularRDX</a>
    </div>
    <ul class="nav navbar-nav">
      <li ng-class="{ active: $state.includes('cases') }"><a ui-sref="cases.list">Cases</a></li>
      <li ng-class="{ active: $state.current.name == 'about' }"><a ui-sref="about">About</a></li>
    </ul>
    <p ng-if="user.name" class="navbar-text navbar-right">Signed in as {{user.name}}</p>
    </nav>

    <div class="container">

      <div ui-view>
      </div>

    </div>
  </div>

  <script src="angular/angular.js"></script>
  <script src="angular-ui-router/release/angular-ui-router.js"></script>
  <script src="angular-animate/angular-animate.js"></script>
  <script src="angular-http-auth/src/http-auth-interceptor.js"></script>
  <script src="jquery/dist/jquery.js"></script>
  <script src="js/app.js"></script>

</body>
</html>

Это обрабатывается в такой директиве:

angular.module('rdx.auth') 
.directive('auth', function() {
  return {
    restrict: 'C',
    link: function(scope, elem, attrs) {

        var login = $('#login-holder');
        var main = $('#content');

        scope.$on('event:auth-loginRequired', function() {
          login.slideDown('slow', function() {
          main.hide();
        });
        scope.$on('event:auth-loginConfirmed', function() {
          main.show();
          login.slideUp();
        });
    }
  }
});

В моем тесте Protactor я запускаю событие входа в систему, нажимая на пункт меню, который делает http-запрос защищенным. Сервер отвечает 401 и angular-http-auth передает событие event:auth-loginRequired обрабатываются выше.

it('should require a login and then display the list of cases', function() {
  browser.get('/'); 
  var usernameInput = element(by.model('user.username'));
  var passwordInput = element(by.model('user.password'));

  element(by.css('.navbar ul li')).click();
  expect(element(by.model('user.username')).isPresent()).toBe(true);
  //browser.sleep(500);
  usernameInput.sendKeys('admin');
  passwordInput.sendKeys('doit');
  element(by.id('login-button')).click();

  expect(element(by.css('.page-header')).isPresent()).toBe(true);
  var elems = element(by.repeater('c in cases').column('{{c.name}}'));
  expect(elems.getText()).toEqual('bob');
});

Тест не пройден:

==== async task ====
WebElement.sendKeys([object Object])
==== async task ====
Asynchronous test function: it("should require a login and then display the list of cases")
Error
    at null.<anonymous> (/Users/csturm/dev/node/angularjs/rdx/test/e2e/cases.js:23:21)

Строка 23: usernameInput.sendKeys('admin');

Этот тест будет работать, если я раскомментирую browser.sleep(500).. Я считаю, что это потому, что JQuery slideDown в директиве завершено к тому времени.

Есть ли другой способ сделать это без сна? Могу ли я использовать угловую анимацию или блокировать тест до event:auth-loginRequired обрабатывается?

0 ответов

Другие вопросы по тегам