我是AngularJS /量角器的新手,所以对此有任何指导都非常感谢。 由于Angular JS通过ng-directive实例化html元素,因此没有“id”等允许我定位特定元素。 (显然我想这样做来验证内容,点击它们等) 我的角度js片段看起来像:
<div ng-repeat="item in myList">
<span ng-if="item.category == 'lights'">
<img src="../../../{{item.icon}}"/>
 <span id="foo">{{item.name}}</span> 
</span>
</div>
我试图找到元素{{item.name}},因为我用这个迭代列表:
element.all(by.repeater('item in myList')).then(function(rows) {
noOfItems = rows.length;
for (i = 0; i < noOfItems; i++) {
row = element.all(by.repeater('item in myList')).get(i);
row.isElementPresent(By.id('foo')).then(function (isP) {
if (isP) {
console.log("foo exists?" + isP);
row.findElement(By.id('foo')).then(function (el) {
el.getText(txt).then(function (txt) {
console.log("Item name " + txt);
});
});
}
});
}
});
从检查&#39;行&#39;元素似乎是selenium对象,所以我调用了'isElementPresent(...),这很有用。它会检测到正确数量的&#39; foo&#39;元素。但是,当row.findElement(...)运行时,测试规范会过早终止。 (没有错误,它只是结束)
我知道会有多个foo&#39;但是我希望文档中的元素,因为它们在子html元素中被查询,(行)这可能会起作用。
有任何建议/解决方法吗?
答案 0 :(得分:1)
在解决您的具体问题之前,有几件事似乎不对劲。
1)我不认为上面的第4行是你想要做的。它将返回每行的浏览器,每次重新运行by.repeater查询。你真正需要做的就是row = rows[i]
。
2)更好的是你可以简单地用element.all(by.repeater('item in myList')).each(function(row){
关于在上下文中查找foo span的问题,您可以尝试查找by.css(':scope #foo')
。这应该可以让你搜索id =&#39; foo&#39;在当前元素的范围内。
答案 1 :(得分:1)
顺便说一下,找到正确的Angular生成元素的另一种方法是使用by.js
定位器。这不是Protractor特定的定位器,而是由底层WebDriverJS提供的定位器,因此您必须查看文档的there。
基本上by.js
允许您提供一个javascript函数,该函数将在浏览器上运行以查找您要查找的元素。反过来,javascript可以询问DOM元素,以查找和检查已附加到它们的Angular $范围,从而找到具有特定范围值的元素。例如,您可以找到与实际recordId关联的元素,该实际recordId存在于范围中但从未呈现为HTML。这非常有用,因为考虑到角度是如何工作的,你很少需要将这些类型的id呈现为HTML,但是测试仍然需要能够找到代表它们的元素!
答案 2 :(得分:0)
var eleB = element(by.css('.ui-grid-render-container.ng-isolate-scope.ui-grid-render-container-body'));
eleB.element(by.repeater('(rowRenderIndex, row) in rowContainer.renderedRows track by $index').row(10)).$('.ui-grid-cell.ng-scope.ui-grid-coluiGrid-000B').getText().then(function(arr){
console.log("-------------------\n" + arr);
});