如何testing一个元素是否使用了量angular器的类?
我正在尝试Protactor e2etestingAngular应用程序,并没有想出如何检测一个元素是否具有特定的类。
在我的情况下,testing点击提交button,现在我想知道表单[名称=“getoffer”]类.ngDirty。 什么可能是解决scheme?
describe('Contact form', function() { beforeEach(function(){ browser.get('http://localhost:9000'); element(by.linkText('Contact me')).click(); }); it('should fail form validation, all fields pristine', function() { element(by.css('.form[name="getoffer"] input[type="submit"]')).click(); expect(element(by.name('getoffer'))).toHaveClass('ngDirty'); // <-- This line }); });
你必须注意的一个问题是使用toMatch()
,正如在接受的答案中,是部分匹配。 例如,假设你有一个元素可能有correct
和incorrect
的类,你想testing它有correct
的类。 如果你使用expect(element.getAttribute('class')).toMatch('correct')
,即使元素有incorrect
类,它也会返回true。
我的build议:
如果您只想接受完全匹配,则可以为其创build一个辅助方法:
var hasClass = function (element, cls) { return element.getAttribute('class').then(function (classes) { return classes.split(' ').indexOf(cls) !== -1; }); };
你可以像这样使用它(利用expect
自动解决量angular器中的承诺的事实):
expect(hasClass(element(by.name('getoffer')), 'ngDirty')).toBe(true);
如果你使用茉莉花量angular器,你可以使用toMatch
匹配作为正则expression式…
expect(element(by.name('getoffer')).getAttribute('class')).toMatch('ngDirty');
另外,请注意,如果您需要, toContain
将匹配列表项。
最简单的是:
expect(element.getAttribute('class')).toContain("active");
你有没有尝试过…
var el = element(by.name('getoffer')); expect(e.getAttribute('class')).toBe('ngDirty')
或以上的变化…
根据Sergey K的回答,你也可以添加一个自定义的匹配器来完成这个工作:
(CoffeeScript的)
beforeEach(()-> this.addMatchers({ toHaveClass: (expected)-> @message = ()-> "Expected #{@actual.locator_.value} to have class '#{expected}'" @actual.getAttribute('class').then((classes)-> classes.split(' ').indexOf(expected) isnt -1 ) }) )
那么你可以在这样的testing中使用它:
expect($('div#ugly')).toHaveClass('beautiful')
如果没有,你会得到以下错误:
Message: Expected div#ugly to have class beautiful Stacktrace: Error: Expected div#ugly to have class 'beautiful'
我做了这个匹配器,我不得不把它包装在一个承诺,并使用2回报
this.addMatchers({ toHaveClass: function(a) { return this.actual.getAttribute('class').then(function(cls){ var patt = new RegExp('(^|\\s)' + a + '(\\s|$)'); return patt.test(cls); }); } });
在我的testing中,我现在可以做这样的stuf:
var myDivs = element.all(by.css('div.myClass')); expect(myDivs.count()).toBe(3); // test for class expect(myDivs.get(0)).not.toHaveClass('active');
当一个元素有多个类或者一个元素根本没有class属性的时候,这也是有效的。
这里有一个Jasmine 1.3.x自定义toHaveClass
匹配器否定支持加上等待5秒(或任何你指定的)。
在这个要点find完整的自定义匹配器添加到您的onPrepare块
示例用法:
it('test the class finder custom matcher', function() { // These guys should pass OK given your user input // element starts with an ng-invalid class: expect($('#user_name')).toHaveClass('ng-invalid'); expect($('#user_name')).not.toHaveClass('ZZZ'); expect($('#user_name')).toNotHaveClass('ZZZ'); expect($('#user_name')).not.toNotHaveClass('ng-invalid'); // These guys should each fail: expect($('#user_name')).toHaveClass('ZZZ'); expect($('#user_name')).not.toHaveClass('ng-invalid'); expect($('#user_name')).toNotHaveClass('ng-invalid'); expect($('#user_name')).not.toNotHaveClass('ZZZ'); });
function checkHasClass (selector, class_name) { // custom function returns true/false depending if selector has class name // split classes for selector into a list return $(selector).getAttribute('class').then(function(classes){ var classes = classes.split(' '); if (classes.indexOf(class_name) > -1) return true; return false; }); }
至less我这样做,而不需要使用expect函数。 如果该类在元素内部,则该函数仅返回true,否则返回false。 这也使用承诺,所以你会像使用它:
checkHasClass('#your-element', 'your-class').then(function(class_found){ if (class_found) console.log("Your element has that class"); });
编辑:我刚刚意识到这是基本相同的最佳答案
实现这一点的一种方法是使用xpath并使用contains()
例:
var expectElementToHaveClass = function (className) { var path = by.xpath("//div[contains(@class,'"+ className +"')]"); expect(element.all(path).count()).to.eventually.be.eq(1); };