为什么.text()函数在ngScenario中返回AngularJS e2e的[object Object]?

KG23

更新:下面的解决方案!

我是网站开发的新手,但我的任务是为使用AngularJS的开发中的网站开发e2e(端对端)测试。结果,我一直在寻找使用AngularJS的业力运行ngScenario测试包装器的道路

无论如何,刚入门时,我要确保简单的超链接文本匹配其href地址的一部分。无需了解此代码段的结构,但是这些是用户配置文件的缩略图,您可以完全单击缩略图对象(第一个“ a”),也可以单击显示其名称的链接(第二个“一个')。

一页上有几十个。

这是页面的一部分加载了用户“ PurplePenguin”后的样子。

<div class="thumbnail__section">
    <a href="/profile/PurplePenguin">
    <div class="thumbnail__bottom">
        <div class="thumbnail__rating ng-binding"> </div>
            <div class="thumbnail__info">
                <div class="thumbnail__name">
                    <a class="ng-binding" href="/profile/PurplePenguin">PurplePenguin</a>
                </div>
    [...]

从本质上讲,我想要一个测试,该测试将获取第二个'a'元素的文本并针对href属性进行检查:“断言href'/ profile / PurplePenguin'等于'/ profile /'+'PurplePenguin'”

这就是我只是想测试第一个缩略图的“ a”而做的(我每次写“ PurplePengiun”都是第一个用户,因此我可以对其进行硬编码)。

it('should have the performer\'s name match the link', function() {
    // "eq(n)" gets the nth instance of the element; 
    // "> a:eq(0)" grabs its first child a
    var nameElement = element('.thumbnail__name:eq(0) > a:eq(0)');

    // These work and pass
    expect(nameElement.text()).toBe('PurplePenguin');
    expect(nameElement.attr('href')).toBe('/profile/PurplePenguin');

    // This does not
    var textString = nameElement.text(); // textString == "[object Object]"
    expect(nameElement.attr('href')).toBe('/profile/' + textString);

这将返回:

expect element '.thumbnail__name:eq(0) > a:eq(0)' get attr 'href' toEqual "/profile/[object Object]"
expected "/profile/[object Object]" but was "/profile/PurplePenguin"

因此,我已经找到了如何在所需页面上找到特定元素的方法,但是尝试操纵一个简单的'a'元素的文本只会给我[object Object]。

我用JS的基本知识尝试过的一些事情:

nameElement.text().toString(), nameElement.text().value(), nameElement[0].text()

尝试不是text()的事情

nameElement.html() and nameElement.val()

当尝试将它们用作字符串时,它们也会返回[object Object]。

似乎只有在使用非常特定的API函数(例如.toBe或.toEqual)时,才能查看这些元素的值和属性,但是我想断言是使用了特定格式的字符串。

感谢您的任何帮助!



感谢Andyrooger的这种见识,我实际上在发布我的问题之前曾对查询函数进行过尝试,但很快就放弃了。您的解释使我有了一个想法,开始更深入地研究官方文档中发布的示例。最后,我从Adi Roiban的帖子中得到了一个提示,即另一个Angular e2e作家的问题,该问题涉及查询,done()消息和promises。最终导致我找到了最终的解决方案。

因此,我为自己提供了解决方案,并本着合作的精神为他人提供了一些范例供您学习。有四个示例,前两个示例只是获取文本和href,并将它们与硬编码值进行比较。第三个使用indexOf进行简单的比较。第四篇展示了如何使自己的通过/失败条件更加具体(比Jasmine为其匹配器提供的更多)。

数字1:用户名文字与硬编码值

it('should have the user\'s name be \'PurplePenguin\'', function() {

  var textPromise = element('.thumbnail__name:eq(0) > a:eq(0)').query(function (nameElement, done) {
    var text = nameElement.text(); // Can finally access this guy!

    // The first param null indicates a nominal execution, the second param is a return of sorts
    done(null, text); 
  });

  // Passes
  expect(textPromise).toBe('PurplePenguin')
});

数字2:个人资料href值与硬编码值

it('should have the user\'s link be \'/profile/PurplePenguin\'', function() {

  var textPromise = element('.thumbnail__name:eq(0) > a:eq(0)').query(function (nameElement, done) {
    var href = nameElement.attr('href');

    // The first param null indicates a nominal execution, the second param is a return of sorts
    done(null, href); 
  });

  // Passes
  expect(textPromise).toBe('/profile/PurplePenguin')
});

数字3:简单的字符串比较

it('should have the user\'s name match the link', function() {

  var textPromise = element('.thumbnail__name:eq(0) > a:eq(0)').query(function (nameElement, done) {
    var text = nameElement.text();
    var href = nameElement.attr('href');

    // The first param null indicates a clean pass, the second param is a return of sorts
    done(null, href.indexOf(text)); // indexOf returns -1 if text is _not_ a sub-string of href 

  });

  expect(textPromise).toBeGreaterThan(-1);

  // In the case of failure reports this in the console (if using Karma):
  //    expect element .thumbnail__name:eq(0) > a:eq(0) custom query toBeGreaterThan -1
  //    expected -1 but was -1

  // In the runner.html page for the test simply reports this useless/misleading log:
  //    expected -1 but was -1

});

数字4:以自己的方式进行更详细的字符串比较,并获得更好的错误消息

it('should have the user\'s name match the link', function() {

  var nameStringPromise = element('.thumbnail__name:eq(0) > a:eq(0)').query(function (nameElement, done) {
    var text = nameElement.text();
    var href = nameElement.attr('href');

    var message;
    if (href.indexOf(text) == -1)
      message = 'Did not find "' + text + '" in "' + href + '"';

    done(message, href.indexOf(text));
  });

  expect(nameStringPromise);

  // An expect() with no Jasmine matcher means that it only uses the done message to determine 
  //   a pass or fail for the test. So I wrote that if my conditions weren't met it would print
  //   an informative message in the case of failure
  // Example failure output with a broken url generator:
  //     Did not find "PurplePenguin" in "/profile/"

});
安德鲁格

除了这些没有太多信息的文档外我还在努力寻找参考来支持这一点或进行更好的解释因此,这个答案主要来自于阅读相关代码的记忆。

在中编写测试时ngScenario,您没有像在单元测试中那样编写一系列立即执行的操作。您实际上正在做的工作是排队要在测试开始时执行的命令列表。

看起来像普通jQuery函数的方法,例如text()attr()实际上ngScenario是DSL的一部分,并返回将来的对象(这意味着它们将在某个时候执行并获得所需的调用结果。)

expect()已经知道这一点,因此在与您的期望值比较之前等待结果。在您的示例中,下面的代码直接且立即读取,因此将看到将来的对象。

如果确实需要以这种方式阅读元素,则建议您查看query应该允许它功能。在另一方面,如果你只是需要检查你可以使用字符串格式化toMatch已经实施了ngScenario太多。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么<object>的类型是函数?

来自分类Dev

为什么lodash中的_.pick(object,_.identity)返回空的Object?

来自分类Dev

为什么lodash中的_.pick(object,_.identity)返回空的Object?

来自分类Dev

为什么Object.prototype.toString返回[object Object]

来自分类Dev

为什么在JavaScript中typeof null是'object'?

来自分类Dev

为什么在JavaScript中typeof(null)=='object'?

来自分类Dev

为什么({} + {})=“ [object Object] [object Object]”?

来自分类Dev

为什么type(object)返回<class'type'>而不是<class'object'>?

来自分类Dev

为什么Object在Perl中返回随机值

来自分类Dev

为什么在 JavaScript 中 console.log() 输出 [object Object]?

来自分类Dev

为什么在TypeScript中object.constructor是“函数”而不是“ newable”?

来自分类Dev

为什么我的HTML构造函数对象返回[object Object]而不是[HTMLElementElement]?

来自分类Dev

为什么我的HTML构造函数对象返回[object Object]而不是[HTMLElementElement]?

来自分类Dev

为什么在JavaScript中{} + {}变成“ [object Object] [object Object]”,但是[] + []变成空字符串?

来自分类Dev

为什么ArrayList在内部使用Object [](而不是E [])?

来自分类Dev

为什么DOM的Object.getOwnPropertyNames返回空数组?

来自分类Dev

typeof options =='object'&& options,为什么返回对象值?

来自分类Dev

为什么Function的原型是一个函数,为什么Object从那里继承?

来自分类Dev

为什么Object.create比构造函数要慢得多?

来自分类Dev

为什么Object.prototype和Object.getOwnPropertyNames(Object.prototype)返回不同的东西?

来自分类Dev

在Javascript中,为什么Object.getPrototypeOf([1,2])返回一个空列表?

来自分类Dev

为什么在JavaScript中使用Object()!= Object()?

来自分类Dev

为什么我的数组变成[object object]

来自分类Dev

为什么`Object() === new Object()` 等于`false`?

来自分类Dev

为什么Java中的Object类包含受保护的方法?

来自分类Dev

为什么object [undefined]在javascript中不起作用?

来自分类Dev

为什么 Object.assign(...) 在 IE 11 中工作?

来自分类Dev

为什么Typescript为什么将object.hasOwnProperty(“ key”)和object中的“ key”区别开来

来自分类Dev

为什么简单的选择查询在jpa中返回List <Mymodel>但联接查询返回List <Object>

Related 相关文章

  1. 1

    为什么<object>的类型是函数?

  2. 2

    为什么lodash中的_.pick(object,_.identity)返回空的Object?

  3. 3

    为什么lodash中的_.pick(object,_.identity)返回空的Object?

  4. 4

    为什么Object.prototype.toString返回[object Object]

  5. 5

    为什么在JavaScript中typeof null是'object'?

  6. 6

    为什么在JavaScript中typeof(null)=='object'?

  7. 7

    为什么({} + {})=“ [object Object] [object Object]”?

  8. 8

    为什么type(object)返回<class'type'>而不是<class'object'>?

  9. 9

    为什么Object在Perl中返回随机值

  10. 10

    为什么在 JavaScript 中 console.log() 输出 [object Object]?

  11. 11

    为什么在TypeScript中object.constructor是“函数”而不是“ newable”?

  12. 12

    为什么我的HTML构造函数对象返回[object Object]而不是[HTMLElementElement]?

  13. 13

    为什么我的HTML构造函数对象返回[object Object]而不是[HTMLElementElement]?

  14. 14

    为什么在JavaScript中{} + {}变成“ [object Object] [object Object]”,但是[] + []变成空字符串?

  15. 15

    为什么ArrayList在内部使用Object [](而不是E [])?

  16. 16

    为什么DOM的Object.getOwnPropertyNames返回空数组?

  17. 17

    typeof options =='object'&& options,为什么返回对象值?

  18. 18

    为什么Function的原型是一个函数,为什么Object从那里继承?

  19. 19

    为什么Object.create比构造函数要慢得多?

  20. 20

    为什么Object.prototype和Object.getOwnPropertyNames(Object.prototype)返回不同的东西?

  21. 21

    在Javascript中,为什么Object.getPrototypeOf([1,2])返回一个空列表?

  22. 22

    为什么在JavaScript中使用Object()!= Object()?

  23. 23

    为什么我的数组变成[object object]

  24. 24

    为什么`Object() === new Object()` 等于`false`?

  25. 25

    为什么Java中的Object类包含受保护的方法?

  26. 26

    为什么object [undefined]在javascript中不起作用?

  27. 27

    为什么 Object.assign(...) 在 IE 11 中工作?

  28. 28

    为什么Typescript为什么将object.hasOwnProperty(“ key”)和object中的“ key”区别开来

  29. 29

    为什么简单的选择查询在jpa中返回List <Mymodel>但联接查询返回List <Object>

热门标签

归档