首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在量角器中从父元素中返回子元素

如何在量角器中从父元素中返回子元素
EN

Stack Overflow用户
提问于 2015-02-19 16:13:23
回答 3查看 6.3K关注 0票数 2

我正在寻找一种方法从给定的父元素块中返回子元素(使用页面对象),并能够通过链接调用它们。例如,给定页面上的许多小部件:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
this.widget = function(num) { return $('div#widget-' + num) };

我只想从第一个小部件块中获取名称和颜色。这在我的规范中是可行的:

代码语言:javascript
复制
expect(widgetPage.widget('42').$('color').getText()).toBe('Blue');

但是我不希望在我的规范中有选择器代码;我希望它在它所属的页面对象中。我一直没能找到好办法来做这件事。我尝试过各种各样的东西,比如.

代码语言:javascript
复制
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... 

最终,我希望能够做这样的事情(不起作用):

代码语言:javascript
复制
expect(widgetPage.getWidgetElms('42').color.getText()).toBe('Blue');

很明显我做错了什么..。如何只返回第一个小部件块的子元素?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-19 16:54:23

如果要从widget函数中返回一个对象,该怎么办:

代码语言:javascript
复制
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'))
    };  
};

然后,在你的规范中:

代码语言:javascript
复制
var widget = widgetPage.widget('42');
expect(widget.name.getText()).toBe('Widget 42');
expect(widget.color.getText()).toBe('Blue');
票数 4
EN

Stack Overflow用户

发布于 2015-02-19 16:55:39

我对Protractor不太了解,但是这里有两种从"Widget 42“到”blue“的jQuery方法。任何一个都可以转换为页面对象中的函数。第一个取决于名称和颜色节点的顺序,而第二个则不是。

代码语言:javascript
复制
$('div.name:contains("Widget 42")').next().text()

$('div.name:contains("Widget 42")').parent().find('.color').text();

(但我更喜欢alecxe的解决方案。)

票数 0
EN

Stack Overflow用户

发布于 2015-06-09 21:11:12

我发现element.all上map()函数的示例对于这种情况非常有用:https://github.com/angular/protractor/issues/392#issuecomment-33237672

在您的情况下,修改该示例将导致类似的情况(未经测试)。

代码语言:javascript
复制
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来获取所有的小部件,那么您就可以创建一个名称和颜色的映射。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28611246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档