量角器在ng-view中不会获得转发器

时间:2016-01-04 16:34:30

标签: angularjs google-chrome protractor

对你们这些人来说,这是一个棘手的问题。我使用AngularJS和ngRoute制作了一个简单的练习webapp。 在我的index.html内,我有一个ng-view元素,提供两页search_page.htmldetail_of_result_page.html。代码工作得很好,我把东西放在第一页输入字段,点击搜索按钮,所有结果神奇地出现在我的页面中。问题来自量角器似乎没有看到我的result in results转发器与他的:

  element.all(by.repeater("result in results")) 

我试图输入browser.pause()并注意错误,但一切似乎都是正确的。

我忘记了量角器的错误代码:

Failed: Index out of bound. 
Trying to access element at index: 0, but there are only 0 elements that match locator by.repeater("result in results")

1 个答案:

答案 0 :(得分:0)

好的,在searchTest.js line: 27

    beforeEach(function () {

        var EC = protractor.ExpectedConditions;
        browser.wait(EC.presenceOf($('li')),5000);

        var resultItem = element.all(by.repeater('result in results')).first(); //BUG

        var resultLink = resultItem.element(by.css('a'));
        resultLink.click();
        resultId = resultLink.getAttribute('href').then(function (attr) {
            //var res = attr.match('/\/TDDBook\/Search\/#\/detail\/(\d+)/')[1]; // TODO: fix this shit
            return 1;
        });
    });

resultLink.click();之前,事情似乎没有问题。假设它适用于第一个it ("should set the url to the selected detail view")。但是当它到达第二it("should see the details in the main page component")时,你不再在/#/splash路线上了。因此,当beforeEach()再次运行时,无法再找到您的pereater。

解决方案

您的beforeEach对您的第二个it("should see the details in the main page component")似乎没有用,而且逻辑上无法运行。所以只需移动所有这样的东西:

    it ("should set the url to the selected detail view",function () {
        var EC = protractor.ExpectedConditions;
        browser.wait(EC.presenceOf($('li')),5000);

        var resultItem = element.all(by.repeater('result in results')).first(); //BUG

        var resultLink = resultItem.element(by.css('a'));
        resultLink.click();
        resultId = resultLink.getAttribute('href').then(function (attr) {
            //var res = attr.match('/\/TDDBook\/Search\/#\/detail\/(\d+)/')[1]; // TODO: fix this shit
            return 1;
        });

        resultId.then(function (id) {
            var expectedUrl = '/detail/'+id;
            browser.getLocationAbsUrl().then(function (url) {
                expect(url).toBe(expectedUrl);
            })
        })
    })

P.S。仅为了您的信息,量角器中有Page Object,这与您尝试对beforeEach()进行的操作相符。再加上对commonJS(module.exports& require())的一点知识,它将完全适合您的需求;)欢呼!