如何找到特定的html元素,AngularJS,量角器

时间:2014-04-23 17:02:04

标签: javascript angularjs selenium protractor

我是AngularJS /量角器的新手,所以对此有任何指导都非常感谢。 由于Angular JS通过ng-directive实例化html元素,因此没有“id”等允许我定位特定元素。 (显然我想这样做来验证内容,点击它们等) 我的角度js片段看起来像:

<div ng-repeat="item in myList">
    <span ng-if="item.category == 'lights'">
        <img src="../../../{{item.icon}}"/>
        &nbsp<span id="foo">{{item.name}}</span>&nbsp
    </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元素中被查询,(行)这可能会起作用。

有任何建议/解决方法吗?

3 个答案:

答案 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);
});