AngularJS Protractor e2e тестирует ошибку типа: объект [object Object] не имеет метода ‘input’

#javascript #angularjs #protractor #angularjs-e2e #end-to-end

#javascript #angularjs #транспортир #angularjs-e2e #сквозной

Вопрос:

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

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

 index.html

<a ui-sref="login" class="fa fa-sign-in" href="/login">amp;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 работает, но в книге, которую я читал, говорилось, что первый должен работать слишком … странно.

Ответ №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');