Selenium으로 ExtJS를 테스트하는 데있어 가장 큰 장애물은 ExtJS가 표준 HTML 요소를 렌더링하지 않으며 Selenium IDE가 단순히 장식 역할을하는 요소를 대상으로하는 명령을 순진하게 (그리고 정당하게) 생성한다는 것입니다. 보고 느끼다. ExtJS 앱에 대한 자동화 된 Selenium 테스트를 작성하는 동안 수집 한 몇 가지 팁과 요령이 있습니다.
일반적인 팁
요소 찾기
Firefox에서 Selenium IDE로 사용자 작업을 기록하여 Selenium 테스트 케이스를 생성 할 때 Selenium은 기록 된 작업을 HTML 요소의 ID를 기반으로합니다. 그러나 대부분의 클릭 가능한 요소에 대해 ExtJS는 코드가 변경되지 않은 경우에도 동일한 페이지에 대한 후속 방문에서 변경 될 가능성이있는 "ext-gen-345"와 같은 생성 된 ID를 사용합니다. 테스트를 위해 사용자 작업을 기록한 후에는 생성 된 ID에 의존하는 모든 작업을 수행하고이를 대체하기위한 수동 작업이 필요합니다. 다음과 같은 두 가지 유형의 교체가 가능합니다.
ID 로케이터를 CSS 또는 XPath 로케이터로 바꾸기
CSS 로케이터는 "css ="로 시작하고 XPath 로케이터는 "//"로 시작합니다 ( "xpath ="접두사는 선택 사항). CSS 로케이터는 덜 장황하고 읽기 쉬우 며 XPath 로케이터보다 선호되어야합니다. 그러나 CSS 로케이터가 잘라낼 수 없기 때문에 XPath 로케이터를 사용해야하는 경우가있을 수 있습니다.
JavaScript 실행
일부 요소는 ExtJS에서 수행하는 복잡한 렌더링으로 인해 단순한 마우스 / 키보드 상호 작용 이상의 것을 필요로합니다. 예를 들어 Ext.form.CombBox는 실제로 <select>
요소가 아니라 문서 트리의 맨 아래에있는 분리 된 드롭 다운 목록이있는 텍스트 입력입니다. ComboBox 선택을 올바르게 시뮬레이션하려면 먼저 드롭 다운 화살표를 클릭 한 다음 나타나는 목록을 클릭하는 것이 가능합니다. 그러나 CSS 또는 XPath 로케이터를 통해 이러한 요소를 찾는 것은 번거로울 수 있습니다. 대안은 ComoBox 구성 요소 자체를 찾고 여기에있는 메서드를 호출하여 선택을 시뮬레이션하는 것입니다.
var combo = Ext.getCmp('genderComboBox'); // returns the ComboBox components
combo.setValue('female'); // set the value
combo.fireEvent('select'); // because setValue() doesn't trigger the event
Selenium에서는 runScript
명령을 사용하여보다 간결한 형식으로 위의 작업을 수행 할 수 있습니다.
with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }
AJAX 및 느린 렌더링 대처
Selenium에는 사용자 작업으로 인해 페이지 전환 또는 다시로드가 발생할 때 페이지로드를 기다리는 모든 명령에 대해 "* AndWait"특징이 있습니다. 그러나 AJAX 가져 오기에는 실제 페이지로드가 포함되지 않으므로 이러한 명령을 동기화에 사용할 수 없습니다. 해결책은 AJAX 진행률 표시기의 유무 또는 그리드의 행 모양, 추가 구성 요소, 링크 등과 같은 시각적 단서를 사용하는 것입니다. 예를 들면 다음과 같습니다.
Command: waitForElementNotPresent
Target: css=div:contains('Loading...')
사용자 작업으로 뷰가 변경된 후 ExtJS가 구성 요소를 렌더링하는 속도에 따라 특정 시간 후에 만 요소가 표시되는 경우가 있습니다. pause
명령에 임의의 지연을 사용하는 대신 이상적인 방법은 관심 요소가 파악할 때까지 기다리는 것입니다. 예를 들어, 항목이 나타날 때까지 기다린 후 클릭하려면 :
Command: waitForElementPresent
Target: css=span:contains('Do the funky thing')
Command: click
Target: css=span:contains('Do the funky thing')
임의의 일시 중지에 의존하는 것은 다른 브라우저 또는 다른 컴퓨터에서 테스트를 실행하여 발생하는 타이밍 차이로 인해 테스트 케이스가 불안정 해지기 때문에 좋은 생각이 아닙니다.
클릭 할 수없는 항목
일부 요소는 click
명령 으로 트리거 할 수 없습니다 . 이벤트 리스너가 실제로 컨테이너에 있고 자식 요소에서 마우스 이벤트를 감시하고 결국 부모에게 버블 링되기 때문입니다. 탭 컨트롤이 한 가지 예입니다. 탭을 클릭하려면 mouseDown
탭 레이블에서 이벤트 를 시뮬레이션해야합니다 .
Command: mouseDownAt
Target: css=.x-tab-strip-text:contains('Options')
Value: 0,0
필드 검증
정규식 또는 유효성 검사를위한 vtypes가 연결된 양식 필드 (Ext.form. * 구성 요소) validationDelay
는 사용자가 텍스트를 입력 한 후 또는 필드가 손실되는 즉시 특정 지연 ( 기본적으로 250ms로 설정된 속성 참조)으로 유효성 검사를 트리거합니다. 초점 또는 흐림 ( validateOnDelay
속성 참조 ). type Selenium 명령을 실행하여 필드에 텍스트를 입력 한 후 필드 유효성 검사를 트리거하려면 다음 중 하나를 수행해야합니다.
지연된 유효성 검사 트리거
ExtJS는 필드가 keyup 이벤트를 수신 할 때 유효성 검사 지연 타이머를 시작합니다. 이 타이머를 트리거하려면 더미 키업 이벤트 (ExtJS가 무시하므로 사용하는 키는 중요하지 않음)를 발행 한 다음 validationDelay보다 긴 짧은 일시 중지를 실행하면됩니다.
Command: keyUp
Target: someTextArea
Value: x
Command: pause
Target: 500
즉각적인 유효성 검사 트리거
필드에 흐림 이벤트를 삽입하여 즉시 유효성 검사를 트리거 할 수 있습니다.
Command: runScript
Target: someComponent.nameTextField.fireEvent("blur")
검증 결과 확인
유효성 검사 후 오류 필드의 유무를 확인할 수 있습니다.
Command: verifyElementNotPresent
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]
Command: verifyElementPresent
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]
"display : none"검사는 오류 필드가 표시된 다음 숨겨져 야하기 때문에 필요합니다. ExtJS는 DOM 트리에서 오류 필드를 완전히 제거하는 대신 단순히 숨길 것입니다.
요소 별 팁
Ext.form.Button 클릭
Ext.form.ComboBox에서 값 선택
Command: runScript
Target: with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }
먼저 값을 설정 한 다음 옵저버가있는 경우 명시 적으로 select 이벤트를 발생시킵니다.