对你们这些人来说,这是一个棘手的问题。我使用AngularJS和ngRoute
制作了一个简单的练习webapp。
在我的index.html
内,我有一个ng-view
元素,提供两页search_page.html
和detail_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")
答案 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()
)的一点知识,它将完全适合您的需求;)欢呼!