#!/usr/bin/env python # -*- coding: utf-8 -*- ''' @File : list_page.py @Time : 2024/11/20 17:04:10 @Author : dulip3ng @Version : 1.0 @Desc : None ''' from pages.base_page import BasePage from playwright.sync_api import Page, expect class ListPage(BasePage): """ 列表页面模型,适用于普通单据列表页面,如销售订单列表 """ def __init__(self, page:Page, locator): super().__init__(page) self.locator = locator def wait_list_loaded(self): """ 等待页面加载完成,当页面加载出第一行第一列表格时,停止等待 **用法:** ListPage.wait_list_loaded() **注意:** 1.有时表格加载完成但界面仍存在wait_loading转圈图标,不做处理由playwright自动处理后续元素可操作性检查 2.默认等待时间受 expect.set_options(timeout=)全局控制 3.此方法只能检测有数据的列表是否加载完成,因为无数据时不会出现td表格元素,无法区分是否加载完成 :return: """ expect(self.page.locator(self.locator.WAITING_LOC).first).to_be_enabled() self.wait_time(1000) def click_button(self, button_name: str, sub_button:str=None, grandson_button:str=None, wait_load=False): """ 点击列表按钮,如“新增” **用法:** ListPage.click_button("新增") ListPage.click_button("新增", "复制") ListPage.click_button("选项", "套打", "套打设置") :param button_name: 按钮名称 :param sub_button: 子按钮名称,如”复制“ :param grandson_button: 三级按钮名称,如”选项>套打>套打设置“ :return: """ if wait_load: self.wait_list_loaded() if sub_button is None and grandson_button is None: self.page.locator(self.locator.BUTTON_ARGS_LOC % (button_name, 1)).click() if sub_button and grandson_button is None: self.page.locator(self.locator.BUTTON_ARGS_LOC % (button_name, 1)).hover() self.page.locator(self.locator.SUB_BUTTON_ARGS_LOC % sub_button).click() if sub_button and grandson_button: self.page.locator(self.locator.BUTTON_ARGS_LOC % (button_name, 1)).hover() self.page.locator(self.locator.SUB_BUTTON_ARGS_LOC % sub_button).hover() self.page.locator(self.locator.GRANDSON_BUTTON_ARGS_LOC % (sub_button, grandson_button)).click() def check_line_by_rows(self, *rows: int): """ 勾选给定行号 **用法:** ListPage.check_line_by_rows(1) ListPage.check_line_by_rows(1,2,3) :param rows: 行号,可传多个 :return: """ self.wait_list_loaded() if rows == (): self.page.locator(self.locator.ROW_DATA_ARGS_LOC % 1).click() self.page.locator(self.locator.ROW_DATA_ALL_LOC).click() for r in rows: self.page.locator(self.locator.ROW_DATA_ARGS_LOC % r).click() def open_bill_by_row(self, row: int): """ 根据行号打开单据 **用法:** ListPage.open_bill_by_row(1) **注意:** 此方法是通过点击行号的单据编号字段打开单据,确保该行单据编号字段有值 :param row: 行号 :return: """ self.wait_list_loaded() self.page.locator(self.locator.BILL_NO_FIELD_ARGS_LOC % row).click() def get_value(self, row: int, field_name:str): """ 获取列表字段值 **用法:** ListPage.get_value("衬衣订单号", 1) **注意:** 单据编号字段无效,可用get_bill_no() :param field_name: 字段名 :param row: 行号 :return: 字段值 """ self.wait_list_loaded() return self.page.locator(self.locator.ROW_FIELD_VALUE_ARGS_LOC % (field_name, row)).inner_text() def get_bill_no(self, row: int): """ 根据行号获取单据编号字段值 **用法:** ListPage.get_bill_no(1) **注意:** 确保给定行号单据编号字段有值 :param row: 行号 :return: """ self.wait_list_loaded() return self.page.locator(self.locator.BILL_NO_FIELD_VALUE_ARGS_LOC % row).inner_text() def get_row_count(self): """ 获取列表总行数 **用法:** ListPage.get_row_count() :return: 列表行数 """ self.wait_list_loaded() return self.page.locator(self.locator.LIST_ALL_LINE_LOC).count() def check_line_by_field_value(self, field_name:str, value:str): """ 根据给定字段名,字段值勾选对应行 **用法:** ListPage.check_line_by_field_value("衬衣订单号", "26022021") **注意:** 当列表中存在多个相同字段值行时,只勾选第一行 :param field_name: 字段名 :param value: 字段值 :return: """ self.wait_list_loaded() row = self.page.locator(self.locator.FIELDS_VALUE_ARGS_LOC % (field_name, value)).first.get_attribute('data-rowid') self.check_line_by_rows(int(row)) def field_filter(self, field_name:str, value:str): """ 字段过滤,点击列表列名右侧小漏斗,进行列表简单过滤 **用法:** ListPage.field_filter("销售类别", "内销") :param field_name: 字段名 :param value: 过滤值 :return: """ self.wait_list_loaded() self.page.locator(self.locator.FIELD_FILTER_ARGS_LOC % field_name).hover() self.page.locator(self.locator.FILTER_ICON_ARGS_LOC % field_name).click() self.page.locator(self.locator.FILTER_VALUE_ARGS_LOC % value).click() self.page.locator(self.locator.FILTER_OK_BTN).click()