у нас свой фреймворк, мы делаем end-to-end тестирование embedded системы через GUI.
я не выношу локаторы, они прописаны в классе в функциях.
Некоторые у нас выносят в локаторы в отдельные файлы. Можно и так, однако я не вижу преимущества.
Так я точно знаю какие локаторы относятся к какой странице. Начала вылетать функция, поправил локатор, не стало страницы, выкинул, поправил последовательность в тесте. Старые локаторы "автоматически" удаляются вместе со старыми page-объектами.
В нашем случае нам не приходится ссылатъся на один и тот же элемент в рамках разных страниц, потому что у нас дерево виджетов построено от страницы, и даже если виджеты одинаково называются это совершенно разные обьекты. В веб-тестировании, однако, это не так, поэтому аргумент резонный.
tf тут это ссылка на тест-фреймворк, который дает нам базовые функции для взаимодействия с GUI.
class LoginView:
def __init__(self):
self.viewname='ABC'
def enter(self):
tf.executeApiCall()
def wait_for_view(self):
tf.wait_for_view(self.viewname)
def press_cancel_button(self):
tf.press_widget('xyz.ABC')
def enter_username(self, u):
tf.enter_string('xyz.ABC.inputfield', u)
def check_error_popup_visible(self,expect):
if expect==True:
tf.wait_for_view(view='xyz.ABC.LoginErrorPopup')
else:
tf.wait_for_view(notinview='xyz.ABC.LoginErrorPopup')
def press_login_button(self):
tf.press_widget('xyz.ABC.Login')
на стороне теста выглядит как-то так
username='Kolya'
main_view = MainView()
login_view = LoginView()
login_view.enter()
login_view.wait_for_view()
login_view.enter_username(u=username)
login_view.press_login_button()
login_view.check_error_popup_visible(expect=True)
login_view.confirm_error_popup()
login_view.check_error_popup_visible(expect=False)
login_view.check_inputfield_text_equals(expect=username)
login_view.leave()
main_view.wait_for_view()