搜索元素的后代

Bra*_*118 46 element parent-child chaining protractor

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

var p1 = $('#parent_1');
var p1_red = $('.red', p1);  //or p1.find('.red');
var p1_blue = $('.blue', p1); //or p1.find('.blue');
Run Code Online (Sandbox Code Playgroud)

但是使用Protractor,首先获得父元素是否有意义?因为这样做var p1 = element('#parent_1');实际上不会检索/搜索对象,直到getText()调用它为止.

这样做..

场景1

expect(p1.element('.red')).toBe('red');
expect(p1.element('.blue')).toBe('blue');
Run Code Online (Sandbox Code Playgroud)

要么

情景2

expect(element('#parent_1').element('.red')).toBe('red');
expect(element('#parent_1').element('.blue')).toBe('blue');
Run Code Online (Sandbox Code Playgroud)

要么

场景3

expect(element('#parent_1 > .red')).toBe('red');
expect(element('#parent_1 > .blue')).toBe('blue');
Run Code Online (Sandbox Code Playgroud)

一种方法相对于另一种方法有什么好处吗?

这就是我正在做的事情,但我不知道将父母与cssSelector分开是否有任何好处:

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

var parent = $('#parent_1');
var child_red = getChild('.red', parent);
var child_blue = getChild('.blue', parent);
Run Code Online (Sandbox Code Playgroud)

看看量角器的elementFinder,我可以这样做:

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

var child_red = getChild('.red', '#parent_1');
var child_blue = getChild('.blue', '#parent_1');
Run Code Online (Sandbox Code Playgroud)

Jmr*_*Jmr 58

将子项与子css选择器分开的优点仅在于您希望将父项用于其他内容.否则,在一次调用中执行此操作会稍微快一些,expect(element('#parent_1 > .red')).toBe('red');因为在这种情况下,Protractor不需要对浏览器进行两次调用.

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

var parent = element(by.css('.foo'));
var child = parent.element(by.binding('childBinding'));
expect(child.getText()).toEqual('whatever');
Run Code Online (Sandbox Code Playgroud)