在page object的基础上引入组件,分层如下
举个例子,假设前端每个页面使用相同的表格组件,那么每个页面都可以使用这个组件,给出定位就可以。
class Element(object):
def __init__(self, *locator):
self.locator = locator
def _handle(self, instance):
driver = instance.driver
WebDriverWait(driver, self.wait_time).until(
lambda d: driver.find_element(*self.locator)
)
return driver.find_element(*self.locator)
def __set__(self, instance, value):
element = self._handle(instance)
element.send_keys(value)
def __get__(self, instance, owner) -> WebElement:
return self._handle(instance)
class Table(object):
search_ele = Element("xpath", "./ancestor::*//input[@type='search']")
search_check_box = Element("xpath", "./ancestor::*//div[count(button)>1]/button")
page_info = Element("xpath","//div[@class ='MuiTablePagination-root']//p[2]") # 展示第几页的信息
def __init__(self, element, locator):
self.loactor = locator
self.element = element
self.driver = element.parent
self._handle()
self.ac = ActionChains(self.element.parent).click(self.element)
# table一般有搜索框
@property
def search_box(self):
return self.search_ele
# 有的搜索框有一些筛选按钮
@property
def check_buttons(self):
return self.search_check_box
# 读取table的头和每一行的值
@try_refresh
def _handle(self):
self.head = THead(self.element.find_element_by_tag_name("thead"))
self.body = TBody(self.element.find_element_by_tag_name("tbody"), self.head)
self.start, self.end, self.total_number = self.page_finder.search(self.pages_info.text).groups()
self.page_operators = self.pages_info.find_elements_by_xpath("./following-sibling::div/button")
# 获取第几行
def __getitem__(self, item):
return self.body[item]
# 筛选表格的值
@try_refresh
def filter(self, items: dict, search=''):
if search:
Send_keys(self.search_box, search)
time.sleep(2)
self.refresh()
iter_list = self.body
for key, value in items.items():
iter_list = list(filter(lambda a: a[key] == str(value), iter_list))
return list(iter_list)
class TableElement(Element):
template = "//table"
def __get__(self, instance, owner) -> Table:
result = super(TableElement, self).__get__(instance, owner)
return Table(result, *self.locator)
页面中调用
class CompanyJobPage(CompanyBasePage):
# 搜索栏
search_job = SearchElement()
# 岗位信息
table = TableElement()
def enter_detail(self, filter_):
t = self.table
self.click(t.search(filter_, search=filter_["岗位名称"]).get_element("操作"))
return JobDetailPage(self.driver)
目录结构