如何在Protractor中全局添加自定义定位器?

时间:2014-06-27 18:51:35

标签: protractor

我为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方法。

2 个答案:

答案 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;
  });
};