#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, где нам нужно сохранить ее для вызова внутри конфигурации