【问题标题】:Search on descendants of an element搜索元素的后代
【发布时间】:2023-03-28 16:53:01
【问题描述】:

使用量角器选择子元素的最佳方法是什么?假设我们有下面的布局......

<div id='parent_1'>
    <div class='red'>Red</div>
    <div class='blue'>Blue</div>
</div>
<div id='parent_2'>
    <div class='red'>Red</div>
    <div class='blue'>Blue</div>
</div>

使用 jQuery,我们会做这样的事情。

var p1 = $('#parent_1');
var p1_red = $('.red', p1);  //or p1.find('.red');
var p1_blue = $('.blue', p1); //or p1.find('.blue');

但是对于 Protractor,首先获取父元素有意义吗? 因为这样做var p1 = element('#parent_1'); 直到getText() 或调用某些东西时才真正检索/搜索对象。

这样做..

场景 1

expect(p1.element('.red')).toBe('red');
expect(p1.element('.blue')).toBe('blue');

场景 2

expect(element('#parent_1').element('.red')).toBe('red');
expect(element('#parent_1').element('.blue')).toBe('blue');

场景 3

expect(element('#parent_1 > .red')).toBe('red');
expect(element('#parent_1 > .blue')).toBe('blue');

一种方法比另一种方法有什么好处吗?

这就是我正在做的,但我不知道将父级与 cssSelector 分开是否有任何优势:

function getChild(cssSelector, parentElement){
    return parentElement.$(cssSelector);
}

var parent = $('#parent_1');
var child_red = getChild('.red', parent);
var child_blue = getChild('.blue', parent);

看着 Protractor 的 elementFinder 我可以这样做:

function getChild(cssSelector, parentCss){
    return $(parentCss).$(cssSelector);
}

var child_red = getChild('.red', '#parent_1');
var child_blue = getChild('.blue', '#parent_1');

【问题讨论】:

    标签: element parent-child protractor chaining


    【解决方案1】:

    仅当您想将父级用于其他用途时,将子级与子级 css 选择器分开的优势。否则,一次调用会稍微快一些,比如expect(element('#parent_1 &gt; .red')).toBe('red');,因为在这种情况下,Protractor 不需要对浏览器进行两次调用。

    使用第一种方法的另一个原因是,如果您使用的定位器策略无法用 CSS 表示。例如:

    var parent = element(by.css('.foo'));
    var child = parent.element(by.binding('childBinding'));
    expect(child.getText()).toEqual('whatever');
    

    【讨论】:

    • 所以你是说,场景 1 比场景 2 更好。量角器在需要元素之前不会获取元素。那么这是否意味着第二次调用它被缓存?我虽然它会解决 p1 的承诺 2x。
    • 我是说场景 3 比场景 1 或场景 2 稍快一些。场景 1 和场景 2 在发送到浏览器的命令方面是等效的。对于场景 3,在获取元素 Protractor 时需要向浏览器发送 1 个命令而不是 2 个。
    • 抛开所有与性能相关的事情,这个答案包含了一个比我见过的任何其他更好的例子来说明如何做到这一点。
    • 此答案不适用于 angular2。不支持by.binding,请参阅stackoverflow.com/a/36267362/786389
    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多