我正在寻找一种方法从给定的父元素块中返回子元素(使用页面对象),并能够通过链接调用它们。例如,给定页面上的许多小部件:
<div id="widget-1">
<div class="name">Widget 42</div>
<div class="color">Blue</div>
</div>
<div id="widget-2">
<div class="name">Widget 23</div>
<div class="color">Red</div>
</div>和一个页面对象widgetPage:
this.widget = function(num) { return $('div#widget-' + num) };我只想从第一个小部件块中获取名称和颜色。这在我的规范中是可行的:
expect(widgetPage.widget('42').$('color').getText()).toBe('Blue');但是我不希望在我的规范中有选择器代码;我希望它在它所属的页面对象中。我一直没能找到好办法来做这件事。我尝试过各种各样的东西,比如.
this.getWidgetElms = function(num) {
return this.widget(num).then(function(w) {
return {
name: w.$('div.name'),
color: w.$('div.color')
};
});
};
// fails because name and color are undefined... 最终,我希望能够做这样的事情(不起作用):
expect(widgetPage.getWidgetElms('42').color.getText()).toBe('Blue');很明显我做错了什么..。如何只返回第一个小部件块的子元素?
发布于 2015-02-19 16:54:23
如果要从widget函数中返回一个对象,该怎么办:
this.widget = function (num) {
var elm = element(by.css('div#widget-' + num));
return {
widget: elm,
name: elm.element(by.css('div.name')),
color: elm.element(by.css('div.color'))
};
};然后,在你的规范中:
var widget = widgetPage.widget('42');
expect(widget.name.getText()).toBe('Widget 42');
expect(widget.color.getText()).toBe('Blue');发布于 2015-02-19 16:55:39
我对Protractor不太了解,但是这里有两种从"Widget 42“到”blue“的jQuery方法。任何一个都可以转换为页面对象中的函数。第一个取决于名称和颜色节点的顺序,而第二个则不是。
$('div.name:contains("Widget 42")').next().text()
$('div.name:contains("Widget 42")').parent().find('.color').text();(但我更喜欢alecxe的解决方案。)
发布于 2015-06-09 21:11:12
我发现element.all上map()函数的示例对于这种情况非常有用:https://github.com/angular/protractor/issues/392#issuecomment-33237672。
在您的情况下,修改该示例将导致类似的情况(未经测试)。
element.all(by.css('div[id*="widget"]')).map(function(el) {
return {
name: el.element(by.css('div.name')).getText(),
color: el.element(by.css('div.color')).getText()
}
});因此,如果您可以使用all来获取所有的小部件,那么您就可以创建一个名称和颜色的映射。
https://stackoverflow.com/questions/28611246
复制相似问题