list_page.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. '''
  4. @File : list_page.py
  5. @Time : 2024/11/20 17:04:10
  6. @Author : dulip3ng
  7. @Version : 1.0
  8. @Desc : None
  9. '''
  10. from pages.base_page import BasePage
  11. from playwright.sync_api import Page, expect
  12. class ListPage(BasePage):
  13. """
  14. 列表页面模型,适用于普通单据列表页面,如销售订单列表
  15. """
  16. def __init__(self, page:Page, locator):
  17. super().__init__(page)
  18. self.locator = locator
  19. def wait_list_loaded(self):
  20. """
  21. 等待页面加载完成,当页面加载出第一行第一列表格时,停止等待
  22. **用法:**
  23. ListPage.wait_list_loaded()
  24. **注意:**
  25. 1.有时表格加载完成但界面仍存在wait_loading转圈图标,不做处理由playwright自动处理后续元素可操作性检查
  26. 2.默认等待时间受 expect.set_options(timeout=)全局控制
  27. 3.此方法只能检测有数据的列表是否加载完成,因为无数据时不会出现td表格元素,无法区分是否加载完成
  28. :return:
  29. """
  30. expect(self.page.locator(self.locator.WAITING_LOC).first).to_be_enabled()
  31. self.wait_time(1000)
  32. def click_button(self, button_name: str, sub_button:str=None, grandson_button:str=None, wait_load=False):
  33. """
  34. 点击列表按钮,如“新增”
  35. **用法:**
  36. ListPage.click_button("新增")
  37. ListPage.click_button("新增", "复制")
  38. ListPage.click_button("选项", "套打", "套打设置")
  39. :param button_name: 按钮名称
  40. :param sub_button: 子按钮名称,如”复制“
  41. :param grandson_button: 三级按钮名称,如”选项>套打>套打设置“
  42. :return:
  43. """
  44. if wait_load:
  45. self.wait_list_loaded()
  46. if sub_button is None and grandson_button is None:
  47. self.page.locator(self.locator.BUTTON_ARGS_LOC % (button_name, 1)).click()
  48. if sub_button and grandson_button is None:
  49. self.page.locator(self.locator.BUTTON_ARGS_LOC % (button_name, 1)).hover()
  50. self.page.locator(self.locator.SUB_BUTTON_ARGS_LOC % sub_button).click()
  51. if sub_button and grandson_button:
  52. self.page.locator(self.locator.BUTTON_ARGS_LOC % (button_name, 1)).hover()
  53. self.page.locator(self.locator.SUB_BUTTON_ARGS_LOC % sub_button).hover()
  54. self.page.locator(self.locator.GRANDSON_BUTTON_ARGS_LOC % (sub_button, grandson_button)).click()
  55. def check_line_by_rows(self, *rows: int):
  56. """
  57. 勾选给定行号
  58. **用法:**
  59. ListPage.check_line_by_rows(1)
  60. ListPage.check_line_by_rows(1,2,3)
  61. :param rows: 行号,可传多个
  62. :return:
  63. """
  64. self.wait_list_loaded()
  65. if rows == ():
  66. self.page.locator(self.locator.ROW_DATA_ARGS_LOC % 1).click()
  67. self.page.locator(self.locator.ROW_DATA_ALL_LOC).click()
  68. for r in rows:
  69. self.page.locator(self.locator.ROW_DATA_ARGS_LOC % r).click()
  70. def open_bill_by_row(self, row: int):
  71. """
  72. 根据行号打开单据
  73. **用法:**
  74. ListPage.open_bill_by_row(1)
  75. **注意:**
  76. 此方法是通过点击行号的单据编号字段打开单据,确保该行单据编号字段有值
  77. :param row: 行号
  78. :return:
  79. """
  80. self.wait_list_loaded()
  81. self.page.locator(self.locator.BILL_NO_FIELD_ARGS_LOC % row).click()
  82. def get_value(self, row: int, field_name:str):
  83. """
  84. 获取列表字段值
  85. **用法:**
  86. ListPage.get_value("衬衣订单号", 1)
  87. **注意:**
  88. 单据编号字段无效,可用get_bill_no()
  89. :param field_name: 字段名
  90. :param row: 行号
  91. :return: 字段值
  92. """
  93. self.wait_list_loaded()
  94. return self.page.locator(self.locator.ROW_FIELD_VALUE_ARGS_LOC % (field_name, row)).inner_text()
  95. def get_bill_no(self, row: int):
  96. """
  97. 根据行号获取单据编号字段值
  98. **用法:**
  99. ListPage.get_bill_no(1)
  100. **注意:**
  101. 确保给定行号单据编号字段有值
  102. :param row: 行号
  103. :return:
  104. """
  105. self.wait_list_loaded()
  106. return self.page.locator(self.locator.BILL_NO_FIELD_VALUE_ARGS_LOC % row).inner_text()
  107. def get_row_count(self):
  108. """
  109. 获取列表总行数
  110. **用法:**
  111. ListPage.get_row_count()
  112. :return: 列表行数
  113. """
  114. self.wait_list_loaded()
  115. return self.page.locator(self.locator.LIST_ALL_LINE_LOC).count()
  116. def check_line_by_field_value(self, field_name:str, value:str):
  117. """
  118. 根据给定字段名,字段值勾选对应行
  119. **用法:**
  120. ListPage.check_line_by_field_value("衬衣订单号", "26022021")
  121. **注意:**
  122. 当列表中存在多个相同字段值行时,只勾选第一行
  123. :param field_name: 字段名
  124. :param value: 字段值
  125. :return:
  126. """
  127. self.wait_list_loaded()
  128. row = self.page.locator(self.locator.FIELDS_VALUE_ARGS_LOC % (field_name, value)).first.get_attribute('data-rowid')
  129. self.check_line_by_rows(int(row))
  130. def field_filter(self, field_name:str, value:str):
  131. """
  132. 字段过滤,点击列表列名右侧小漏斗,进行列表简单过滤
  133. **用法:**
  134. ListPage.field_filter("销售类别", "内销")
  135. :param field_name: 字段名
  136. :param value: 过滤值
  137. :return:
  138. """
  139. self.wait_list_loaded()
  140. self.page.locator(self.locator.FIELD_FILTER_ARGS_LOC % field_name).hover()
  141. self.page.locator(self.locator.FILTER_ICON_ARGS_LOC % field_name).click()
  142. self.page.locator(self.locator.FILTER_VALUE_ARGS_LOC % value).click()
  143. self.page.locator(self.locator.FILTER_OK_BTN).click()