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

Page Object на Python проблема с циклическим импортом


(yep) #1

Возникла проблема при попытке реализовать паттерн Page Object на Python + Selenium

Есть веб сайт, где страницы имеют переходы друг на друга,  то есть страница А имеет ссылку на страницу Б, а Б на А. 

Соответственно есть два Python модуля для каждой страницы.  Код модуля А должен возвращать объект класса Б, а  код модуля Б должен возвращать объект класса А.

При попытке импортировать из модуля А модуль Б, а из Б модуль А, в питоне происходит зацикливание, которое приводит к ошибкам.


Кто-нибудь сталкивался с такой проблемой? Какие существуют решения кроме объединения классов А и Б в один модуль?

 


(DRoss) #2

Я сталкивался.

 

Решал тем, что логически отделил классы страниц от классов, которые реализовывали более общие решения.

 

Сделал бы так.

Описал бы страницу А и Б в отдельных модулях. Каждый модуль бы описывал только методы взаимодействия со страницей, типа "Ввести значение в такое-то поле" и константы с локаторами. Никаких общих функций, которые бы имели связь с другими страницами. Тогда бы страницы не содержали бы ссылок друг на друга и на другие модули проекта.

 

Потом бы сделал модуль, который бы реализовывал бы более общие функции и он бы содержал ссылки на обе страницы. Метод по переходу бы выглядел так "Соверши переход из страницы А на страницу Б".

 

Выигрыш будет не только в том, что ты избавишься от циклических ссылок и импортов, но и существенно облегчишь поддержку.


(Mykhailo Poliarush) #3

ну тут надо чтобы вы код показали, но могу поспорить что Вы делали from module import Class

это и привело к данной ошибке

 

вот маленький пример как это можно \ нужно делать 

a.py

 

import b
class A:
def get_b(self):
return b.B()

b.py

 

import a
class B:
def get_a(self):
return a.A()

main.py

 

import a
b = a.A().get_b()
a = b.get_a()