Как глобально добавить пользовательский локатор в 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;
});
};