我为Protractor编写了一个自定义定位器,它按anchor
值查找ui-sref
个元素。在我的规范中,我只是使用by.addLocator
来添加自定义定位器,但我认为这可能是一个很酷的事情发布并让其他人使用它。
目标是将此自定义定位器添加到全局Protractor对象中,以便可以在任何规范中使用它。
我最初的方法是在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 result;
});
};
问题是by
块中的protractor
对象未定义onPrepare
。这意味着我无法使用.addLocator
方法。
答案 0 :(得分:4)
尝试以下方法:
function () {
by.addLocator('uiSref', function (toState, opt_parentElement) {
...
应该在全球范围内。
答案 1 :(得分:3)
传递给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.
}
require将执行以下函数:
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;
});
};