Це поширена проблема. Я зверну увагу на:
Як ви називаєте елементи
Використовуйте css id або class для ідентифікації елементів. Користуйтеся використанням ідентифікатора CSS, коли об'єкт унікальний. Розглянемо рамку, яку ви використовуєте, наприклад, з Ruby on Rails name
атрибут призначається автоматично і може (не інтуїтивно) бути кращим, ніж використання ідентифікатора css або класу
Як ви визначаєте елементи.
Уникайте позиційних ідентифікаторів, як table/tr/td/td
на користь таких форм, як td[id="main_vehicle"
або td[class='alternates']
. Подумайте про використання атрибутів даних, коли це доречно. Ще краще спробувати уникати тегів макета, таких як <td>
цілком, щоб для вищевикладеного ви могли або додати проміжок, і використовувати це, наприклад, <span id="main_vehicle">
або селекторний символ, наприклад, *[id="main_vehicle"]
де *
зараз може бути div, span, td тощо.
Використання специфічних атрибутів даних тесту , які використовуються лише для qa та тестування.
Уникайте зайвої кваліфікації елементів. Ви можете знайти себе за допомогою наступного:
body.main div#vehicles > form#vehicle input#primary_vehicle_name
Однак це вимагає, щоб поле введення залишалося у формі з точним ідентифікатором транспортного засобу та на сторінці з кузовом, який має клас основного та діл з ідентифікатором транспортних засобів, що має безпосереднє дочірнє оформлення форми з ідентифікатором транспортний засіб. Будь-яка зміна будь-якої з цієї структури і тест порушується. У цьому випадку ви можете це знайти
input#primary_vehicle_name
достатньо, щоб однозначно ідентифікувати елемент.
Уникайте тестів, які стосуються видимого тексту. Текст на сторінці, який відображається користувачеві, зазвичай змінюється з часом, оскільки сайт підтримується та оновлюється, тому використовуйте такі ідентифікатори, як css id та клас css або атрибути даних. Такі елементи, як form
, input
і select
використовуються у формах, також є гарними частинами ідентифікаційних елементів, як правило, у поєднанні з id або класом, наприклад, li.vehicle
або input#first-vehicle
Ви також можете додати власні ідентифікатори, наприклад <div data-vehicle='dodge'>
. Таким чином ви можете уникнути використання ідентифікаторів елементів або класів, які, ймовірно, будуть змінені розробниками та дизайнерами. З часом я дійсно виявив, що краще просто співпрацювати з розробниками та дизайнерами та домовлятися щодо імен та обсягів. Це важко.
Як підтримуються фіксовані дані.
Подібно до визначення фактичних елементів, намагайтеся уникати вбудованих твердо кодованих селекторів, що ідентифікують значення на користь об’єктів сторінки - невеликих фрагментів тексту, які зберігаються у змінних чи методах, і таким чином їх можна повторно використовувати, а також підтримувати централізовано. Приклади змінних javascript, що слідують за цим шаблоном для твердо кодованих значень:
storedVars["eqv_auto_year"] = "2015";
storedVars["eqv_auto_make_1"] = "ALFA ROMEO";
storedVars["eqv_auto_make_2"] = "HONDA";`
Детальніше про об'єкти на сторінці у вікні селен та документи з селеном
Спілкування з розробниками.
Незалежно від технічного підходу з точки зору "розробники вносять зміни та порушують автоматизацію якості", що є проблемою робочого процесу. Вам потрібно переконатися, що: всі - одна і та ж команда; розробник запускає ті ж інтегровані тести; стандарти узгоджуються та дотримуються обома групами; визначення виконаного включає запуск та можливо оновлення тестів інтерфейсу користувача; розробники та пара тестерів на тестових планах та обидва відвідують догляд за квитками (якщо вони роблять Agile) та розмовляють про тестування інтерфейсу користувача як частину догляду. Ви повинні переконатися, що будь-який підхід і стратегія, яку ви використовуєте для іменування, узгоджуються з розробниками додатків. Якщо ви не потрапляєте на одну і ту ж сторінку, вам сподобається зіткнення щодо іменування об'єктів. Деякі приклади методів об’єктів сторінки, які я нещодавно створив для рубінового проекту:
def css_email_opt_in_true
'auto_policy[email_opt_in][value=1]'
end
def css_phone_opt_in
'*[name="auto_policy[phone_opt_in]"]'
end
def css_phone_opt_in_true
'input[name=phone_opt_in][value=true]'
end
def css_credit_rating
'auto_policy[credit_rating]'
end
Ось такі самі об’єкти сторінки, що і змінні JavaScript:
storedVars["css_email_opt_in"] = "css=*[name='auto_policy[email_opt_in]']";
storedVars["css_phone_opt_in"]="css=*[name='auto_policy[phone_opt_in]']";
storedVars["css_phone_opt_in_true"]="css=input[name='phone_opt_in'][value=true]";
storedVars["css_credit_rating"]="css=select[name='auto_policy[credit_rating]']";