Найбільша перешкода при тестуванні ExtJS з Selenium полягає в тому, що ExtJS не відображає стандартні елементи HTML, і Selenium IDE буде наївно (і справедливо) генерувати команди, націлені на елементи, які просто виконують роль декору - зайві елементи, які допомагають ExtJS у цілому робочому столі - дивитися і відчувати. Ось декілька порад та підказок, які я зібрав під час написання автоматизованого тесту на селен для програми ExtJS.
Загальні поради
Розташування елементів
При генерації тестових випадків Selenium шляхом запису дій користувача за допомогою IDE Selenium у Firefox, Selenium буде базувати записані дії на ідентифікаторах елементів HTML. Однак для більшості клікабельних елементів ExtJS використовує згенеровані ідентифікатори, такі як "ext-gen-345", які, ймовірно, зміняться під час наступного відвідування тієї ж сторінки, навіть якщо коду не було внесено. Після запису дій користувача для тесту потрібно виконати ручну роботу, щоб пройти всі такі дії, які залежать від сформованих ідентифікаторів, та замінити їх. Існує два типи замін, які можна зробити:
Заміна ідентифікатора ідентифікатора на CSS або XPath Locator
Локатори CSS починаються з "css =", а локатори XPath починаються з "//" (префікс "xpath =" необов'язковий). Локатори CSS менш багатослівні і їх легше читати, тому їх слід віддавати перевагу локаторам XPath. Однак можуть траплятися випадки, коли потрібно використовувати локатори XPath, оскільки локатор CSS просто не може його вирізати.
Запуск 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 та повільним рендерингом
Селен має аромати "* 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
Перевірка поля
Поля форми (компоненти Ext.form. *), Які мають асоційовані регулярні вирази або типи типу для перевірки, запускатимуть перевірку з певною затримкою (див. validationDelay
Властивість, яка за замовчуванням встановлена на 250 мс), після того, як користувач введе текст або негайно, коли поле втратить фокус - або розмивається (див. validateOnDelay
властивість). Для того, щоб запустити перевірку поля після введення команди типу Selenium для введення тексту всередину поля, вам потрібно зробити одне з наступного:
Запуск відкладеної перевірки
ExtJS вимикає таймер затримки перевірки, коли поле отримує події клавіатури. Щоб запустити цей таймер, просто видайте фіктивну подію підключення (не має значення, який ключ ви використовуєте, оскільки 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.
Поради щодо елементів
Натискання кнопки зовнішньої форми
Варіант 1
Команда: натисніть Ціль: css = button: містить ('Зберегти')
Вибирає кнопку за її підписом
Варіант 2
Команда: натисніть кнопку Target: css = # save-options button
Вибирає кнопку за її ідентифікатором
Вибір значення з Ext.form.ComboBox
Command: runScript
Target: with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }
Спочатку встановлює значення, а потім явно запускає вибрану подію, якщо є спостерігачі.