angularJS Protractor e2e Testing TypeError: Object [object Object] не имеет метода 'input'

У меня есть приложение с двумя страницами... первая страница - это целевая страница, на которой есть кнопка входа в систему... как только пользователь нажимает эту кнопку входа, он перенаправляется на login.html.... где есть два входа. Один для имени пользователя и один для пароля.

Соответствующий код выглядит так:

index.html

<a ui-sref="login" class="fa fa-sign-in" href="/login">&nbsp;Login</a>

и

login.html

<input type="text" id="username" name="username" placeholder="Username" ng-model="user.username" required="" autocomplete="off" class="ng-pristine ng-invalid ng-invalid-required">

<input type="password" name="password" placeholder="Password" ng-model="user.password" required="" autocomplete="off" class="ng-pristine ng-invalid ng-invalid-required">

В моем тесте я сначала нажимаю кнопку входа и проверяю, правильно ли я перенаправился на новую страницу. Этот тест проходит, но затем я получаю сообщение об ошибке, когда пытаюсь ввести данные в эти поля ввода, как будто этих полей не существует. Я пытался перевести браузер в спящий режим, но это тоже не сработало.

// in test/e2e/main.spec.js
describe('E2E: main page', function(){

'use strict';

var ptor;


// keep track of the protractor instance
beforeEach(function(){
    browser.get('http://127.0.0.1:9000/');
    ptor = protractor.getInstance();
});

it('it should load the login page once the login button is clicked', function(){

    var link = element(by.css('.fa.fa-sign-in'))

    link.click();


    browser.sleep(4000);

    expect(ptor.getCurrentUrl()).toMatch(/\/login/);

    element(by.input('user.username')).sendKeys('test');
    element(by.input('user.password')).sendKeys('test');

});


});

Любой совет?

ОБНОВИТЬ:

Использование by.model вместо by.input работает, но в книге, которую я читал, говорилось, что первый тоже должен работать... странно.


person es3735746    schedule 02.07.2014    source источник


Ответы (1)


Локатор by.input() устарел, и вам следует использовать by.model(), однако вы можете определить свой собственный, если вам это действительно нужно, например:

by.addLocator('input', function(model, opt_parentElement) {
  using = using || document;
  var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\:'];
  for (var p = 0; p < prefixes.length; ++p) {
      var selector = 'input[' + prefixes[p] + 'model="' + model + '"]';
      var inputs = using.querySelectorAll(selector);
      if (inputs.length) {
          return inputs;
      }
   }
});

// To use the locator
element(by.input('username')).sendKeys('test');
person adamK    schedule 02.07.2014