Как глобально добавить пользовательский локатор в Транспортир?

#protractor

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

Вопрос:

Я написал пользовательский локатор для транспортира, который находит anchor элементы по их ui-sref значению. В моих спецификациях я просто by.addLocator добавлял пользовательский локатор, но я подумал, что это может быть здорово опубликовать и заставить других людей использовать его.

Цель состоит в том, чтобы добавить этот пользовательский локатор в глобальный объект Protractor, чтобы его можно было использовать в любой из ваших спецификаций.

Мой первоначальный подход состоял в том, чтобы добавить эту функциональность в onPrepare блок конфигурации транспортира. Что-то вроде псевдокода ниже:

 onPrepare: function () {
  require('ui-sref-locator')(protractor); // The protractor object is available here.
}
 

Этот оператор require просто выполнит эту функцию:

 function (ptorInstance) {
  ptorInstance.by.addLocator('uiSref', function (toState, opt_parentElement) {
    var using = opt_parentElement || document;
    var possibleAnchors = using.querySelectorAll('a[ui-sref="'   toState  '"]');
    var result = undefined;

    if (possibleAnchors.length === 0) {
      result = null;
    } else if (possibleAnchors.length === 1) {
      result = possibleAnchors[0];
    } else {
      result = possibleAnchors;
    }

    return resu<
  });
};
 

Проблема в том, что by он не определен для protractor объекта, доступного в onPrepare блоке. Это означает, что я не могу использовать этот .addLocator метод.

Ответ №1:

Попробуйте следующее:

 function () {
  by.addLocator('uiSref', function (toState, opt_parentElement) {
  ...
 

By должен быть в глобальной области.

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

1. Нет. Транспортир инициализирован. Функция, которую я искал, является неперечисляемым свойством (я полагаю), и именно поэтому я не мог увидеть его с первого взгляда. Я все еще понимаю некоторые детали моего рабочего решения, но когда я закончу, я напишу правильный ответ.

2. Вы правы. Я только что проверил какой-то старый код, который я написал, который добавляет локатор внутри onPrepare(). Проверьте обновленный код.

Ответ №2:

protractor Объект, переданный в onPrepare блок, имеет By свойство. Это By свойство имеет унаследованное перечислимое свойство с именем addLocator . Мое понимание JavaScript довольно поверхностное, поэтому меня действительно сбило с толку, что, когда я console.log protractor.By редактировал, он возвращался {} , но если бы я это сделал for (var propName in protractor.By) , он показал бы мне все «скрытые» свойства. Я все еще пытаюсь понять этот бит.

Рабочий код:

 onPrepare: function () {
  require('ui-sref-locator')(protractor); // The protractor object is available here.
}
 

Требование выполнит приведенную ниже функцию:

 function (ptor) {
  ptor.By.addLocator('linkUiSref', function (toState, opt_parentElement) {
    var using = opt_parentElement || document;
    var possibleAnchors = using.querySelectorAll('a[ui-sref="'   toState  '"]');
    var result = undefined;

    if (possibleAnchors.length === 0) {
      result = null;
    } else if (possibleAnchors.length === 1) {
      result = possibleAnchors[0];
    } else {
      result = possibleAnchors;
    }

    return resu<
  });
};
 

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

1. Как мы можем вызвать эту функцию из отдельного JS, где нам нужно сохранить ее для вызова внутри конфигурации