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

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

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

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

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

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

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 result;
  });
};

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

2 ответа

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

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

По должен быть в глобальном масштабе.

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 result;
  });
};
Другие вопросы по тегам