为什么定位器()在量角器?

时间:2016-08-19 10:39:25

标签: selenium selenium-webdriver protractor

源: http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.locator

// returns by.css('#ID1')
$('#ID1').locator()

// returns by.css('#ID2')
$('#ID1').$('#ID2').locator()

// returns by.css('#ID1')
$$('#ID1').filter(filterFn).get(0).click().locator()

我相信,除了locator()之外,它也可以完成相同的工作;此API的任何原因或具体原因?

2 个答案:

答案 0 :(得分:3)

就个人而言,我只是用它来更好地记录错误。即。

it('should display the facility name', function () {
    var el = element(by.css('div.facilityName'));
    expect(el.isDisplayed()).toBe(true, 'Expected element ' + el.locator() + ' to be present and visible';
});

这在我的控制台中返回:

  

失败:

     

1)应显示设施名称

     

预期false为true,'Expected By(css selector,div.facilityName)存在且可见'。

类似地,我将它与一些辅助函数一起使用(我在Non-Angular上使用Protractor,所以我没有等待Angular同步的能力,所以我使用下面的帮助器:

/**
* @description Prevents test execution until the given element is present in the DOM
* @param [el] The element locator [time] The optional max timeout in ms [opts] The options
*/
Util.prototype.waitForElementPresent = function (el, time, opts) {
    var timeout = time || 0,
    counter = 0,
    verbose = opts ? opts.verbose : false;

    return browser.wait(function() {
        if (verbose) {
            process.stdout.write( !counter ? 'waitForElementPresent [' + el.locator() + '] ' : '.');
            counter = counter + 1;
        }
        return el.isPresent();
    }, timeout).then(function () {
        if (verbose) {
            process.stdout.write('\n');
        }
    });
};

用法:

it('should display the facility name', function () {
    var el = element(by.css('div.facilityName'));
    Util.waitForPresentAndVisible(el, 10000, {verbose: true});
    expect(el.isDisplayed()).toBe(true, 'Expected element ' + el.locator() + ' to be present and visible';
});

打印到控制台:

  

waitForElementPresent [By(css selector,div.facilityName)] ..........

这有点微不足道,因为错误将包括失败代码的行和索引。但我发现在某些情况下只是为了改进错误记录。

我很好奇其他人如何使用它。

答案 1 :(得分:2)

在现实世界中使用locator()并不多,但是通过获取父元素的定位器并将其与直接子元素连接到动态,这是另一个用例 - avoid using by.xpath() in solving the "getting direct child of a current element" problem with CSS selectors生成一个完整的CSS选择器。