【发布时间】:2017-07-13 14:07:27
【问题描述】:
我正在尝试使用 .filter() 函数过滤掉 ElementArrayFinder 中的元素。我已经成功地使用它通过检查是否存在特定的子元素来过滤元素,但不能反过来。这是 HTML 的 sn-p:
<div class="krn_event krn_event_line0" unselectable="on" style="position: absolute; left: 477px; top: 161px; width: 84px; height: 32px; white-space: nowrap; overflow: hidden;">
<div unselectable="on" class="krn_event_inner">
<div class="entity advanced-renderer" id="shift_20111">
<span class="entity-title">9:00 AM - 7:00 PM</span>
<div class="entity-segments entity-type-shift">
<div class="entity-segment type-break" style="left:40%; width:5%"> </div>
</div>
</div>
</div>
<div class="krn_event krn_event_line0" unselectable="on" style="position: absolute; left: 58px; top: 236px; width: 71px; height: 32px; white-space: nowrap; overflow: hidden; cursor: pointer;">
<div unselectable="on" class="krn_event_inner">
<div class="entity advanced-renderer" id="shift_20121">
<span class="entity-title">7:00 AM - 3:30 PM</span>
<div class="entity-segments entity-type-shift">
<div class="entity-segment type-break" style="left:47%; width:5%"></div>
<div class="entity-segment type-transfer" style="left:52%; width:48%"></div>
<div class="entity-icons">
<i class="entity-icon icon-k-transfer"></i>
</div>
</div>
</div>
</div>
我只寻找像第一个块这样不包含“.entity-segment type-transder”div 元素的元素。不幸的是,循环不起作用,因为我需要解决 isPresent() 或 .$$().count() 的承诺。这是我到目前为止使用 .filter() 函数的结果:
regShifts = shifts.filter(function(elem){
return elem.$('[class="entity-segment type-transfer"]').isPresent().then(function (ans){
return ans === false;
});
});
其中 shifts 是页面上所有班次的列表。有人可以指出我正确的方向或告诉我这里出了什么问题吗?当此代码运行时,测试等待并且整个测试失败并出现 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - Javascript heap out of memory。它还提供了“最后几个 GC”和 JS 堆栈跟踪信息。谢谢
编辑:忘了问,我可以在这里合并一个 .not() 函数吗?我知道 EC.not() 但这仅适用于我相信的浏览器功能。我对 CSS 选择器进行了一些研究并尝试使用 :not() 但我无法让它工作。
我有两种方法,过滤掉我不想要的元素并最终得到一个包含所有可用元素的数组。或者,检查我选择的元素(班次)是否有子元素,如果有,则选择不同的班次。后者似乎更难,因为它很难用 Promise 实现循环。非常感谢你们的任何帮助。
【问题讨论】:
-
您是否尝试过使用 element.all(by.css(.....)) 或 $$('....) 代替。然后使用count()检查是否等于0...
-
我尝试在过滤函数中使用 .$$() 和 .count() 而不是 .isPresent() 但它返回相同的错误
-
你可以直接用xpath获取这些类型的shift - "//div[@class='entity-segment type-transfer']//ancestor::div[@class='krn_event krn_event_line0' ]"
-
我正在寻找不包含后代“.entity-segment type-transfer”的其他班次。 xpath 中是否有 not() 函数或其他东西可以用来选择所有不包含“.entity-segment type-transfer”的函数?
-
With NOT -- //div[@class='krn_event krn_event_line0' and not(descendant::div[@class='entity-segment type-transfer'])]
标签: javascript css angularjs selenium protractor