Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Локаторы в Page Object Python. Структура и реализация

locators
page-object
python
webdriver
Теги: #<Tag:0x00007f7b64c60868> #<Tag:0x00007f7b64c60688> #<Tag:0x00007f7b64c604f8> #<Tag:0x00007f7b64c60390>

(Sayrong) #1

Всем привет!
Подскажите по структуре и реализации локаторов в page object на python.

В самом популярном tutorial приведен следующий пример:

class MainPageLocators(object):
    """A class for main page locators. All main page locators should come here"""
    GO_BUTTON = (By.ID, 'submit')

Но по сути GO_BUTTON будет являться обычным тюплом.

И каком смысл выносить это в отдельный класс ?

Я считал, что локаторы представляют из себя объекты класса WebElement.
И реализовал их через гетторы без выделения в отдельный класс.

Пример

class LoginPage(Page):

    #Locators by id
    _loginField = 'loginText'

    @property
    def loginField(self):
        return self.wd.find_element_by_id(self._loginField)

В какую сторону копать?)
Все работает, но хочется сделать правильную поддерживаемую структуру проекта.


(Дмитрий Золкин) #2

У меня так же)) Мне отдельный класс потом помогает, определить где локатор. Например класс для каждой формы отдельный, то же не знаю насколько правильно это…
Webelement вроде же получается после find_element_by_id(self._loginField), с которыми потом действия делаются (click , get_attribute и тд)


(Sayrong) #3

На самом деле понял, что указывал неправильно идентификаторы локаторов.
Лучше указывать через By

#Locators
_loginField = (By.ID, 'loginText')
_passwordField = (By.ID, 'passwordText')
_loginButton = (By.ID, 'loginButton')
_loginPage = (By.XPATH, '//*[@id="loginContent"]')

@property
def loginField(self):
    return self.wd.find_element(*self._loginField)

Тем самым можно не указывать конкретный метод find_element (find_element_by_xpath или find_element_by_id).
А указывать общий и передавать tuple.