我是网站开发的新手,但我的任务是为使用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] 删除。
我来说两句