Указатель транспортира для formControlName

#angular #protractor

#angular #транспортир

Вопрос:

Я использую формы на основе моделей, где моя форма выглядит так:

 <form [formGroup]="form" (ngSubmit)="onSubmit(form.value)">
  <input type="text" formControlName="username">
  <input type="password" formControlName="password">
  <button type="submit" [disabled]="!form.valid">Submit</button>
</form>
  

Я хочу написать спецификацию транспортира для проверки входа в систему. Я хотел бы сделать что-то вроде следующего в моей спецификации:

     element(by.formControlName('username')).sendKeys('test@example.com');
  

Это, очевидно, не работает, так есть ли способ найти элементы управления формой или я смирился с тем фактом, что мне нужно указать класс или идентификатор в полях ввода?

Ответ №1:

Вы можете написать довольно простой CSS-селектор:

 element(by.css("input[formControlName=username]")).sendKeys('test@example.com');
  

Обратите внимание, что если вам нужно делать это часто, вы всегда можете определить пользовательский локатор для повторного использования:

 by.addLocator('formControlName', function(value, opt_parentElement, opt_rootSelector) {
  var using = opt_parentElement || document;

  return using.querySelectorAll('[formControlName="'   value  '"]');
});
  

Использование:

 element(by.formControlName('username')).sendKeys('test@example.com');
  

Комментарии:

1. by.css работает, спасибо. Куда бы я поместил addLocator, если я хочу использовать его глобально в своем приложении?

2. @MarkKenny отлично, вы должны поместить функцию by.addLocator into onPrepare() в конфигурацию вашего транспортира..

3. Спасибо, что перезвонили мне. Может быть, я слишком новичок в protractor, но я просто копирую / вставляю by.addLocator фрагмент кода в свою функцию onPrepare, и это просто заставляет все зависать. Возможно, проблема с конфигурацией где-то в другом месте. Когда я разберусь с этим, я опубликую

4. Похоже, что это проблема с Chrome и драйвером Chrome. Работает, если я переключаюсь на Firefox. Chrome driver v2.22 и Chrome v49, по-видимому, совместимы, но когда я запускаю свои тесты, Chrome зависает.