【问题标题】:Protractor filter elements that dont have a specific child没有特定子级的量角器过滤器元素
【发布时间】: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


【解决方案1】:

当你说 first block 时,我不是 100% 清楚你想要得到什么尝试,购买你可以将 :not() css 与 Protractor 一起使用。比如……

$$('.entity-segment:not(.type-transfer');

这假设您期望多个匹配项 ($$),但如果不是,请使用 $ css 选择器。

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    相关资源
    最近更新 更多