如何在使用Jasmine和Protractor进行测试时使用复合定位器

时间:2014-08-14 19:24:10

标签: angularjs testing automation jasmine protractor

在使用Jasmine和Protractor进行测试时,有人能为我提供一个如何使用多个定位器的示例吗?

假设我有LINKS形式的3个列表元素,并且所有这些LIST ELEMENTS具有相同的属性;但是,每个都是具有唯一名称的链接,以导航到新的“Angular State”......

示例所有三个链接都包含以下内容:

<li> ng-repeat="bb" ng-class="{'active': dropdown.isActive}" class="ng-scope active"</li>

然后每个链接都有自己的名称,例如:

<a ui-sref="search" class="ng-binding" href="#/Search"> Search </a>
<a ui-sref="home" class="ng-binding" href="#/Search"> Home </a> 
<a ui-sref="todo" class="ng-binding" href="#/Search"> ToDo </a>

3页对象之间唯一独特的是: ui-sref="search"ui-sref="home"ui-sref="todo"...

如何使用list元素中的一个公共定位器和link元素中的唯一定位器来确保每次都与正确的链接进行交互?

1 个答案:

答案 0 :(得分:4)

我使用custom locator来处理ui-sref

// Usage:
var searchLinkElm = element(by.uisref('search'));
var homeLinkElm = element(by.uisref('home'));
var todoLinkElm = element(by.uisref('todo'));

// Interaction
it('works', function() {
    expect(searchLinkElm.isPresent()).toBeTruthy();
    searchLinkElm.click();
});

// within your onPrepare block
by.addLocator('uisref', function(toState, opt_parentElement) {
    var using = opt_parentElement || document;

    var prefixes = ['ui-sref'];
    for (var p = 0; p < prefixes.length; ++p) {
        var selector = '*[' + prefixes[p] + '="' + toState + '"]';
        var inputs = using.querySelectorAll(selector);
        if (inputs.length) {
            return inputs;
        }
    }
});