[angularjs] 각도기를 사용하여 요소에 클래스가 있는지 테스트하는 방법은 무엇입니까?

나는 각도 앱을 e2e 테스트하기 위해 각도기를 시도하고 있으며 요소에 특정 클래스가 있는지 여부를 감지하는 방법을 찾지 못했습니다.

제 경우에는 테스트에서 제출 버튼을 클릭하고 이제 form [name = “getoffer”]에 .ngDirty 클래스가 있는지 알고 싶습니다. 해결책은 무엇일까요?

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()허용되는 답변에서 와 같이 using을 사용하여 찾아야 할 한 가지 문제 는 부분 일치입니다. 예를 들어, 당신이 클래스를 가질 수 요소가 있다고 가정하자 correctincorrect, 당신은이 클래스를 가지고 테스트 할 correct. 을 사용 expect(element.getAttribute('class')).toMatch('correct')하면 요소에 incorrect클래스 가 있어도 true를 반환합니다 .

나의 제안:

정확히 일치하는 항목 만 허용하려면 이에 대한 도우미 메서드를 만들 수 있습니다.

var hasClass = function (element, cls) {
    return element.getAttribute('class').then(function (classes) {
        return classes.split(' ').indexOf(cls) !== -1;
    });
};

다음과 같이 사용할 수 있습니다 ( expectProtractor에서 자동으로 약속을 해결 한다는 사실을 활용 ).

expect(hasClass(element(by.name('getoffer')), 'ngDirty')).toBe(true);


답변

Jasmine과 함께 Protractor를 사용 toMatch하는 경우 정규식으로 일치 하는 데 사용할 수 있습니다 .

expect(element(by.name('getoffer')).getAttribute('class')).toMatch('ngDirty');

또한 toContain필요한 경우 목록 항목과 일치합니다.


답변

가장 간단한 것은 :

expect(element.getAttribute('class')).toContain("active");


답변

Sergey K의 답변을 기반으로 사용자 정의 매처를 추가하여이를 수행 할 수도 있습니다.

(커피 스크립트)

  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
        )
    })
  )

그런 다음 다음과 같은 테스트에서 사용할 수 있습니다.

expect($('div#ugly')).toHaveClass('beautiful')

그렇지 않은 경우 다음 오류가 발생합니다.

 Message:
   Expected div#ugly to have class beautiful
 Stacktrace:
   Error: Expected div#ugly to have class 'beautiful'


답변

시도해 보셨습니까 …

var el = element(by.name('getoffer'));
expect(e.getAttribute('class')).toBe('ngDirty')

또는 위의 변형 …


답변

이 매처를 만들었는데 약속에 싸서 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);
        });
    }
});

내 테스트에서 이제 다음과 같이 stuf를 할 수 있습니다.

   var myDivs = element.all(by.css('div.myClass'));
   expect(myDivs.count()).toBe(3);

   // test for class
   expect(myDivs.get(0)).not.toHaveClass('active');

이것은 요소에 여러 클래스가 있거나 요소에 클래스 속성이 전혀 없을 때도 작동합니다.


답변

여기toHaveClass부정을 .not지원 하는 Jasmine 1.3.x 사용자 지정 매 처가 있으며 최대 5 초 (또는 사용자가 지정한대로)를 기다립니다.

이 요점에서 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');
});