从元素数组jquery中选择第n个元素

时间:2017-01-11 18:53:46

标签: angularjs protractor

我正在开展我的角度e2e测试项目。我有以下html生成作为我的ng-repeat的一部分而没有任何id,我想选择带有标题Topic - xyz的第二个元素,然后点击它是兄弟的孩子的按钮。我怎么能这样做。

<div class="row ng-scope" ng-repeat="post in posts">
    <div class="col-md-7">
        <h4 class="ng-binding">Topic - ABC</h4>
        <div class="text-right">
            <button class="btn btn-none btn-sm" ng-click="posts.newPost()">
                Create Post
            </button>
        </div>
    </div>
 </div> 
<div class="row ng-scope" ng-repeat="post in posts">
    <div class="col-md-7">
        <h4 class="ng-binding">Topic - XYZ</h4>
        <div class="text-right">
            <button class="btn btn-none btn-sm" ng-click="posts.newPost()">
                Create Post
            </button>
       </div>
    </div>
 </div>  
<div class="row ng-scope" ng-repeat="post in posts">
    <div class="col-md-7">
        <h4 class="ng-binding">Topic - EFG</h4>     
        <div class="text-right">
            <button class="btn btn-none btn-sm" ng-click="posts.newPost()">
                Create Post
            </button>
        </div>
     </div>
</div>

这是我到目前为止尝试过的无效

var button = $$(by.repeater('post in posts')).get(1).$(by.css('[ng-click="posts.newPost()"]'))

button.click(); // click is not showing up

1 个答案:

答案 0 :(得分:3)

$$(by.repeater('post in posts'))$(by.css('[ng-click="posts.newPost()"]')) - 这些不是使用by.repeater()by.css()定位器的正确语法。 $$element.all(by.css())的快捷方式,不应用于“转发器”定位器。如果您使用$(),则无需将您的选择器包装到by.css()

var button = element.all(by.repeater('post in posts')).get(1).$('[ng-click*=newPost]');
button.click();

如果您想按主题名称过滤转发器元素,您可以使用.filter()

var button = element.all(by.repeater('post in posts')).filter(function (post) {
    return post.$("h4").getText().then(function (postTitle) {
        return postTitle === "Topic - XYZ";
    });
}).get(1).$('[ng-click*=newPost]');
button.click();

另外,看看使用by.buttonText locator是否也能正常工作(更清洁一点):

var post = element.all(by.repeater('post in posts')).get(1);

var button = post.element(by.buttonText("Create Post"));
button.click();