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

Как можно улучшить page object, создать класс внутри класса?

page-object
python
Теги: #<Tag:0x00007f7b652624c8> #<Tag:0x00007f7b65262388>

(Bitande7) #1

Приветствую.

Есть страница с товарами. В каждом блоке товара есть цена, title, количество и кнопка добавить.
Код который я написал мне не нравится. Так как приходится постоянно указывать номер блока.

Например я хочу добавить 5-1 товар со страницы, значит надо вызвать page.item_atc_button(5)

Как можно улучшить этот код и привести к такому виду:

page.item(2).title
page.item(5).att_to_cart

Думал как то создавать отдельный объект внутки класса, но не придумал как

    def item(self, n=1):
        return find(self.item_lo % n)

    def item_qty(self, n=1):
        return self.item(n).find_element_by_xpath(self.item_qty_lo)

    def item_title(self, n=1):
        return self.item(n).find_element_by_xpath(self.item_title_lo)

    def item_atc_button(self, n=1):
        return self.item(n).find_element_by_xpath(self.item_atc_button_lo)

(Oleksandr Khotemskyi) #2

Вы только что сами дошли до идеи паттерна page fragments (page composition, page elements)

Именно для питона я использовал вот эту библиотеку. Она не идеальна - но работает неплохо:

Хотя в принципе реализовать самому упрощенный вариант не сложно.


(Oleksandr Khotemskyi) #3

Если “побыстренькому” то будет что-то около такого

class SearchResult:
    def __init__(self, webelement):
        self.webelement = webelement

    @property
    def title(self):
        # я бы всетаки рекомендовал возвращать текст а не вебэлемент тут
        return self.webelement.find_element_by_xpath('title locator here').text


    def open_details_page(self):
        return self.webelement.find_element_by_xpath('button locator here').click()


    # и так дальше



def get_search_result(index):
    webelement = find(self.item_lo % index)
    return SearchResult(webelement)

print(get_search_result(2).title)