Это распространенная проблема. Я бы обратил внимание на:
Как вы называете элементы
Используйте идентификатор или класс CSS для идентификации элементов. Избегайте использования CSS ID, когда объект уникален. Рассмотрим структуру, которую вы используете, например, в 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 и т. Д.
Использование специфичных для теста атрибутов данных , которые используются только для проверки и тестирования.
Избегайте ненужной квалификации для элементов. Вы можете использовать следующее:
body.main div#vehicles > form#vehicle input#primary_vehicle_name
Однако для этого необходимо, чтобы поле ввода оставалось в форме с точным идентификатором транспортного средства и на странице с телом, имеющим класс main, и div с идентификатором транспортных средств, который имеет непосредственный дочерний элемент формы с идентификатором средство передвижения. Любые изменения в любой из этой структуры и тест-паузы. В этом случае вы можете обнаружить, что
input#primary_vehicle_name
достаточно, чтобы однозначно идентифицировать элемент.
Избегайте тестов, которые ссылаются на видимый текст. Текст на странице, который отображается пользователю, обычно изменяется со временем, так как сайт поддерживается и обновляется, поэтому используйте идентификаторы, такие как css id и css class или атрибуты данных. Такие элементы, как form
, input
и select
используемые в формах также хорошие части идентифицирующих элементов, как правило , в сочетании с идентификатором или классом, например , 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) и обсуждают тестирование пользовательского интерфейса как часть подготовки. Вы должны убедиться, что любой подход и стратегия, которую вы используете для именования, согласованы с разработчиками приложений. Если вы не попадаете на ту же страницу, вам понравится конфликт по именованию объектов. Некоторые примеры методов объекта страницы, которые я недавно создал для проекта ruby:
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]']";