【问题标题】:Using Protractor to select elements with by.repeater()使用 Protractor 通过 by.repeater() 选择元素
【发布时间】:2016-10-26 01:47:33
【问题描述】:

使用下面的 Protractor elementby.repeater() API 方法:

var targetRowText = 'Sales';
var targetGridName = 'myGrid';
var sel = 'grid-directive[grid-name="' + targetGridName + '"] .col-freeze .grid-wrapper';
var gridRows = element(by.css(sel).all(by.repeater('row in vm.sourceData.data'));
var result = gridRows.all(by.cssContainingText('span', targetRowText)).first();

我可以从我标记为myGrid的网格中选择以下行元素:

<div id="rowId_21" ng-class-odd="'row-2'" ng-class-even="'row-3'" ng-class="vm.hideRow(row)" class="row-3 height-auto">
 <div ng-repeat="column in  vm.sourceData.columns" >
     <div ng-if="!column.subCols" class="ng-scope">	
 	<div ng-if="row[column.field].length !== 0" class="ng-scope highlight21">	
 	    <span ng-bind-html="row[column.field] | changeNegToPrenFormat" vm.highlightedrow="" class="ng-binding"> 
                Sales
            </span>
 	</div>
     </div>    
 </div>
</div>

请注意,我使用by.cssContainingText() 来查找“销售”span 元素。

我的问题:

我在 var result 中找到了这一行,如何检索最外层 div 的 id 属性?

换句话说,我需要选择&lt;div id="rowId_21",以便我可以在后续的量角器选择器中重用id="rowId_21"

例如,在 jQuery 中,我可以使用蛮力来获取外部 div id,如下所示:

var el = $('grid-directive[grid-name="Sales"] .col-freeze .grid-wrapper #rowId_21 span')
el.parentElement.parentElement.parentElement.parentElement;

这是我的意思的高级概述。网格实际上将最左边的列与实际的数据行分开,因此有两个不同的 div 可以完成此操作:

<div grid-directive grid-name="myGrid">
 <div class="col-freeze" >
    <!-- CONTAINS LEFT-MOST "CATEGORIES" COLUMN -->
 </div>
 <div class="min-width-grid-wrapper"> 
    <!-- CONTAINS THE DATA ROWS-->
 </div>

但是,我在 Protractor 中很难做到这一点。

不胜感激...

鲍勃

【问题讨论】:

    标签: protractor angularjs-e2e


    【解决方案1】:

    一个直接的选择是使用ancestor axis 到达所需的父元素:

    element(by.xpath("./ancestor::div[starts-with(@id, 'rowId')]")).getAttribute("id").then(function (parentId) {
        // use parentId here
    });
    

    不过,我认为这种从树上下来然后再上树的情况应该被视为一个迹象,表明您没有以简单和正确的方式解决问题。

    【讨论】:

    • 确实如此。我有一个网格,它有一个父级div 和两个divs。第一个 div 是类别的最左侧“冻结”列。第二个 div 代表实际的数据行。因此,当我在类别列中搜索"Sales" 时,我还没有实际数据。所以我需要再次向上和向下遍历。有意义吗?
    • @bob.mazzo 是的,我知道网格的结构并不容易使用。您是否考虑过使用filter() 按列名(在您的情况下为“Sales”)过滤gridRows?我认为这可能会导致更清洁的解决方案..
    • 你知道,前几天我遇到了by.xpath(),并且还读到它在 Protractor 中不推荐使用。但是,我会说,在这种极端情况下——你成功了! +1
    • @bob.mazzo 是的,如果您需要访问父级,XPath 就可以了。我个人认为这个禁止 xpath 定位器的风格指南规则被夸大了,推荐的原因太强了,显然,有完全有效的用例。谢谢!
    • 我得按你的方式扔一箱啤酒,伙计。你真的多次来找我……不是开玩笑。 :-)
    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    相关资源
    最近更新 更多