From ddf66cf155af3805323ec55ae6814f2d23d40c07 Mon Sep 17 00:00:00 2001
From: 阳洁 <2077506045@qq.com>
Date: 星期五, 28 七月 2023 18:42:30 +0800
Subject: [PATCH] 测评系统自动测试

---
 elements/maq_answer_elements.py        |   19 
 po/product_accredit_page.py            |   38 
 po/maq_answer_page.py                  |   89 
 po/home_page.py                        |   61 
 testcase/test_product_accredit.py      |   78 
 .gitignore                             |    1 
 elements/report_elements.py            |   27 
 po/caq_answer_page.py                  |   40 
 po/login_page.py                       |   74 
 po/export_test_data_page.py            |   38 
 report/report.html                     |  152 +
 testcase/test_vaq.py                   |    4 
 elements/group_report_elements.py      |   36 
 testcase/test_3export_test_data.py     |  124 +
 testcase/test_caq.py                   |  136 -
 comm/read_data.py                      |   36 
 po/group_report_page.py                |   27 
 comm/write_data.py                     |   18 
 elements/share_add_elements.py         |   34 
 main.py                                |    2 
 data/question_data.json                |  596 ++++++
 testcase/test_2package_list.py         |  820 ++++++++
 po/report_page.py                      |   38 
 testcase/test_maq.py                   |  110 
 testcase/conftest.py                   |   18 
 data/test_data.json                    | 1312 ++++++++++++++
 elements/product_accredit__elements.py |   35 
 base/base_page.py                      |  361 +++
 elements/login_elements.py             |   10 
 elements/export_test_data_elements.py  |   30 
 comm/comm.py                           |   17 
 elements/home_elements.py              |   11 
 po/member_detail_page.py               |  164 +
 testcase/test_group_report.py          |  147 +
 elements/member_detail_elements.py     |   95 +
 elements/test_package_list_elements.py |  102 +
 testcase/test_login.py                 |   53 
 po/share_add_page.py                   |   76 
 po/test_package_list_page.py           |  514 +++--
 39 files changed, 4,958 insertions(+), 585 deletions(-)

diff --git a/.gitignore b/.gitignore
index 087029a..6b9018b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,6 +20,7 @@
 *.egg-info/
 .installed.cfg
 *.egg
+download/
 
 # Installer logs
 pip-log.txt
diff --git a/base/base_page.py b/base/base_page.py
index 6bcb658..aba837a 100644
--- a/base/base_page.py
+++ b/base/base_page.py
@@ -1,20 +1,272 @@
+import importlib
+import time
 
+from selenium.common import StaleElementReferenceException, ElementClickInterceptedException
+from selenium.webdriver.remote.webelement import WebElement
 from selenium.webdriver.support.wait import WebDriverWait
 from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.remote.webdriver import WebDriver
+
+SimpleActions = ['clear()', 'send_keys()', 'click()', 'submit()', 'size', 'text', 'is_displayed()', 'get_attribute()']
+complexActions = ['iframe()', 'select()', 'option()']
+
+# 榛樿瓒呮椂鏃堕棿10绉�
+DEFAULT_TIMEOUT = 10
+# 榛樿閲嶈瘯娆℃暟
+DEFAULT_RETRY = 30
 
 
 class BasePage:
+
+    retry_number = 0
+
     # 鍒濆鍖栨柟娉�
-    def __init__(self, driver):
+    def __init__(self, driver: WebDriver):
+        """鏋勯�犳柟娉曪紝浼犲叆webdriver"""
         self.driver = driver
 
-    # 鍏冪礌瀹氫綅
-    def get_element(self, locator):
-        return self.driver.find_element(*locator)
+    # def _get_page_elem(self, elem):
+    #     """鑾峰彇瀹氫綅鍏冪礌鐨刡y锛屼互鍙婃搷浣渁ction"""
+    #     for each in self.elements:
+    #         if each['name'] == elem:
+    #             self.loc = each['loc']
+    #             if each['action'] is not None:
+    #                 self.action = each['action']
+    #             else:
+    #                 self.action = None
+    #             if 'optionsLoc' in each:
+    #                 self.optionsLoc = each['optionsLoc']
+    #             else:
+    #                 self.optionsLoc = None
+    #             if 'wait' in each:
+    #                 self.wait = each['wait']
+    #             else:
+    #                 self.wait = None
+    #
+    # def oper_elem(self, elem, args=None):
+    #     self._get_page_elem(elem)
+    #     cmd = self._selenium_cmd('find_element', args)
+    #     return eval(cmd)
+    #
+    # def oper_elems(self, elem, args=None):
+    #     self._get_page_elem(elem)
+    #     cmd = self._selenium_cmd('find_elements', args)
+    #     return eval(cmd)
+    #
+    # def _selenium_cmd(self, find_type='find_element', args=None):
+    #     """鎷兼帴selenium鏌ユ壘鍛戒护锛屾煡鎵惧崟涓厓绱犳椂find涓�'find_element',澶氫釜鍏冪礌鏃朵负'find_elements'"""
+    #     cmd = 'self.driver.' + find_type + '(*self.loc)'
+    #     if self.action:
+    #         cmd = 'self.' + self.action
+    #         if args:
+    #             cmd = cmd[:-1] + 'args' + ')'
+    #     return cmd
+    #
+    # def iframe(self):
+    #     self.driver.switch_to.frame(self.driver.find_element(*self.loc))
+    #
+    # def click(self):
+    #     if self.wait:
+    #         wait = WebDriverWait(self.driver, self.wait, 0.5)
+    #         wait.until(EC.presence_of_element_located(self.loc)).click()
+    #     else:
+    #         self.driver.find_element(*self.loc).click()
+    #
+    # # 浣跨敤js璇彞鐐瑰嚮
+    # def click_js(self):
+    #     item = self.driver.find_element(*self.loc)
+    #     self.driver.execute_script("arguments[0].click();", item)
+    #
+    # def send_keys(self, text):
+    #     wait = WebDriverWait(self.driver, 10, 0.5)
+    #     wait.until(EC.presence_of_element_located(self.loc)).send_keys(text)
+    #
+    # def text(self):
+    #     wait = WebDriverWait(self.driver, 10, 0.5)
+    #     return wait.until(EC.presence_of_element_located(self.loc)).text
+    #
+    def select(self, select_loc, options_loc, item):
+        """
+        閫夋嫨浼犲叆鐨勯�夐」
+        :param select_loc: 閫夋嫨妗嗗畾浣�
+        :param options_loc: 閫夐」瀹氫綅
+        :param item: 閫夐」
+        :return:
+        """
+        # 鐐瑰嚮閫夋嫨妗嗗璞�
+        self.click(select_loc, timeout=10)
+        # 鑾峰彇鎵�鏈夐�夐」
+        options = self.get_eles(options_loc, timeout=10)
+        for option in options:
+            if option.text == item:
+                option.click()
+                break
+    #
+    # def value_js(self):
+    #     """
+    #     浣跨敤js璇彞鑾峰彇value鍊�
+    #     :return:
+    #     """
+    #     # 绛夊緟瀵硅薄
+    #     wait = WebDriverWait(self.driver, 10, 0.5)
+    #     input_box = wait.until(EC.presence_of_element_located(self.loc))
+    #     input_value = self.driver.execute_script("return arguments[0].value", input_box)
+    #     return input_value
+    #
+    # def option(self, text):
+    #     """
+    #     鐐瑰嚮浼犲叆鐨勯�夐」
+    #     :param text:
+    #     :return:
+    #     """
+    #     wait = WebDriverWait(self.driver, 10, 0.5)
+    #     wait.until(EC.presence_of_all_elements_located(self.loc))
+    #     options = self.driver.find_elements(*self.loc)
+    #     for option in options:
+    #         if option.text == text:
+    #             option.click()
 
-    # 澶氫釜鍏冪礌瀹氫綅
-    def get_elements(self, locator):
-        return self.driver.find_elements(*locator)
+    # 鍏冪礌瀹氫綅
+
+    def goto(self, url):
+        """璁块棶url"""
+        self.driver.get(url)
+
+    def get_ele(self, loc, timeout=None) -> WebElement:
+        """
+        鑾峰彇鍏冪礌
+        :param loc: 鍏冪礌瀹氫綅
+        :param timeout: 瓒呮椂鏃堕棿
+        :return:
+        """
+        if timeout:
+            return self.wait_visible(loc, timeout)
+        else:
+            return self.driver.find_element(*loc)
+
+    def get_eles(self, loc, timeout=None):
+        """
+        鑾峰彇澶氫釜鍏冪礌
+        :param loc: 鍏冪礌瀹氫綅
+        :param timeout: 瓒呮椂鏃堕棿
+        :return:
+        """
+        if timeout:
+            return self.wait_visible(loc, timeout=timeout, find_type="elements")
+        else:
+            return self.driver.find_elements(*loc)
+
+    def clear(self, loc, timeout=None):
+        """
+        娓呴櫎鏂囨湰妗嗗唴瀹�
+        :param loc:
+        :param timeout:
+        :return:
+        """
+        ele = self.get_ele(loc, timeout=timeout)
+        ele.clear()
+
+    def fill(self, loc, text, timeout=None):
+        """椤甸潰杈撳叆"""
+
+        ele = self.get_ele(loc, timeout=timeout)
+        # 鍏堟竻闄ゆ枃鏈鍐呭
+        ele.clear()
+        # 濉啓鍐呭
+        ele.send_keys(text)
+
+    def wait_visible(self, loc, timeout=DEFAULT_TIMEOUT, find_type="element") -> WebElement:
+        """
+        绛夊緟鍏冪礌鍙
+        :param loc: 鍏冪礌瀹氫綅
+        :param timeout: 绛夊緟鏃堕棿
+        :param find_type: 绛夊緟鍏冪礌鐨勭被鍨�
+        :return:
+        """
+        wait = WebDriverWait(self.driver, timeout=timeout)
+        element = None
+        if find_type == "element":
+            element = wait.until(EC.visibility_of_element_located(loc))
+        elif find_type == "elements":
+            element = wait.until(EC.visibility_of_all_elements_located(loc))
+        return element
+
+    def click(self, loc, timeout=None):
+        """
+        鐐瑰嚮鍏冪礌
+        :param loc: 鍏冪礌瀹氫綅
+        :param timeout: 瓒呮椂鏃堕棿
+        :return:
+        """
+        try:
+            if timeout:
+                ele = self.wait_clickable(loc, timeout=timeout)
+                ele.click()
+            else:
+                ele = self.driver.find_element(*loc)
+                ele.click()
+            self.retry_number = 0
+        except (StaleElementReferenceException, ElementClickInterceptedException):
+            if self.retry_number >= DEFAULT_RETRY:
+                return
+            time.sleep(1)
+            self.retry_number += 1
+            self.click(loc, timeout=timeout)
+
+    def click_js(self, loc, timeout=None):
+        """
+        JavaScript鐐瑰嚮鍏冪礌
+        :param loc:
+        :param timeout:
+        :return:
+        """
+        item = self.get_ele(loc, timeout=timeout)
+        self.driver.execute_script("arguments[0].click();", item)
+
+    def wait_clickable(self, loc, timeout=DEFAULT_TIMEOUT) -> WebElement:
+        """
+        绛夊緟鍏冪礌鍙偣鍑�
+        :param loc: 鍏冪礌瀹氫綅
+        :param timeout: 瓒呮椂鏃堕棿
+        :return:
+        """
+        wait = WebDriverWait(self.driver, timeout=timeout)
+        element = wait.until(EC.element_to_be_clickable(loc))
+        return element
+
+    def equals(self, loc, text):
+        """
+        鍒ゆ柇鍏冪礌鐨剉alue鎴栬�卼ext鏄惁涓巘ext鐩哥瓑
+        :param loc:
+        :param text:
+        :return:
+        """
+        # 鍏堣幏鍙杤alue
+        ele_value = self.get_ele(loc, timeout=10).get_attribute("value")
+        # 濡傛灉涓篘one鍒欓�氳繃value_js鑾峰彇value鍊�
+        if not ele_value:
+            ele_value = self.get_value_js(loc, timeout=10)
+        # 濡傛灉杩樹负绌哄垯鑾峰彇text
+        if not ele_value:
+            ele_value = self.get_ele(loc, timeout=10).text
+        return ele_value == text
+
+    def contains(self, loc, text):
+        """
+        鍒ゆ柇鍏冪礌鐨剉alue鎴栬�卼ext鍖呭惈text
+        :param loc:
+        :param text:
+        :return:
+        """
+        # 鍏堣幏鍙杤alue
+        ele_value = self.get_ele(loc).get_attribute("value")
+        # 濡傛灉涓篘one鍒欓�氳繃value_js鑾峰彇value鍊�
+        if not ele_value:
+            ele_value = self.get_value_js(loc)
+        # 濡傛灉杩樹负绌哄垯鑾峰彇text
+        if not ele_value:
+            ele_value = self.get_ele(loc).text
+        return text in ele_value
 
     # 澶氫釜鍏冪礌瀹氫綅
     def get_elements_wait(self, locator):
@@ -36,11 +288,6 @@
         wait.until(EC.presence_of_element_located(locator))
         return self.driver.find_element(*locator)
 
-    # 浣跨敤js璇彞鐐瑰嚮
-    def click_js(self, *locator):
-        item = self.get_element(*locator)
-        self.driver.execute_script("arguments[0].click();", item)
-
     def click_js_wait(self, *locator):
         item = self.get_element_wait(*locator)
         self.driver.execute_script("arguments[0].click();", item)
@@ -53,36 +300,41 @@
         """
         self.driver.execute_script("arguments[0].click();", element)
 
-    # 鐐瑰嚮
-    def click(self, locator):
-        """
-        鐐瑰嚮鍏冪礌
-        :param locator: 鍏冪礌瀹氫綅
-        :return:
-        """
-        self.get_element(locator).click()
+    # # 鐐瑰嚮
+    # def click(self, locator):
+    #     """
+    #     鐐瑰嚮鍏冪礌
+    #     :param locator: 鍏冪礌瀹氫綅
+    #     :return:
+    #     """
+    #     self.get_element(locator).click()
 
     def click_wait(self, *locator):
         self.get_element_wait(*locator).click()
 
-    # 杈撳叆
-    def send_text(self, text, locator):
-        """
-        杈撳叆鍐呭
-        :param text: 鍐呭
-        :param locator: 鍏冪礌瀹氫綅
-        :return:
-        """
-        self.get_element(locator).send_keys(text)
+    # # 杈撳叆
+    # def fill(self, text, locator):
+    #     """
+    #     杈撳叆鍐呭
+    #     :param text: 鍐呭
+    #     :param locator: 鍏冪礌瀹氫綅
+    #     :return:
+    #     """
+    #     self.get_element(locator).send_keys(text)
 
     def send_text_wait(self, text, *locator):
         self.get_element_wait(*locator).send_keys(text)
 
-    # JavaScript鑾峰彇鍏冪礌鍊�
-    def get_input_value_js(self, locator):
-        input_box = self.get_element(locator)
-        input_value = self.driver.execute_script("return arguments[0].value", input_box)
-        return input_value
+    def get_value_js(self, loc, timeout=None):
+        """
+        鎵цJavaScript鑾峰彇value鍊�
+        :param timeout:
+        :param loc:
+        :return:
+        """
+        ele = self.get_ele(loc, timeout=timeout)
+        value = self.driver.execute_script("return arguments[0].value", ele)
+        return value
 
     def get_input_value_js_wait(self, *locator):
         input_box = self.get_element_wait(*locator)
@@ -97,11 +349,21 @@
         self.get_element_wait(*locator).clear()
 
     # 琛ㄥ崟鍒囨崲
-    def switch_iframe(self, locator):
-        self.driver.switch_to.frame(self.get_element(locator))
+    def switch_iframe(self, loc):
+        """
+        鍒囨崲琛ㄥ崟
+        :param loc: 琛ㄥ崟瀹氫綅
+        :return:
+        """
+        # 鑾峰彇鍒癷frame鍏冪礌
+        iframe = self.get_ele(loc, timeout=10)
+        self.driver.switch_to.frame(iframe)
 
-    # 鍒囨崲鍒颁笂涓�灞傜殑iframe
     def switch_parent_iframe(self):
+        """
+        鍒囨崲鍒颁笂涓�灞傜殑iframe
+        :return:
+        """
         self.driver.switch_to.parent_frame()
 
     def switch_iframe_wait(self, locator):
@@ -150,7 +412,7 @@
         """鎴彇褰撳墠绐楀彛淇濆瓨涓哄浘鐗�"""
         return self.driver.get_screenshot_as_png()
 
-    def open_new_table_to_url(self, url):
+    def goto_new_table(self, url):
         """
         鎵撳紑涓�涓柊鐨勬爣绛鹃〉锛屽苟璺宠浆鍒版寚瀹氱殑url
         :return:
@@ -171,3 +433,26 @@
         wait = WebDriverWait(self.driver, 10, 0.5)
         return wait.until(EC.visibility_of_any_elements_located(locator))
 
+    def add_elements(self, ele):
+        """
+        鍦╡lements涓柊澧炲厓绱�
+        :param ele:
+        :return:
+        """
+        self.elements.append(ele)
+
+
+def get_page_elements(page):
+    """
+    鍔ㄦ�佸姞杞介〉闈㈠畾涔夋枃浠讹紝鑾峰彇鏂囦欢涓畾涔夌殑鍏冪礌鍒楄〃elements
+    :param page:
+    :return:
+    """
+    elements = None
+    if page:
+        try:
+            m = importlib.import_module(page)
+            elements = m.elements
+        except Exception as e:
+            pass
+    return elements
diff --git a/comm/comm.py b/comm/comm.py
new file mode 100644
index 0000000..70caebd
--- /dev/null
+++ b/comm/comm.py
@@ -0,0 +1,17 @@
+import os
+import random
+import string
+
+
+def listdir(dir_path):
+    file_names = []
+    for filename in os.listdir(dir_path):
+        if os.path.isfile(os.path.join(dir_path, filename)):
+            if ".crdownload" not in filename:
+                file_names.append(filename)
+    return file_names
+
+
+def generate_random_string(length):
+    letters = string.ascii_letters + string.digits
+    return ''.join(random.choice(letters) for _ in range(length))
diff --git a/comm/read_data.py b/comm/read_data.py
new file mode 100644
index 0000000..58d3a3e
--- /dev/null
+++ b/comm/read_data.py
@@ -0,0 +1,36 @@
+import codecs
+import csv
+from openpyxl import load_workbook
+
+
+def read_csv(file_name):
+    data_list = list()
+    with codecs.open(file_name, encoding="utf-8") as f:
+        for row in csv.DictReader(f, skipinitialspace=True):
+            data_list.append(row)
+
+    return data_list
+
+
+def read_excel(file_name, sheet_name):
+    # 鎵撳紑Excel鏂囦欢锛屽姞杞絯orkbook
+    workbook = load_workbook(filename=file_name)
+    # 鏍规嵁鍚嶇О鑾峰彇worksheet
+    worksheet = workbook.get_sheet_by_name(sheet_name)
+    # 鑾峰彇鎵�鏈夋暟鎹�
+    rows = worksheet.rows
+
+    # 灏嗙涓�琛屾暟鎹綔涓哄瓧鍏哥殑閿�
+    header = []
+    for cell in next(rows):
+        header.append(cell.value)
+
+    # 浠庣浜岃璧烽亶鍘嗘瘡涓�琛屾暟鎹紝骞跺瓨鍌ㄥ埌瀛楀吀涓�
+    data_list = []
+    for row in rows:
+        data = {}
+        for i, cell in enumerate(row):
+            data[header[i]] = cell.value
+        data_list.append(data)
+
+    return data_list
diff --git a/comm/write_data.py b/comm/write_data.py
new file mode 100644
index 0000000..0d9d6f5
--- /dev/null
+++ b/comm/write_data.py
@@ -0,0 +1,18 @@
+from openpyxl import load_workbook, Workbook
+
+
+def write_excel(file_name, data):
+    # 鎵撳紑Excel鏂囦欢锛屽姞杞絯orkbook
+    flag = False
+    try:
+        workbook = load_workbook(filename=file_name)
+    except FileNotFoundError:
+        flag = True
+        workbook = Workbook()
+    # 鏍规嵁鍚嶇О鑾峰彇worksheet
+    worksheet = workbook.active
+
+    if flag:
+        worksheet.append(["璐﹀彿", "鍏呭�兼暟", "瀹為檯鍏呭�兼暟", "鍏呭�煎墠浣欓", "鍏呭�煎悗浣欓"])
+    worksheet.append(data)
+    workbook.save(filename=file_name)
diff --git a/data/question_data.json b/data/question_data.json
new file mode 100644
index 0000000..7ac1aba
--- /dev/null
+++ b/data/question_data.json
@@ -0,0 +1,596 @@
+{
+  "MAQ0001": {
+    "title": "鎴戜笉鍠滄鑺辨椂闂存鏌ュ皬缁嗚妭鐨勫噯纭��"
+  },
+  "MAQ0003": {
+    "title": "鎴戜粠涓嶈璋庯紝鐢氳嚦杩炲皬璋庨兘娌℃湁璇磋繃"
+  },
+  "MAQ0004": {
+    "title": "褰撴垜鍋氫竴涓」鐩椂锛屾垜浼氬叏鍔涗互璧达紝鐩村埌瀹屾垚涓烘"
+  },
+  "MAQ0005": {
+    "title": "鎴戝�惧悜浜庝娇鐢ㄥ父瑙勬柟娉曪紝鑰屼笉鏄偅浜涗粠鏈皾璇曡繃鐨勬柟娉�"
+  },
+  "MAQ0006": {
+    "title": "褰撴垜涓嶅緱涓嶅幓璐熻矗涓�涓洟闃熺殑鏃跺�欙紝鎴戜細鎰熻鎴樺參銆佹亹鎯�"
+  },
+  "MAQ0007": {
+    "title": "鎴戞湁鏃跺洜涓哄悇绉嶅共鎵板洜绱狅紝鏈兘鎸夋椂瀹屾垚宸ヤ綔浠诲姟"
+  },
+  "MAQ0009": {
+    "title": "鎴戣兘澶熸帶鍒惰嚜宸辩殑鎯呯华鐘舵�侊紝浣垮叾浠栦汉涓嶅お瀹规槗鐭ラ亾鎴戝唴蹇冪殑鎰熷彈"
+  },
+  "MAQ0010": {
+    "title": "鎴戞敮鎸佹墍鍦ㄧ粍缁囩殑浠峰�艰鍜岃鑼冿紝骞朵簡瑙e叾閲嶈鎬�"
+  },
+  "MAQ0011": {
+    "title": "鎴戜笉浼氬洜澶辫触鎴栨尗鎶樿�屾硠姘�"
+  },
+  "MAQ0013": {
+    "title": "鎴戜粠鏉ユ病鏈夊湪琛椾笂涔辨墧鍨冨溇"
+  },
+  "MAQ0014": {
+    "title": "鏈夋椂鎴戝彂鐜拌鍒汉鍚粠鎴戠殑鎸囩ず鏄欢寰堝洶闅剧殑浜�"
+  },
+  "MAQ0015": {
+    "title": "蹇呰鏃讹紝鎴戣兘寰堝鏄撳湴闀挎椂闂村畬鍏ㄤ笓娉ㄤ簬閲嶈鐨勫伐浣滈」鐩�"
+  },
+  "MAQ0019": {
+    "title": "鍦ㄩ」鐩伃鍙楅噸澶ф尗鎶樹箣鍚庯紝鎴戝苟涓嶆槸鎬昏兘婵�鍙戝洟闃熺殑鏂楀織"
+  },
+  "MAQ0020": {
+    "title": "鎴戜粠鏈湪鑳屽悗璇磋繃鏈嬪弸鐨勫潖璇�"
+  },
+  "MAQ0021": {
+    "title": "鎴戝枩娆㈡牴鎹洿瑙夋潵瑙e喅闂锛岃�屼笉鏄姳杈冮暱鏃堕棿杩涜绯荤粺鐨勫垎鏋�"
+  },
+  "MAQ0024": {
+    "title": "鏀跨瓥鍜岃瀹氭�荤殑鏉ヨ鍙槸鎸囧鎬ф剰瑙侊紝鍦ㄦ柟渚挎椂搴斿綋閬靛畧锛屽湪涓嶆柟渚挎椂鍙互鐏垫椿澶勭悊"
+  },
+  "MAQ0025": {
+    "title": "闈㈠宸ヤ綔鐜鐨勫彉鍖栵紝鎴戝緢涔愭剰灏濊瘯鏂扮殑宸ヤ綔鏂瑰紡"
+  },
+  "MAQ0026": {
+    "title": "鎴戝枩娆㈡悳瀵诲拰鐮旂┒鏁版嵁锛岀湅鐪嬫暟鎹兘缁欏嚭鎬庢牱鐨勬柟鍚戙��"
+  },
+  "MAQ0027": {
+    "title": "褰撴垜鐪嬪埌鍏朵粬鍥㈤槦鎴愬憳闇�瑕佸府鍔╂椂锛屾垜浼氳皟鏁存垜鐨勫伐浣滄棩绋嬶紝鑵惧嚭鏃堕棿鏉ュ府鍔╀粬浠�"
+  },
+  "MAQ0028": {
+    "title": "鍦ㄥ紑浼氭椂锛屾垜鏈夋椂浼氳鑷繁鎴栦粬浜虹殑璐熼潰鎯呯华鎵�骞叉壈"
+  },
+  "MAQ0029": {
+    "title": "鎴戠粡甯告槸鍥㈤槦涓涓�涓彁鍑鸿鍔ㄦ柟妗堢殑"
+  },
+  "MAQ0030": {
+    "title": "鎴戜富鍔ㄥ弬涓庢垨棰嗗鍒汉涓嶆効鎰忔壙鎷呯殑宸ヤ綔椤圭洰"
+  },
+  "MAQ0034": {
+    "title": "鎴戠粡甯稿悜鎴戠殑鍚屼簨鍜屼笅灞炲己璋冿紝鎴戜滑鎵�鍋氱殑鎵�鏈夊喅绛栭兘蹇呴』绗﹀悎缁勭粐鐨勪环鍊艰鍜岃鑼�"
+  },
+  "MAQ0035": {
+    "title": "鏈夋椂鍒汉鐨勮礋闈㈡儏缁細褰卞搷鎴戣嚜宸辩殑鎯呯华"
+  },
+  "MAQ0036": {
+    "title": "鎴戠粡甯稿垱閫犳�у湴鎶婂埆浜虹殑涓嶅悓鎯虫硶缁撳悎璧锋潵锛屽苟鎵惧埌鏈夋晥鐨勯棶棰樿В鍐冲姙娉�"
+  },
+  "MAQ0038": {
+    "title": "鎴戞浘缁忓埄鐢ㄨ繃鍏朵粬浜�"
+  },
+  "MAQ0039": {
+    "title": "鎴戝枩娆㈠垎鏋愬鏉傜殑姒傚康骞跺彂鐜板畠浠箣闂寸殑閫昏緫鑱旂郴"
+  },
+  "MAQ0040": {
+    "title": "鎴戝緢浜彈浠旂粏妫�鏌ュ皬缁嗚妭鐨勮繃绋�"
+  },
+  "MAQ0041": {
+    "title": "鑷緥瀵规垜鏉ヨ寰堝鏄撳仛鍒�"
+  },
+  "MAQ0042": {
+    "title": "寮�濮嬪仛浠讳綍椤圭洰鍓嶏紝鎴戦兘浼氶鍏堟⒊鐞嗕换鍔$殑杞婚噸缂撴�ュ拰鎴鏃ユ湡"
+  },
+  "MAQ0044": {
+    "title": "鍗充娇鍦ㄥ緢蹇欑殑鏃跺�欙紝濡傛灉鎴戠煡閬撴垜鏄煇椤瑰伐浣滅殑鏈�浣充汉閫夛紝鎴戜篃浼氳嚜鎰垮幓鎵挎媴杩欎簺棰濆鐨勫伐浣�"
+  },
+  "MAQ0045": {
+    "title": "宸ヤ綔涓婇伃閬囧け璐ユ垨鎸姌鏃讹紝鎴戜細寮�濮嬫��鐤戣嚜宸�"
+  },
+  "MAQ0046": {
+    "title": "鎴戞病鏈変粩缁嗘牎瀵硅嚜宸辩殑宸ヤ綔鎴栨姤鍛婄殑涔犳儻"
+  },
+  "MAQ0047": {
+    "title": "鎴戞湁鏃跺仛浜嬮渶瑕佸埆浜烘彁閱掓墠鑳芥寜鏃跺畬鎴�"
+  },
+  "MAQ0048": {
+    "title": "鎴戝緢涔愭剰鎷呬换棰嗗鐨勮鑹�"
+  },
+  "MAQ0049": {
+    "title": "褰撴垜鐨勪笂鍙镐笉鍦ㄧ殑鏃跺�欙紝鎴戜笉鍠滄鑷繁鍋氬伐浣滀笂鐨勫喅绛�"
+  },
+  "MAQ0051": {
+    "title": "鍦ㄥ伐浣滀腑锛屾垜娌℃湁涓哄疄鐜扮洰鏍囪�屽姫鍔涘苟鑾峰緱鎴愬氨鍜岃鍙殑鍔ㄥ姏"
+  },
+  "MAQ0053": {
+    "title": "濡傛灉鑳介�夋嫨锛屾垜鏇村枩娆簨鍏堣鍒掑ソ鐨勪緥琛屾椿鍔紝鑰屼笉鍠滄鍘婚�傚簲鍚勭涓嶇‘瀹氭��"
+  },
+  "MAQ0055": {
+    "title": "褰撴墜澶存湁鍏跺畠宸ヤ綔瑕佸仛鏃讹紝鎴戜笉澶効鎰忓府鍔╁洟闃熸垚鍛�"
+  },
+  "MAQ0058": {
+    "title": "鏈夋椂鍊欐垜鎬�鐤戣嚜宸辨槸鍚﹁兘鑳滀换褰撳墠宸ヤ綔"
+  },
+  "MAQ0059": {
+    "title": "褰撴垜鍦ㄥ伐浣滀腑鍙楀埌鍒汉鐨勮川鐤戞垨鎸戞垬鏃讹紝鎴戞�昏兘澶熼伩鍏嶇敤鍏呮弧鏁屾剰鐨勬柟寮忓幓鍥炲簲"
+  },
+  "MAQ0060": {
+    "title": "鍦ㄨ鍒汉璐ㄧ枒鎴栨寫鎴樻椂锛屾垜鎬绘槸鎶戝埗鑷繁鐨勭涓�鍙嶅簲锛屼互閬垮厤鎯呯华鍖栫殑鍙嶅簲"
+  },
+  "MAQ0061": {
+    "title": "鎴戜笉鎰挎剰鎺ュ彈鐙珛鍐崇瓥鎵�甯︽潵鐨勯闄�"
+  },
+  "MAQ0062": {
+    "title": "鎴戝緢鎰挎剰涓洪渶瑕佸府鍔╃殑浜烘彁渚涘府鍔�"
+  },
+  "MAQ0064": {
+    "title": "鐩告瘮浜庝富鍔ㄧ‘瀹氳嚜宸辩殑鍙戝睍闇�姹傦紝鎴戞洿渚濊禆浜庢垜鐨勭粍缁囨潵纭畾鎴戦渶瑕佸彂灞曞摢浜涜兘鍔涘拰鎶�鑳�"
+  },
+  "MAQ0065": {
+    "title": "鍦ㄦ姤鍛婂悇绫绘暟瀛楀拰璐㈠姟鏁版嵁鏃讹紝鎴戝姏姹傚噯纭�"
+  },
+  "MAQ0067": {
+    "title": "鎴戠粡甯镐細鎻愬嚭澶氱鏂规鏉ヨВ鍐虫煇涓棶棰�"
+  },
+  "MAQ0069": {
+    "title": "鍦ㄧ‘瀹氬伐浣滅殑浼樺厛绛夌骇鏃讹紝鎴戦�氬父浼氬皢鎴戜笉鍠滄鐨勫伐浣滃畨鎺掑埌鏈�鍚�"
+  },
+  "MAQ0070": {
+    "title": "鎴戠粡甯稿彂鐜版垜涓嶅緱涓嶆悂缃伐浣滈」鐩�"
+  },
+  "MAQ0071": {
+    "title": "鍦ㄥ紑濮嬩竴涓」鐩墠锛屾垜浼氬垪鍑烘墍鏈夐渶瑕佸畬鎴愮殑浠诲姟"
+  },
+  "MAQ0072": {
+    "title": "鎴戣寰楀緢闅惧拰閭d簺璐ㄧ枒鎴戣鐐圭殑鍥㈤槦鎴愬憳鐩稿"
+  },
+  "MAQ0073": {
+    "title": "鎴戠粡甯搁�氳繃澶栫晫鐨勫弽棣堝拰鑷垜鍙嶇渷鏉ユ繁鍏ユ�濊�冨浣曟彁鍗囪嚜宸辩殑鎶�鑳藉拰绔炰簤鍔�"
+  },
+  "MAQ0074": {
+    "title": "涓�鏃﹀洟闃熷仛鍑轰簡鍐冲畾锛屽嵆浣挎垜涓嶈禐鍚岋紝鎴戜篃浼氳窡鐫�鍥㈤槦鐨勫喅瀹氳蛋"
+  },
+  "MAQ0076": {
+    "title": "鍦ㄥ仛鍑哄洶闅剧殑鍐冲畾鏃讹紝鎴戝苟涓嶆�绘槸鑳藉閬靛惊缁勭粐鐨勪环鍊艰鍜岃鑼�"
+  },
+  "MAQ0077": {
+    "title": "褰撴垜鍦ㄥ伐浣滀腑鍙楀埌鎵硅瘎鏃讹紝鎴戝鏄撶敓姘旓紝澶卞幓鍐烽潤"
+  },
+  "MAQ0078": {
+    "title": "鎴戝彂鐜拌姳寰堝鏃堕棿鏉ユ鏌ユ暟鎹紝鍒嗘瀽闂鐨勬牴婧愭槸浠跺緢鏋嚗鐨勪簨"
+  },
+  "MAQ0079": {
+    "title": "褰撴垜鎯呯华婵�鍔ㄦ椂锛屽氨鏃犳硶娓呮櫚鍦版�濊��"
+  },
+  "MAQ0080": {
+    "title": "鎬绘湁浜轰細琚笂绾т换鍛藉幓棰嗗涓�涓」鐩紝鑰屾垜瑕佸仛鐨勬槸绛夌潃骞跺惉浠庝粬浠殑瀹夋帓"
+  },
+  "MAQ0081": {
+    "title": "鏈夋椂鍊欐垜寰堥毦闆嗕腑绮惧姏鍘诲畬鎴愯嚜宸变笉鍠滄鐨勪换鍔�"
+  },
+  "MAQ0082": {
+    "title": "鐢变簬鎰忔枡涔嬪鐨勫洶闅撅紝鏈夊嚑娆℃垜鍐冲畾鏀惧純鏌愪簺椤圭洰"
+  },
+  "MAQ0084": {
+    "title": "鎴戝父甯告槸鍥㈤槦涓涓�涓彂鐜板伐浣滀腑鐨勬敼杩涙満浼氱殑浜�"
+  },
+  "MAQ0085": {
+    "title": "鎴戝畾鏈熶簡瑙f墍鍦ㄥ洟闃熺殑鏈�鏂扮姸鍐碉紝浠ョ‘淇濇垜浠兘澶熷疄鐜板洟闃熺洰鏍�"
+  },
+  "MAQ0086": {
+    "title": "鎴戝彂鐜板緢闅鹃�傚簲璁″垝鐨勬敼鍙橈紝鍥犱负鎬绘槸浼氭湁鐩稿綋澶х殑骞叉壈"
+  },
+  "MAQ0087": {
+    "title": "鍦ㄧぞ浜よ仛浼氱殑鍦哄悎鎷涘緟濂藉垰璁よ瘑鐨勪汉瀵规垜鏉ヨ鏄欢瀹规槗鐨勪簨"
+  },
+  "MAQ0088": {
+    "title": "鎴戝伓灏斾細璁╁埆浜轰负鎴戠殑閿欒鍙楀埌璐e"
+  },
+  "MAQ0089": {
+    "title": "鎴戝苟涓嶈兘瀹屽叏鎺屾帶鑷繁鐨勫懡杩�"
+  },
+  "MAQ0090": {
+    "title": "鎴戣寰楁縺鍔变竴涓柊鐨勮�屼笖鎴愬憳鑳屾櫙澶氭牱鍖栫殑鍥㈤槦鏄尯鍥伴毦鐨勪簨"
+  },
+  "MAQ0091": {
+    "title": "宸ヤ綔涓婄殑鍘嬪姏浠庢潵閮戒笉浼氬奖鍝嶆垜鐨勭潯鐪犺川閲�"
+  },
+  "MAQ0092": {
+    "title": "鎴戝�惧悜浜庨伩鍏嶅弬鍔犺繃澶氱殑绀句氦鎴栦汉闄呬氦寰�娲诲姩"
+  },
+  "MAQ0094": {
+    "title": "鎴戝苟涓嶆�绘槸鐭ラ亾濡備綍涓庡垰璁よ瘑鐨勪汉鏀�璋�"
+  },
+  "MAQ0095": {
+    "title": "鎴戝枩娆㈠鍛樺伐杩涜鏂颁换鍔$殑鍩硅锛屽苟鍚戜粬浠В閲婁负浠�涔堣繖浜涘煿璁鍥㈤槦鎴愬氨鍜屽伐浣滅哗鏁堝緢閲嶈"
+  },
+  "MAQ0097": {
+    "title": "鍒汉缁忓父鑳藉鍦ㄥ洟闃熷伐浣滅殑鎴愭灉涓彂鐜版垜鎵�娌℃湁鍙戠幇鐨勯敊璇�"
+  },
+  "MAQ0098": {
+    "title": "鎴戝�惧悜浜庤姳璐规瘮鍏朵粬浜烘洿澶氱殑鏃堕棿鏉ユ帰绱㈡暟鎹紝浠ュ鎵炬綔鍦ㄧ殑闂鍘熷洜锛屼粠鑰屼骇鐢熸湁鐢ㄧ殑瑙佽В"
+  },
+  "MAQ0099": {
+    "title": "濡傛灉鎴戠殑鑰佹澘涓嶅湪韬竟锛屾垜鎰挎剰鑷繁鍋氶噸瑕佺殑鍐冲畾"
+  },
+  "MAQ0100": {
+    "title": "鎴戜笉鍠滄闇�瑕佸紑鍙戞柊鐨勮В鍐虫柟妗堢殑宸ヤ綔"
+  },
+  "MAQ0101": {
+    "title": "鍙湁鍦ㄥ拰鑰佹澘鍏呭垎鍟嗚浜嗚嚜宸辩殑鎯虫硶鍚庯紝鎴戞墠浼氬惎鍔ㄦ煇涓柊涓炬帾"
+  },
+  "MAQ0103": {
+    "title": "鎴戜細鍔姏鍦ㄦ埅姝㈡棩鏈熷墠瀹屾垚浠诲姟锛屽厬鐜板伐浣滀腑鐨勬壙璇猴紝濡傛湁蹇呰鍙互鐗虹壊涓汉鏃堕棿"
+  },
+  "MAQ0104": {
+    "title": "鏈夋椂鎴戜細鍙楁儏缁敮閰嶈�屾棤娉曟帶鍒惰嚜宸辩殑搴斿鏂瑰紡"
+  },
+  "MAQ0106": {
+    "title": "鎴戠粡甯搁�氳繃鍙傚姞鐮旇浼氥�佺綉缁滅爺璁ㄤ細鍜岄槄璇绘潵鏇存柊鑷繁鐨勪笓涓氬拰琛屼笟鐭ヨ瘑"
+  },
+  "MAQ0107": {
+    "title": "鎴戝浜庣涓�鍗拌薄涓嶅ソ鐨勪汉涓嶅お鏈夎�愬績鍜岀ぜ璨�"
+  },
+  "MAQ0110": {
+    "title": "浜轰滑缁忓父鏉ユ壘鎴戣璁轰粬浠殑闂鎴栬嫤鎭�"
+  },
+  "MAQ0111": {
+    "title": "鎴戠粡甯稿府鍔╁埆浜烘洿濂藉湴鐞嗚В鍜屽鐞嗕粬浠嚜宸辩殑璐熼潰鎯呯华"
+  },
+  "MAQ0112": {
+    "title": "鎴戠殑鍚屼簨浠兘澶熷緢瀹规槗鐪嬪嚭鎴戠殑鎯呯华鐘舵��"
+  },
+  "MAQ0113": {
+    "title": "鎴戝苟涓嶆槸鎬绘湁鏃堕棿妫�鏌ユ垜鐨勫伐浣滐紝骞剁浉淇′笉妫�鏌ヤ篃闂涓嶅ぇ"
+  },
+  "MAQ0115": {
+    "title": "褰撴柊鐨勫伐浣滄祦绋嬫垨鎶�鏈寮曞叆鏃讹紝鎴戦�氬父鏄渶鏃╂帴鍙楀苟閲囩敤瀹冪殑浜�"
+  },
+  "MAQ0117": {
+    "title": "鍗充娇闈复楂樺帇鐨勫伐浣滐紝鎴戜篃浼氫繚鎸佷箰瑙傜殑鏈熸湜"
+  },
+  "MAQ0118": {
+    "title": "鏈夋椂鎴戜細寰堥毦鐞嗚В鑷繁鐨勬儏缁弽搴�"
+  },
+  "MAQ0119": {
+    "title": "鍦ㄥ伐浣滀腑锛屾垜缁忓父璁剧珛鏈夋寫鎴樻�х殑鐩爣锛岀劧鍚庡姫鍔涘疄鐜扮洰鏍�"
+  },
+  "MAQ0120": {
+    "title": "鎴戦潪甯告姷瑙﹂偅浜涗笉寰椾笉鍘诲弬鍔犵殑绀句氦娲诲姩锛岃涓洪偅浼氬緢蹇冪疮"
+  },
+  "MAQ0124": {
+    "title": "鎴戞�绘槸鐭ラ亾鑷繁鐨勬儏缁劅鍙椾互鍙婂師鍥�"
+  },
+  "MAQ0126": {
+    "title": "鎴戞洿鍠滄涓嶇揣涓嶆參锛屼粠瀹逛笉杩殑宸ヤ綔鑺傚锛岃�屼笉鍠滄缁忓父闇�瑕佸悓鏃跺畬鎴愬涓换鍔$殑宸ヤ綔鑺傚"
+  },
+  "MAQ0127": {
+    "title": "褰撴垜鎰忚瘑鍒版湁浜哄湪璇勪及鎴戠殑琛ㄧ幇鏃讹紝鎴戜細鍙樺緱姣斿埆浜烘洿鐒﹁檻"
+  },
+  "MAQ0129": {
+    "title": "褰撴垜涓嶅緱涓嶆寜鐓т换鍔$殑杞婚噸缂撴�ョ殑娆″簭鏉ュ伐浣滄椂锛屾垜浼氭湁涓�绉嶅彈闄愬埗鐨勬劅瑙�"
+  },
+  "MAQ0130": {
+    "title": "鎴戞湁鏃朵細鎰熷埌杩囧害鍔崇疮锛屼絾鏄垜濮嬬粓鐩镐俊鑷繁鏈夎冻澶熺殑绮惧姏鏉ュ畬鎴愭墍鏈夊伐浣滀换鍔�"
+  },
+  "MAQ0131": {
+    "title": "涓庝富鍔ㄦ壙鎷呯浉姣旓紝鎴戞洿鍠滄琚笂绾ц姹傚幓鎵挎媴鏌愰」浠诲姟鎴栧姞鍏ユ垨棰嗗涓�涓」鐩洟闃�"
+  },
+  "MAQ0132": {
+    "title": "浜轰滑閬囧埌鍥伴毦鏃堕�氬父浼氬埌鎴戣繖閲屾潵瀵绘眰鎯呮劅鏀寔"
+  },
+  "MAQ0133": {
+    "title": "鎴戝苟涓嶆�绘槸鑳藉璇氬疄鍦伴潰瀵硅嚜宸�"
+  },
+  "MAQ0134": {
+    "title": "鎴戞瘮杈冩搮闀垮畨鎱版伯涓ф垨鐢熸皵鐨勫悓浜嬶紝骞惰鍏跺喎闈欎笅鏉�"
+  },
+  "MAQ0135": {
+    "title": "鎴戣鐪熷�惧惉锛屼互姝ゆ潵浜嗚В鍒汉鐨勬劅鍙楀拰闇�姹�"
+  },
+  "MAQ0136": {
+    "title": "鎴戞湁鏃朵负浜嗚揪鎴愮洰鏍囦細瀵规斂绛栧拰瑙勫畾浣滅伒娲荤殑澶勭悊"
+  },
+  "MAQ0138": {
+    "title": "鎴戞洿鍠滄鍙娴嬬殑銆佹寜閮ㄥ氨鐝殑鏃ュ父宸ヤ綔"
+  },
+  "MAQ0140": {
+    "title": "鎴戝枩娆㈤偅绉嶄笂鍙稿鎴戝厖鍒嗘巿鏉冿紝璁╂垜鑳借嚜涓诲喅绛栫殑宸ヤ綔鐜"
+  },
+  "MAQ0141": {
+    "title": "鎴戞瘮鑷繁璁よ瘑鐨勫ぇ澶氭暟浜洪兘鏇村姞鍧氭寔鏄潪鍘熷垯"
+  },
+  "MAQ0142": {
+    "title": "鎴戝鍙備笌鍏泭浜嬩笟(蹇楁効娲诲姩)涓嶅お鎰熷叴瓒�"
+  },
+  "MAQ0143": {
+    "title": "鎴戜笉鍠滄鍒嗘瀽鍋囨兂浼氬彂鐢熺殑鎯呭鎴栫悊璁烘ā鍨�"
+  },
+  "MAQ0144": {
+    "title": "鍒濇涓庝汉瑙侀潰鏃讹紝鎴戞瘮杈冩矇榛樺瑷�锛屽父甯哥瓑寰呭鏂逛富鍔ㄥ紑鍙d氦璋�"
+  },
+  "MAQ0145": {
+    "title": "鎴戞湁鏃朵細鍋氬嚭涓�浜涜鎴戜簨鍚庢劅鍒板悗鎮旂殑鍐冲畾"
+  },
+  "MAQ0146": {
+    "title": "鏈夋椂鍊欙紝鎴戝緢闅剧悊瑙e埆浜虹殑鎯呯华鍙嶅簲"
+  },
+  "MAQ0147": {
+    "title": "鎴戞洿鍠滄閬靛惊宸茬粡瀹屽杽浜嗙殑宸ヤ綔娴佺▼锛岃�屼笉鏄�冭檻鏂版柟娉�"
+  },
+  "MAQ0149": {
+    "title": "鍦ㄤ汉闄呬氦寰�涓紝鎴戝父甯稿仛涓嶅埌鎹綅鎬濊��"
+  },
+  "MAQ0150": {
+    "title": "鎴戣寰楀ソ鍍忓叾浠栦汉姣旀垜鏇磋兘鎶曞叆鏇村绮惧姏鍘诲畬鎴愬伐浣滀换鍔�"
+  },
+  "MAQ0151": {
+    "title": "鎴戝枩娆㈡暣鐞嗗拰鍙戣〃鍏锋湁浠や汉淇℃湇鐨勭悊鐢辩殑婕旇锛屼互姝ゆ潵璇存湇鍏朵粬浜�"
+  },
+  "MAQ0152": {
+    "title": "鎴戜笉鍠滄濮嬬粓蹇妭濂忓湴宸ヤ綔"
+  },
+  "MAQ0156": {
+    "title": "褰撴垜鏈兘瀹炵幇宸ヤ綔涓殑涓�涓噸瑕佺洰鏍囨椂锛屾垜寰堝揩灏变細鎭㈠杩囨潵锛岄噸鏂颁笓娉ㄤ簬濡備綍杈炬垚鐩爣"
+  },
+  "MAQ0157": {
+    "title": "鎴戜笉鎰挎剰鏀瑰彉鎴戞棦鏈夌殑宸ヤ綔鏂瑰紡"
+  },
+  "MAQ0158": {
+    "title": "鎴戝枩娆笉鏂彉鍖栵紝鑰屼笉鏄ǔ瀹�"
+  },
+  "MAQ0159": {
+    "title": "褰撴垜鍦ㄥ伐浣滀腑寰楀埌璐熼潰鍙嶉鏃讹紝鎴戜篃浠庝笉鎬�鐤戣嚜宸卞伐浣滅殑鑳藉姏"
+  },
+  "MAQ0160": {
+    "title": "鎴戜竴鐩存湁寮虹儓鐨勬剰鎰垮幓棰嗗鍜屾寚鎸ヤ竴缇や汉"
+  },
+  "MAQ0161": {
+    "title": "闈㈠涓�涓殰纰嶆垨鍥伴毦锛屾垜浼氫笉鍋滃湴鍔姏鍘诲厠鏈嶅畠锛岀洿鍒版垚鍔�"
+  },
+  "MAQ0162": {
+    "title": "鍦ㄥ伐浣滈」鐩殑璁″垝闃舵锛屾垜鎬绘槸纭璇ラ」鐩殑鍒╃泭鏀稿叧鏂瑰苟纭繚浠栦滑瀵硅椤圭洰鐨勬壙璇�"
+  },
+  "MAQ0163": {
+    "title": "鏈夋椂鎴戜細鍙楀埌鎯呯华鐨勫奖鍝嶏紝鍋氬嚭涓�浜涜鑷繁鍚庢倲鐨勫喅瀹�"
+  },
+  "MAQ0164": {
+    "title": "鎴戞�绘槸鐭ラ亾鏄粈涔堝奖鍝嶄簡鎴戠殑鎯呯华"
+  },
+  "MAQ0165": {
+    "title": "褰撳埆浜哄悜鎴戞姳鎬ㄤ粬浠湪宸ヤ綔涓婃垨鐢熸椿涓鍒扮殑闂鏃讹紝鎴戝父甯告棤娉曟劅鍚岃韩鍙�"
+  },
+  "MAQ0166": {
+    "title": "瀵逛簬鎴戞潵璇达紝璇存湇鍒汉鏄欢瀹规槗鐨勪簨"
+  },
+  "MAQ0167": {
+    "title": "鏈夋椂鎴戝彂鐜板伐浣滀笂鐨勬媴蹇ф垨闂浼氬鎴戠殑涓汉鐢熸椿浜х敓璐熼潰褰卞搷"
+  },
+  "MAQ0168": {
+    "title": "鎴戞浘缁忓湪娌℃湁鐪熺殑鐢熺梾鐨勬儏鍐典笅锛屽悜鍏徃鎴栧鏍¤杩囩梾鍋�"
+  },
+  "MAQ0169": {
+    "title": "鎴戞湁鏃朵細鎸夌収鑷繁鐨勫叴瓒h�屼笉鏄换鍔$殑杞婚噸缂撴�ユ潵鍐冲畾鑷繁鐨勫伐浣滈『搴�"
+  },
+  "MAQ0170": {
+    "title": "宸ヤ綔璁╂垜鍏呮弧娲诲姏锛� 浠ヨ嚦浜庢垜鍙戠幇鑷繁甯稿父娌夋蹈鍦ㄥ伐浣滀腑锛岃繃浜嗙潯瑙夌殑鐐归兘涓嶇煡閬�"
+  },
+  "MAQ0171": {
+    "title": "鎴戣寰楀彉鍖栨槸闈炲父浠や汉鍏村鐨勶紝灏界瀵瑰叾浠栦汉鏉ヨ鍙兘寰堥毦"
+  },
+  "MAQ0172": {
+    "title": "鎴戞搮闀挎敼鍙樺埆浜虹殑瑙傜偣鍜岀湅娉�"
+  },
+  "MAQ0173": {
+    "title": "鎴戝苟涓嶆槸鎬昏兘鍋氬埌瑷�琛屼竴鑷�"
+  },
+  "MAQ0174": {
+    "title": "鏈夋椂鎴戝彂鐜版敼鍙樺埆浜虹殑瑙傜偣鍜岀湅娉曞緢闅�"
+  },
+  "MAQ0175": {
+    "title": "褰撻亣鍒拌嚜宸变笉鍠滄鎴栨瘮杈冨洶闅剧殑浠诲姟鏃讹紝鎴戦�氬父浼氭嫋寤朵竴娈垫椂闂村啀寮�濮�"
+  },
+  "MAQ0176": {
+    "title": "鎴戝枩娆笌鍏朵粬鍥㈤槦鎴愬憳杩涜鍗忎綔锛屼互閬垮厤閲嶅鎴栨棤鏁堢殑宸ヤ綔"
+  },
+  "MAQ0178": {
+    "title": "鎴戞�绘槸鎸夋椂瀹屾垚宸ヤ綔浠诲姟"
+  },
+  "MAQ0179": {
+    "title": "鎴戠涓�娆¤鍒板埆浜烘椂灏卞彲浠ュ緢瀹规槗鍦拌鎳備粬浠紝浣嗘槸涓嶇绗竴鍗拌薄濡備綍锛屾垜閮戒細淇濇寔绀艰矊鍜屽懆鍒�"
+  },
+  "MAQ0180": {
+    "title": "鎴戠粡甯告槸绗竴涓嚜鎰块瀵兼垨鍔犲叆椤圭洰鍥㈤槦鐨勪汉"
+  },
+  "MAQ0181": {
+    "title": "褰撴墜澶存鍦ㄥ仛鐨勯」鐩嚭鐜版剰澶栫殑鍥伴毦鏃讹紝鎴戝彂鐜版湁鏃舵垜浼氬仠涓嬫潵锛岃浆鑰屽仛鍏跺畠椤圭洰"
+  },
+  "MAQ0182": {
+    "title": "鎴戜細瀹氭湡鍚戞垜鐨勫洟闃熸垚鍛樻彁渚涘弽棣堬紝浠ュ府鍔╀粬浠釜浜哄彂灞曞苟瀹炵幇鑱屼笟鐩爣"
+  },
+  "MAQ0183": {
+    "title": "鎴戝枩娆㈢珛鍗冲紑濮嬪鐞嗗洶闅剧殑浠诲姟锛岃�屼笉鏄嫋寤�"
+  },
+  "MAQ0184": {
+    "title": "鍦ㄥ紑浼氭椂鎴戞�绘槸涓撴敞浜庝富棰橈紝涓庝粬浜轰簰鍔紝骞朵笓蹇冨湴鍊惧惉浠栦汉鐨勫彂瑷�"
+  },
+  "MAQ0185": {
+    "title": "鎴戜笉鍠滄涓鸿嚜宸辨垨鍥㈤槦璁剧珛鎸戞垬鎬х殑鐩爣锛屽苟涓嶅緱涓嶈姳棰濆鐨勬椂闂村幓杈炬垚杩欎簺鐩爣"
+  },
+  "MAQ0187": {
+    "title": "鐩告瘮涓庝粬浜哄悎浣滐紝鎴戞洿鎰挎剰鑷繁涓�浜哄畬鎴愬伐浣滀换鍔�"
+  },
+  "MAQ0190": {
+    "title": "姣忔寮�濮嬫柊宸ヤ綔鎴栨柊椤圭洰鏃讹紝鎴戦�氬父浼氬厖婊′俊蹇�"
+  },
+  "MAQ0191": {
+    "title": "鎴戝彂鐜颁富鍔ㄤ笌鍒氳璇嗙殑浜烘攢璋堟槸瀹规槗鐨勪簨"
+  },
+  "MAQ0192": {
+    "title": "鎴戞効鎰忚嚜宸卞仛鍐冲畾骞舵帴鍙楃浉搴旂殑鍚庢灉"
+  },
+  "MAQ0193": {
+    "title": "鎴戝伓灏斿洜涓哄繀椤诲畬鎴愬叾浠栭噸瑕佺殑浜嬫儏鑰屾病鏈夋寜鏃跺畬鎴愬伐浣滀换鍔�"
+  },
+  "MAQ0194": {
+    "title": "鍙鎰挎剰锛屾垜鍙互杞绘澗鍦颁笌浠讳綍浜轰氦鏈嬪弸"
+  },
+  "MAQ0195": {
+    "title": "鎴戝枩娆㈠澶嶆潅鏂规鐨勫埄寮婅繘琛屽叏闈㈢殑鍒嗘瀽"
+  },
+  "MAQ0197": {
+    "title": "鎴戜笉浼氬皾璇曡嚜宸卞幓鎻愬嚭鏂版兂娉曪紝鑰屾槸甯屾湜鎶婃绫讳簨鎯呰缁欏姝ゆ劅鍏磋叮鐨勪汉鍘诲仛"
+  },
+  "MAQ0199": {
+    "title": "鎴戞�绘槸鑳藉緢蹇兂鍑鸿鏈嶅埆浜虹殑鏈�浣虫柟娉�"
+  },
+  "MAQ0200": {
+    "title": "鎴戜笉浼氳鎸姌鎴栧け鏈涘鎴戠殑宸ヤ綔琛ㄧ幇浜х敓璐熼潰褰卞搷"
+  },
+  "MAQ0201": {
+    "title": "褰撴垜鍦ㄥ伐浣滀腑閬亣鎸姌鎴栧け璐ユ椂锛屾垜闇�瑕佽緝闀挎椂闂存墠鑳藉畬鍏ㄦ仮澶嶈嚜淇�"
+  },
+  "MAQ0202": {
+    "title": "瀵逛簬鎴戜笉鍠滄鐨勪汉锛屾垜鏃犳硶鎬绘槸淇濇寔绀艰矊鍜屾伃鏁�"
+  },
+  "MAQ0203": {
+    "title": "澶у鏁颁汉鏈�缁堥兘浼氬悓鎰忔垜鐨勮鐐�"
+  },
+  "MAQ0204": {
+    "title": "濡傛灉鎴戣涓哄垰璁よ瘑鐨勪汉瀵规垜涓嶇ぜ璨岋紝涔熶笉灏婇噸鎴戯紝閭f垜涔熶笉浼氬浠栦滑鏈夌ぜ璨屾垨灏婇噸"
+  },
+  "MAQ0205": {
+    "title": "鍦ㄨ繘琛屾煇涓」鐩椂锛屾垜浼氬畾鏈熺洃鎺ч」鐩噸瑕佽妭鐐圭殑瀹屾垚杩涘害锛屽苟璺熻繘璐熻矗鍚勪釜鍏蜂綋妯″潡鐨勫洟闃熸垚鍛�"
+  },
+  "MAQ0206": {
+    "title": "鍦ㄥ拰浠栦汉璋堝垽鐨勬椂鍊欙紝鎴戝伓灏斾細瑙夊緱缂轰箯鑷俊"
+  },
+  "MAQ0207": {
+    "title": "鏈夋椂鎴戝緢闅捐鏈嶅埆浜烘帴鍙楁垜鐨勫缓璁�"
+  },
+  "MAQ0208": {
+    "title": "鍗充娇涓嶆儏鎰匡紝鎴戜篃浼氶潪甯镐粩缁嗗湴妫�鏌ュ摢鎬曟渶灏忕殑缁嗚妭"
+  },
+  "MAQ0209": {
+    "title": "浠栦汉璁や负鎴戣兘鍔涗竴鑸�"
+  },
+  "MAQ0210": {
+    "title": "鎴戜笉鍠滄鍩硅鍥㈤槦涓殑鏂板憳宸ヤ互纭繚浠栦滑鍋氫簨鏂瑰紡鏄纭殑"
+  },
+  "MAQ0211": {
+    "title": "濡傛灉闇�瑕佺殑璇濓紝鎴戞�昏兘鎵惧埌鏇村鐨勬椂闂存潵瀹屾垚宸ヤ綔"
+  },
+  "MAQ0212": {
+    "title": "涓庢垜鐨勫悓浜嬬浉姣旓紝鎴戜笉澶枩娆㈡敹闆嗗拰鍒嗘瀽鏁版嵁銆�"
+  },
+  "MAQ0213": {
+    "title": "鎴戠‘淇濆厬鐜版墍鏈夊伐浣滀笂鐨勬壙璇猴紝鍥犱负杩欏鎴戣�岃█鏄竴涓弗鑲冦�佺鍦g殑鍘熷垯"
+  },
+  "MAQ0214": {
+    "title": "鍚屼簨浠粡甯告潵璇锋暀鎴戝簲璇ュ浣曞拰鍒汉娌熼�氭晱鎰熻瘽棰�"
+  },
+  "MAQ0216": {
+    "title": "灏界鏈夋椂鍙兘涓嶆柟渚匡紝浣嗘垜濮嬬粓閬靛畧鏀跨瓥鍜岃瀹�"
+  },
+  "MAQ0218": {
+    "title": "瀵逛簬閭d簺鎴戣涓烘瘮杈冨洶闅炬垨鑰呮垚鍔熷彲鑳芥�т笉楂樼殑椤圭洰锛屾垜缁忓父鎷栧欢鏃堕棿锛岃�屼笉绔嬪嵆鍚姩"
+  },
+  "MAQ0219": {
+    "title": "鎴戜粠鏈洜宸ヤ綔涓婄殑澶辫触鑰岀伆蹇�"
+  },
+  "MAQ0220": {
+    "title": "褰撴垜鐨勫伐浣滆礋鑽峰鍔犳椂锛屾湁鏃舵垜浼氭劅鍒板け鍘昏�愬績銆佸績鐑︽剰涔�"
+  },
+  "MAQ0221": {
+    "title": "鎴戝缁堢‘淇濇仾瀹堟垜鎵�鏈夌殑鑱屼笟鎵胯骞朵俊瀹堣瑷�"
+  },
+  "MAQ0223": {
+    "title": "鎴戞洿鍠滄閭d簺鍙互鍏呭垎鍙戞尌鍒涢�犳�х殑宸ヤ綔"
+  },
+  "MAQ0224": {
+    "title": "鏈夋椂鍊欏伐浣滀腑鐨勫け鏈涘拰澶辫触浼氫娇鎴戝ソ鍑犲ぉ閮芥棤娉曢泦涓敞鎰忓姏"
+  },
+  "MAQ0225": {
+    "title": "鎴戜笉鍠滄涓嶆柇鍦拌鏈嶅埆浜烘帴鍙楁垜鐨勫缓璁�"
+  },
+  "MAQ0226": {
+    "title": "鎴戝湪鍚屼簨涓湁鑳藉渾铻嶅湴鍜岄毦鐩稿鐨勪汉鎵撲氦閬撶殑鍚嶅0"
+  },
+  "MAQ0227": {
+    "title": "鎴戠粡甯稿鐞嗗緢澶氫笉鍚岀殑椤圭洰銆佹兂娉曟垨鑰呰璁猴紝鎴戝彂鐜拌繖璁╀汉绮剧鎸"
+  },
+  "MAQ0228": {
+    "title": "褰撲簨鎯呮病鏈夋寜鐓ф垜鐨勯鎯冲彂灞曟椂锛屾垜浼氬彉寰楁伯涓�"
+  },
+  "MAQ0229": {
+    "title": "鎴戝枩娆㈠弬鍔犲晢涓氱ぞ浜ゆ椿鍔�"
+  },
+  "MAQ0230": {
+    "title": "鏈夋椂鎴戝浜よ皥瀵硅薄鐨勬枃鍖栬儗鏅�佷範淇椼�佸拰绂佸繉涓嶅鏁忔劅"
+  },
+  "MAQ0231": {
+    "title": "鍦ㄧぞ浜や簰鍔ㄤ腑锛屾垜閫氬父瀵瑰埆浜虹殑闇�姹備笉澶熸晱鎰�"
+  },
+  "MAQ0232": {
+    "title": "鎴戝浠栦汉鐨勭涓�鍗拌薄閫氬父鏄噯纭殑"
+  },
+  "MAQ0233": {
+    "title": "鎴戦�氬父鑳藉湪宸ヤ綔涓帶鍒跺ソ鑷繁鐨勬儏缁�"
+  },
+  "MAQ0234": {
+    "title": "褰撴垜鍦ㄦ煇涓伐浣滈」鐩腑纰板埌鍥伴毦鏃讹紝鎴戞湁鏃朵細涓璇ラ」鐩紝杞�屽幓鍋氬叾瀹冮」鐩�"
+  },
+  "MAQ0235": {
+    "title": "鍦ㄦ垜鐨勭敓娲诲拰鑱屼笟涓紝鎴戞�绘槸鐭ラ亾鑷繁鎯宠浠�涔�"
+  },
+  "MAQ0236": {
+    "title": "鍜屾柊璁よ瘑鐨勪汉锛屾垜浠庝笉浼氭劅鍒版病璇濆彲璇�"
+  },
+  "MAQ0237": {
+    "title": "鍗充娇鍥㈤槦涓殑澶ч儴鍒嗘垚鍛樿窡鎴戠殑鎰忚/鐪嬫硶鐩稿乏锛屾垜閫氬父涔熶笉鎰挎剰鏀惧純鑷繁鐨勬剰瑙�/鐪嬫硶锛岃窡澶т紮鍎胯揪鎴愪竴鑷淬��"
+  },
+  "MAQ0240": {
+    "title": "濡傛灉鎴戝拰鍏朵粬浜哄悎浣滀竴椤逛换鍔★紝鎴戜細绛夌潃浠栦滑鏉ユ壘鎴戝崗璋冨伐浣�"
+  },
+  "MAQ0241": {
+    "title": "鎴戝皬鏃跺�欐浘缁忔嬁杩囨湰涓嶅睘浜庤嚜宸辩殑涓滆タ"
+  },
+  "MAQ0242": {
+    "title": "鍦ㄥ緱鍒拌�佹澘鐨勬槑纭寚绀哄墠锛屾垜閫氬父涓嶄細閲囧彇琛屽姩"
+  },
+  "MAQ0243": {
+    "title": "鎴戝父甯稿湪涓嬪睘鐨勫伐浣滄姤鍛婁腑鍙戠幇閿欒"
+  },
+  "MAQ0244": {
+    "title": "鎴戜粠鏈繚鍙嶈繃浜ら�氳鍒�"
+  },
+  "MAQ0245": {
+    "title": "鎴戝湪鍥㈤槦涓粡甯告槸鍕囦簬鎸戞垬鍥㈤槦宸ヤ綔璁炬兂鍜屾柟鍚戠殑浜�"
+  },
+  "MAQ0247": {
+    "title": "鍦ㄥ伐浣滈」鐩紑濮嬩箣鍓嶏紝鎴戜細鍜屽洟闃熸垚鍛樺厛寮�浼氬崗璋冿紝鍋氬ソ椤圭洰璁″垝"
+  },
+  "MAQ0248": {
+    "title": "鎴戜笉鎬庝箞鑺辨椂闂翠笌涓嬪睘璁ㄨ浠栦滑鐨勮亴涓氬彂灞曠洰鏍囨垨杩涘睍"
+  },
+  "MAQ0249": {
+    "title": "鎴戜粠涓嶆祻瑙堜笉濂界殑缃戠珯"
+  },
+  "MAQ0250": {
+    "title": "鎴戞湁鏃朵細闂茶亰鍒汉鐨勫闀块噷鐭�"
+  },
+  "MAQ0251": {
+    "title": "鏈璇烽�夆�滃悓鎰忊��"
+  },
+  "MAQ0252": {
+    "title": "鏈璇烽�夆�滈潪甯镐笉鍚屾剰鈥�"
+  }
+}
\ No newline at end of file
diff --git a/data/test_data.json b/data/test_data.json
index 54c4411..9370051 100644
--- a/data/test_data.json
+++ b/data/test_data.json
@@ -1,4 +1,602 @@
 {
+  "question": {
+    "MAQ": {
+      "MAQ0001": {
+        "title": "鎴戜笉鍠滄鑺辨椂闂存鏌ュ皬缁嗚妭鐨勫噯纭��"
+      },
+      "MAQ0003": {
+        "title": "鎴戜粠涓嶈璋庯紝鐢氳嚦杩炲皬璋庨兘娌℃湁璇磋繃"
+      },
+      "MAQ0004": {
+        "title": "褰撴垜鍋氫竴涓」鐩椂锛屾垜浼氬叏鍔涗互璧达紝鐩村埌瀹屾垚涓烘"
+      },
+      "MAQ0005": {
+        "title": "鎴戝�惧悜浜庝娇鐢ㄥ父瑙勬柟娉曪紝鑰屼笉鏄偅浜涗粠鏈皾璇曡繃鐨勬柟娉�"
+      },
+      "MAQ0006": {
+        "title": "褰撴垜涓嶅緱涓嶅幓璐熻矗涓�涓洟闃熺殑鏃跺�欙紝鎴戜細鎰熻鎴樺參銆佹亹鎯�"
+      },
+      "MAQ0007": {
+        "title": "鎴戞湁鏃跺洜涓哄悇绉嶅共鎵板洜绱狅紝鏈兘鎸夋椂瀹屾垚宸ヤ綔浠诲姟"
+      },
+      "MAQ0009": {
+        "title": "鎴戣兘澶熸帶鍒惰嚜宸辩殑鎯呯华鐘舵�侊紝浣垮叾浠栦汉涓嶅お瀹规槗鐭ラ亾鎴戝唴蹇冪殑鎰熷彈"
+      },
+      "MAQ0010": {
+        "title": "鎴戞敮鎸佹墍鍦ㄧ粍缁囩殑浠峰�艰鍜岃鑼冿紝骞朵簡瑙e叾閲嶈鎬�"
+      },
+      "MAQ0011": {
+        "title": "鎴戜笉浼氬洜澶辫触鎴栨尗鎶樿�屾硠姘�"
+      },
+      "MAQ0013": {
+        "title": "鎴戜粠鏉ユ病鏈夊湪琛椾笂涔辨墧鍨冨溇"
+      },
+      "MAQ0014": {
+        "title": "鏈夋椂鎴戝彂鐜拌鍒汉鍚粠鎴戠殑鎸囩ず鏄欢寰堝洶闅剧殑浜�"
+      },
+      "MAQ0015": {
+        "title": "蹇呰鏃讹紝鎴戣兘寰堝鏄撳湴闀挎椂闂村畬鍏ㄤ笓娉ㄤ簬閲嶈鐨勫伐浣滈」鐩�"
+      },
+      "MAQ0019": {
+        "title": "鍦ㄩ」鐩伃鍙楅噸澶ф尗鎶樹箣鍚庯紝鎴戝苟涓嶆槸鎬昏兘婵�鍙戝洟闃熺殑鏂楀織"
+      },
+      "MAQ0020": {
+        "title": "鎴戜粠鏈湪鑳屽悗璇磋繃鏈嬪弸鐨勫潖璇�"
+      },
+      "MAQ0021": {
+        "title": "鎴戝枩娆㈡牴鎹洿瑙夋潵瑙e喅闂锛岃�屼笉鏄姳杈冮暱鏃堕棿杩涜绯荤粺鐨勫垎鏋�"
+      },
+      "MAQ0024": {
+        "title": "鏀跨瓥鍜岃瀹氭�荤殑鏉ヨ鍙槸鎸囧鎬ф剰瑙侊紝鍦ㄦ柟渚挎椂搴斿綋閬靛畧锛屽湪涓嶆柟渚挎椂鍙互鐏垫椿澶勭悊"
+      },
+      "MAQ0025": {
+        "title": "闈㈠宸ヤ綔鐜鐨勫彉鍖栵紝鎴戝緢涔愭剰灏濊瘯鏂扮殑宸ヤ綔鏂瑰紡"
+      },
+      "MAQ0026": {
+        "title": "鎴戝枩娆㈡悳瀵诲拰鐮旂┒鏁版嵁锛岀湅鐪嬫暟鎹兘缁欏嚭鎬庢牱鐨勬柟鍚戙��"
+      },
+      "MAQ0027": {
+        "title": "褰撴垜鐪嬪埌鍏朵粬鍥㈤槦鎴愬憳闇�瑕佸府鍔╂椂锛屾垜浼氳皟鏁存垜鐨勫伐浣滄棩绋嬶紝鑵惧嚭鏃堕棿鏉ュ府鍔╀粬浠�"
+      },
+      "MAQ0028": {
+        "title": "鍦ㄥ紑浼氭椂锛屾垜鏈夋椂浼氳鑷繁鎴栦粬浜虹殑璐熼潰鎯呯华鎵�骞叉壈"
+      },
+      "MAQ0029": {
+        "title": "鎴戠粡甯告槸鍥㈤槦涓涓�涓彁鍑鸿鍔ㄦ柟妗堢殑"
+      },
+      "MAQ0030": {
+        "title": "鎴戜富鍔ㄥ弬涓庢垨棰嗗鍒汉涓嶆効鎰忔壙鎷呯殑宸ヤ綔椤圭洰"
+      },
+      "MAQ0034": {
+        "title": "鎴戠粡甯稿悜鎴戠殑鍚屼簨鍜屼笅灞炲己璋冿紝鎴戜滑鎵�鍋氱殑鎵�鏈夊喅绛栭兘蹇呴』绗﹀悎缁勭粐鐨勪环鍊艰鍜岃鑼�"
+      },
+      "MAQ0035": {
+        "title": "鏈夋椂鍒汉鐨勮礋闈㈡儏缁細褰卞搷鎴戣嚜宸辩殑鎯呯华"
+      },
+      "MAQ0036": {
+        "title": "鎴戠粡甯稿垱閫犳�у湴鎶婂埆浜虹殑涓嶅悓鎯虫硶缁撳悎璧锋潵锛屽苟鎵惧埌鏈夋晥鐨勯棶棰樿В鍐冲姙娉�"
+      },
+      "MAQ0038": {
+        "title": "鎴戞浘缁忓埄鐢ㄨ繃鍏朵粬浜�"
+      },
+      "MAQ0039": {
+        "title": "鎴戝枩娆㈠垎鏋愬鏉傜殑姒傚康骞跺彂鐜板畠浠箣闂寸殑閫昏緫鑱旂郴"
+      },
+      "MAQ0040": {
+        "title": "鎴戝緢浜彈浠旂粏妫�鏌ュ皬缁嗚妭鐨勮繃绋�"
+      },
+      "MAQ0041": {
+        "title": "鑷緥瀵规垜鏉ヨ寰堝鏄撳仛鍒�"
+      },
+      "MAQ0042": {
+        "title": "寮�濮嬪仛浠讳綍椤圭洰鍓嶏紝鎴戦兘浼氶鍏堟⒊鐞嗕换鍔$殑杞婚噸缂撴�ュ拰鎴鏃ユ湡"
+      },
+      "MAQ0044": {
+        "title": "鍗充娇鍦ㄥ緢蹇欑殑鏃跺�欙紝濡傛灉鎴戠煡閬撴垜鏄煇椤瑰伐浣滅殑鏈�浣充汉閫夛紝鎴戜篃浼氳嚜鎰垮幓鎵挎媴杩欎簺棰濆鐨勫伐浣�"
+      },
+      "MAQ0045": {
+        "title": "宸ヤ綔涓婇伃閬囧け璐ユ垨鎸姌鏃讹紝鎴戜細寮�濮嬫��鐤戣嚜宸�"
+      },
+      "MAQ0046": {
+        "title": "鎴戞病鏈変粩缁嗘牎瀵硅嚜宸辩殑宸ヤ綔鎴栨姤鍛婄殑涔犳儻"
+      },
+      "MAQ0047": {
+        "title": "鎴戞湁鏃跺仛浜嬮渶瑕佸埆浜烘彁閱掓墠鑳芥寜鏃跺畬鎴�"
+      },
+      "MAQ0048": {
+        "title": "鎴戝緢涔愭剰鎷呬换棰嗗鐨勮鑹�"
+      },
+      "MAQ0049": {
+        "title": "褰撴垜鐨勪笂鍙镐笉鍦ㄧ殑鏃跺�欙紝鎴戜笉鍠滄鑷繁鍋氬伐浣滀笂鐨勫喅绛�"
+      },
+      "MAQ0051": {
+        "title": "鍦ㄥ伐浣滀腑锛屾垜娌℃湁涓哄疄鐜扮洰鏍囪�屽姫鍔涘苟鑾峰緱鎴愬氨鍜岃鍙殑鍔ㄥ姏"
+      },
+      "MAQ0053": {
+        "title": "濡傛灉鑳介�夋嫨锛屾垜鏇村枩娆簨鍏堣鍒掑ソ鐨勪緥琛屾椿鍔紝鑰屼笉鍠滄鍘婚�傚簲鍚勭涓嶇‘瀹氭��"
+      },
+      "MAQ0055": {
+        "title": "褰撴墜澶存湁鍏跺畠宸ヤ綔瑕佸仛鏃讹紝鎴戜笉澶効鎰忓府鍔╁洟闃熸垚鍛�"
+      },
+      "MAQ0058": {
+        "title": "鏈夋椂鍊欐垜鎬�鐤戣嚜宸辨槸鍚﹁兘鑳滀换褰撳墠宸ヤ綔"
+      },
+      "MAQ0059": {
+        "title": "褰撴垜鍦ㄥ伐浣滀腑鍙楀埌鍒汉鐨勮川鐤戞垨鎸戞垬鏃讹紝鎴戞�昏兘澶熼伩鍏嶇敤鍏呮弧鏁屾剰鐨勬柟寮忓幓鍥炲簲"
+      },
+      "MAQ0060": {
+        "title": "鍦ㄨ鍒汉璐ㄧ枒鎴栨寫鎴樻椂锛屾垜鎬绘槸鎶戝埗鑷繁鐨勭涓�鍙嶅簲锛屼互閬垮厤鎯呯华鍖栫殑鍙嶅簲"
+      },
+      "MAQ0061": {
+        "title": "鎴戜笉鎰挎剰鎺ュ彈鐙珛鍐崇瓥鎵�甯︽潵鐨勯闄�"
+      },
+      "MAQ0062": {
+        "title": "鎴戝緢鎰挎剰涓洪渶瑕佸府鍔╃殑浜烘彁渚涘府鍔�"
+      },
+      "MAQ0064": {
+        "title": "鐩告瘮浜庝富鍔ㄧ‘瀹氳嚜宸辩殑鍙戝睍闇�姹傦紝鎴戞洿渚濊禆浜庢垜鐨勭粍缁囨潵纭畾鎴戦渶瑕佸彂灞曞摢浜涜兘鍔涘拰鎶�鑳�"
+      },
+      "MAQ0065": {
+        "title": "鍦ㄦ姤鍛婂悇绫绘暟瀛楀拰璐㈠姟鏁版嵁鏃讹紝鎴戝姏姹傚噯纭�"
+      },
+      "MAQ0067": {
+        "title": "鎴戠粡甯镐細鎻愬嚭澶氱鏂规鏉ヨВ鍐虫煇涓棶棰�"
+      },
+      "MAQ0069": {
+        "title": "鍦ㄧ‘瀹氬伐浣滅殑浼樺厛绛夌骇鏃讹紝鎴戦�氬父浼氬皢鎴戜笉鍠滄鐨勫伐浣滃畨鎺掑埌鏈�鍚�"
+      },
+      "MAQ0070": {
+        "title": "鎴戠粡甯稿彂鐜版垜涓嶅緱涓嶆悂缃伐浣滈」鐩�"
+      },
+      "MAQ0071": {
+        "title": "鍦ㄥ紑濮嬩竴涓」鐩墠锛屾垜浼氬垪鍑烘墍鏈夐渶瑕佸畬鎴愮殑浠诲姟"
+      },
+      "MAQ0072": {
+        "title": "鎴戣寰楀緢闅惧拰閭d簺璐ㄧ枒鎴戣鐐圭殑鍥㈤槦鎴愬憳鐩稿"
+      },
+      "MAQ0073": {
+        "title": "鎴戠粡甯搁�氳繃澶栫晫鐨勫弽棣堝拰鑷垜鍙嶇渷鏉ユ繁鍏ユ�濊�冨浣曟彁鍗囪嚜宸辩殑鎶�鑳藉拰绔炰簤鍔�"
+      },
+      "MAQ0074": {
+        "title": "涓�鏃﹀洟闃熷仛鍑轰簡鍐冲畾锛屽嵆浣挎垜涓嶈禐鍚岋紝鎴戜篃浼氳窡鐫�鍥㈤槦鐨勫喅瀹氳蛋"
+      },
+      "MAQ0076": {
+        "title": "鍦ㄥ仛鍑哄洶闅剧殑鍐冲畾鏃讹紝鎴戝苟涓嶆�绘槸鑳藉閬靛惊缁勭粐鐨勪环鍊艰鍜岃鑼�"
+      },
+      "MAQ0077": {
+        "title": "褰撴垜鍦ㄥ伐浣滀腑鍙楀埌鎵硅瘎鏃讹紝鎴戝鏄撶敓姘旓紝澶卞幓鍐烽潤"
+      },
+      "MAQ0078": {
+        "title": "鎴戝彂鐜拌姳寰堝鏃堕棿鏉ユ鏌ユ暟鎹紝鍒嗘瀽闂鐨勬牴婧愭槸浠跺緢鏋嚗鐨勪簨"
+      },
+      "MAQ0079": {
+        "title": "褰撴垜鎯呯华婵�鍔ㄦ椂锛屽氨鏃犳硶娓呮櫚鍦版�濊��"
+      },
+      "MAQ0080": {
+        "title": "鎬绘湁浜轰細琚笂绾т换鍛藉幓棰嗗涓�涓」鐩紝鑰屾垜瑕佸仛鐨勬槸绛夌潃骞跺惉浠庝粬浠殑瀹夋帓"
+      },
+      "MAQ0081": {
+        "title": "鏈夋椂鍊欐垜寰堥毦闆嗕腑绮惧姏鍘诲畬鎴愯嚜宸变笉鍠滄鐨勪换鍔�"
+      },
+      "MAQ0082": {
+        "title": "鐢变簬鎰忔枡涔嬪鐨勫洶闅撅紝鏈夊嚑娆℃垜鍐冲畾鏀惧純鏌愪簺椤圭洰"
+      },
+      "MAQ0084": {
+        "title": "鎴戝父甯告槸鍥㈤槦涓涓�涓彂鐜板伐浣滀腑鐨勬敼杩涙満浼氱殑浜�"
+      },
+      "MAQ0085": {
+        "title": "鎴戝畾鏈熶簡瑙f墍鍦ㄥ洟闃熺殑鏈�鏂扮姸鍐碉紝浠ョ‘淇濇垜浠兘澶熷疄鐜板洟闃熺洰鏍�"
+      },
+      "MAQ0086": {
+        "title": "鎴戝彂鐜板緢闅鹃�傚簲璁″垝鐨勬敼鍙橈紝鍥犱负鎬绘槸浼氭湁鐩稿綋澶х殑骞叉壈"
+      },
+      "MAQ0087": {
+        "title": "鍦ㄧぞ浜よ仛浼氱殑鍦哄悎鎷涘緟濂藉垰璁よ瘑鐨勪汉瀵规垜鏉ヨ鏄欢瀹规槗鐨勪簨"
+      },
+      "MAQ0088": {
+        "title": "鎴戝伓灏斾細璁╁埆浜轰负鎴戠殑閿欒鍙楀埌璐e"
+      },
+      "MAQ0089": {
+        "title": "鎴戝苟涓嶈兘瀹屽叏鎺屾帶鑷繁鐨勫懡杩�"
+      },
+      "MAQ0090": {
+        "title": "鎴戣寰楁縺鍔变竴涓柊鐨勮�屼笖鎴愬憳鑳屾櫙澶氭牱鍖栫殑鍥㈤槦鏄尯鍥伴毦鐨勪簨"
+      },
+      "MAQ0091": {
+        "title": "宸ヤ綔涓婄殑鍘嬪姏浠庢潵閮戒笉浼氬奖鍝嶆垜鐨勭潯鐪犺川閲�"
+      },
+      "MAQ0092": {
+        "title": "鎴戝�惧悜浜庨伩鍏嶅弬鍔犺繃澶氱殑绀句氦鎴栦汉闄呬氦寰�娲诲姩"
+      },
+      "MAQ0094": {
+        "title": "鎴戝苟涓嶆�绘槸鐭ラ亾濡備綍涓庡垰璁よ瘑鐨勪汉鏀�璋�"
+      },
+      "MAQ0095": {
+        "title": "鎴戝枩娆㈠鍛樺伐杩涜鏂颁换鍔$殑鍩硅锛屽苟鍚戜粬浠В閲婁负浠�涔堣繖浜涘煿璁鍥㈤槦鎴愬氨鍜屽伐浣滅哗鏁堝緢閲嶈"
+      },
+      "MAQ0097": {
+        "title": "鍒汉缁忓父鑳藉鍦ㄥ洟闃熷伐浣滅殑鎴愭灉涓彂鐜版垜鎵�娌℃湁鍙戠幇鐨勯敊璇�"
+      },
+      "MAQ0098": {
+        "title": "鎴戝�惧悜浜庤姳璐规瘮鍏朵粬浜烘洿澶氱殑鏃堕棿鏉ユ帰绱㈡暟鎹紝浠ュ鎵炬綔鍦ㄧ殑闂鍘熷洜锛屼粠鑰屼骇鐢熸湁鐢ㄧ殑瑙佽В"
+      },
+      "MAQ0099": {
+        "title": "濡傛灉鎴戠殑鑰佹澘涓嶅湪韬竟锛屾垜鎰挎剰鑷繁鍋氶噸瑕佺殑鍐冲畾"
+      },
+      "MAQ0100": {
+        "title": "鎴戜笉鍠滄闇�瑕佸紑鍙戞柊鐨勮В鍐虫柟妗堢殑宸ヤ綔"
+      },
+      "MAQ0101": {
+        "title": "鍙湁鍦ㄥ拰鑰佹澘鍏呭垎鍟嗚浜嗚嚜宸辩殑鎯虫硶鍚庯紝鎴戞墠浼氬惎鍔ㄦ煇涓柊涓炬帾"
+      },
+      "MAQ0103": {
+        "title": "鎴戜細鍔姏鍦ㄦ埅姝㈡棩鏈熷墠瀹屾垚浠诲姟锛屽厬鐜板伐浣滀腑鐨勬壙璇猴紝濡傛湁蹇呰鍙互鐗虹壊涓汉鏃堕棿"
+      },
+      "MAQ0104": {
+        "title": "鏈夋椂鎴戜細鍙楁儏缁敮閰嶈�屾棤娉曟帶鍒惰嚜宸辩殑搴斿鏂瑰紡"
+      },
+      "MAQ0106": {
+        "title": "鎴戠粡甯搁�氳繃鍙傚姞鐮旇浼氥�佺綉缁滅爺璁ㄤ細鍜岄槄璇绘潵鏇存柊鑷繁鐨勪笓涓氬拰琛屼笟鐭ヨ瘑"
+      },
+      "MAQ0107": {
+        "title": "鎴戝浜庣涓�鍗拌薄涓嶅ソ鐨勪汉涓嶅お鏈夎�愬績鍜岀ぜ璨�"
+      },
+      "MAQ0110": {
+        "title": "浜轰滑缁忓父鏉ユ壘鎴戣璁轰粬浠殑闂鎴栬嫤鎭�"
+      },
+      "MAQ0111": {
+        "title": "鎴戠粡甯稿府鍔╁埆浜烘洿濂藉湴鐞嗚В鍜屽鐞嗕粬浠嚜宸辩殑璐熼潰鎯呯华"
+      },
+      "MAQ0112": {
+        "title": "鎴戠殑鍚屼簨浠兘澶熷緢瀹规槗鐪嬪嚭鎴戠殑鎯呯华鐘舵��"
+      },
+      "MAQ0113": {
+        "title": "鎴戝苟涓嶆槸鎬绘湁鏃堕棿妫�鏌ユ垜鐨勫伐浣滐紝骞剁浉淇′笉妫�鏌ヤ篃闂涓嶅ぇ"
+      },
+      "MAQ0115": {
+        "title": "褰撴柊鐨勫伐浣滄祦绋嬫垨鎶�鏈寮曞叆鏃讹紝鎴戦�氬父鏄渶鏃╂帴鍙楀苟閲囩敤瀹冪殑浜�"
+      },
+      "MAQ0117": {
+        "title": "鍗充娇闈复楂樺帇鐨勫伐浣滐紝鎴戜篃浼氫繚鎸佷箰瑙傜殑鏈熸湜"
+      },
+      "MAQ0118": {
+        "title": "鏈夋椂鎴戜細寰堥毦鐞嗚В鑷繁鐨勬儏缁弽搴�"
+      },
+      "MAQ0119": {
+        "title": "鍦ㄥ伐浣滀腑锛屾垜缁忓父璁剧珛鏈夋寫鎴樻�х殑鐩爣锛岀劧鍚庡姫鍔涘疄鐜扮洰鏍�"
+      },
+      "MAQ0120": {
+        "title": "鎴戦潪甯告姷瑙﹂偅浜涗笉寰椾笉鍘诲弬鍔犵殑绀句氦娲诲姩锛岃涓洪偅浼氬緢蹇冪疮"
+      },
+      "MAQ0124": {
+        "title": "鎴戞�绘槸鐭ラ亾鑷繁鐨勬儏缁劅鍙椾互鍙婂師鍥�"
+      },
+      "MAQ0126": {
+        "title": "鎴戞洿鍠滄涓嶇揣涓嶆參锛屼粠瀹逛笉杩殑宸ヤ綔鑺傚锛岃�屼笉鍠滄缁忓父闇�瑕佸悓鏃跺畬鎴愬涓换鍔$殑宸ヤ綔鑺傚"
+      },
+      "MAQ0127": {
+        "title": "褰撴垜鎰忚瘑鍒版湁浜哄湪璇勪及鎴戠殑琛ㄧ幇鏃讹紝鎴戜細鍙樺緱姣斿埆浜烘洿鐒﹁檻"
+      },
+      "MAQ0129": {
+        "title": "褰撴垜涓嶅緱涓嶆寜鐓т换鍔$殑杞婚噸缂撴�ョ殑娆″簭鏉ュ伐浣滄椂锛屾垜浼氭湁涓�绉嶅彈闄愬埗鐨勬劅瑙�"
+      },
+      "MAQ0130": {
+        "title": "鎴戞湁鏃朵細鎰熷埌杩囧害鍔崇疮锛屼絾鏄垜濮嬬粓鐩镐俊鑷繁鏈夎冻澶熺殑绮惧姏鏉ュ畬鎴愭墍鏈夊伐浣滀换鍔�"
+      },
+      "MAQ0131": {
+        "title": "涓庝富鍔ㄦ壙鎷呯浉姣旓紝鎴戞洿鍠滄琚笂绾ц姹傚幓鎵挎媴鏌愰」浠诲姟鎴栧姞鍏ユ垨棰嗗涓�涓」鐩洟闃�"
+      },
+      "MAQ0132": {
+        "title": "浜轰滑閬囧埌鍥伴毦鏃堕�氬父浼氬埌鎴戣繖閲屾潵瀵绘眰鎯呮劅鏀寔"
+      },
+      "MAQ0133": {
+        "title": "鎴戝苟涓嶆�绘槸鑳藉璇氬疄鍦伴潰瀵硅嚜宸�"
+      },
+      "MAQ0134": {
+        "title": "鎴戞瘮杈冩搮闀垮畨鎱版伯涓ф垨鐢熸皵鐨勫悓浜嬶紝骞惰鍏跺喎闈欎笅鏉�"
+      },
+      "MAQ0135": {
+        "title": "鎴戣鐪熷�惧惉锛屼互姝ゆ潵浜嗚В鍒汉鐨勬劅鍙楀拰闇�姹�"
+      },
+      "MAQ0136": {
+        "title": "鎴戞湁鏃朵负浜嗚揪鎴愮洰鏍囦細瀵规斂绛栧拰瑙勫畾浣滅伒娲荤殑澶勭悊"
+      },
+      "MAQ0138": {
+        "title": "鎴戞洿鍠滄鍙娴嬬殑銆佹寜閮ㄥ氨鐝殑鏃ュ父宸ヤ綔"
+      },
+      "MAQ0140": {
+        "title": "鎴戝枩娆㈤偅绉嶄笂鍙稿鎴戝厖鍒嗘巿鏉冿紝璁╂垜鑳借嚜涓诲喅绛栫殑宸ヤ綔鐜"
+      },
+      "MAQ0141": {
+        "title": "鎴戞瘮鑷繁璁よ瘑鐨勫ぇ澶氭暟浜洪兘鏇村姞鍧氭寔鏄潪鍘熷垯"
+      },
+      "MAQ0142": {
+        "title": "鎴戝鍙備笌鍏泭浜嬩笟(蹇楁効娲诲姩)涓嶅お鎰熷叴瓒�"
+      },
+      "MAQ0143": {
+        "title": "鎴戜笉鍠滄鍒嗘瀽鍋囨兂浼氬彂鐢熺殑鎯呭鎴栫悊璁烘ā鍨�"
+      },
+      "MAQ0144": {
+        "title": "鍒濇涓庝汉瑙侀潰鏃讹紝鎴戞瘮杈冩矇榛樺瑷�锛屽父甯哥瓑寰呭鏂逛富鍔ㄥ紑鍙d氦璋�"
+      },
+      "MAQ0145": {
+        "title": "鎴戞湁鏃朵細鍋氬嚭涓�浜涜鎴戜簨鍚庢劅鍒板悗鎮旂殑鍐冲畾"
+      },
+      "MAQ0146": {
+        "title": "鏈夋椂鍊欙紝鎴戝緢闅剧悊瑙e埆浜虹殑鎯呯华鍙嶅簲"
+      },
+      "MAQ0147": {
+        "title": "鎴戞洿鍠滄閬靛惊宸茬粡瀹屽杽浜嗙殑宸ヤ綔娴佺▼锛岃�屼笉鏄�冭檻鏂版柟娉�"
+      },
+      "MAQ0149": {
+        "title": "鍦ㄤ汉闄呬氦寰�涓紝鎴戝父甯稿仛涓嶅埌鎹綅鎬濊��"
+      },
+      "MAQ0150": {
+        "title": "鎴戣寰楀ソ鍍忓叾浠栦汉姣旀垜鏇磋兘鎶曞叆鏇村绮惧姏鍘诲畬鎴愬伐浣滀换鍔�"
+      },
+      "MAQ0151": {
+        "title": "鎴戝枩娆㈡暣鐞嗗拰鍙戣〃鍏锋湁浠や汉淇℃湇鐨勭悊鐢辩殑婕旇锛屼互姝ゆ潵璇存湇鍏朵粬浜�"
+      },
+      "MAQ0152": {
+        "title": "鎴戜笉鍠滄濮嬬粓蹇妭濂忓湴宸ヤ綔"
+      },
+      "MAQ0156": {
+        "title": "褰撴垜鏈兘瀹炵幇宸ヤ綔涓殑涓�涓噸瑕佺洰鏍囨椂锛屾垜寰堝揩灏变細鎭㈠杩囨潵锛岄噸鏂颁笓娉ㄤ簬濡備綍杈炬垚鐩爣"
+      },
+      "MAQ0157": {
+        "title": "鎴戜笉鎰挎剰鏀瑰彉鎴戞棦鏈夌殑宸ヤ綔鏂瑰紡"
+      },
+      "MAQ0158": {
+        "title": "鎴戝枩娆笉鏂彉鍖栵紝鑰屼笉鏄ǔ瀹�"
+      },
+      "MAQ0159": {
+        "title": "褰撴垜鍦ㄥ伐浣滀腑寰楀埌璐熼潰鍙嶉鏃讹紝鎴戜篃浠庝笉鎬�鐤戣嚜宸卞伐浣滅殑鑳藉姏"
+      },
+      "MAQ0160": {
+        "title": "鎴戜竴鐩存湁寮虹儓鐨勬剰鎰垮幓棰嗗鍜屾寚鎸ヤ竴缇や汉"
+      },
+      "MAQ0161": {
+        "title": "闈㈠涓�涓殰纰嶆垨鍥伴毦锛屾垜浼氫笉鍋滃湴鍔姏鍘诲厠鏈嶅畠锛岀洿鍒版垚鍔�"
+      },
+      "MAQ0162": {
+        "title": "鍦ㄥ伐浣滈」鐩殑璁″垝闃舵锛屾垜鎬绘槸纭璇ラ」鐩殑鍒╃泭鏀稿叧鏂瑰苟纭繚浠栦滑瀵硅椤圭洰鐨勬壙璇�"
+      },
+      "MAQ0163": {
+        "title": "鏈夋椂鎴戜細鍙楀埌鎯呯华鐨勫奖鍝嶏紝鍋氬嚭涓�浜涜鑷繁鍚庢倲鐨勫喅瀹�"
+      },
+      "MAQ0164": {
+        "title": "鎴戞�绘槸鐭ラ亾鏄粈涔堝奖鍝嶄簡鎴戠殑鎯呯华"
+      },
+      "MAQ0165": {
+        "title": "褰撳埆浜哄悜鎴戞姳鎬ㄤ粬浠湪宸ヤ綔涓婃垨鐢熸椿涓鍒扮殑闂鏃讹紝鎴戝父甯告棤娉曟劅鍚岃韩鍙�"
+      },
+      "MAQ0166": {
+        "title": "瀵逛簬鎴戞潵璇达紝璇存湇鍒汉鏄欢瀹规槗鐨勪簨"
+      },
+      "MAQ0167": {
+        "title": "鏈夋椂鎴戝彂鐜板伐浣滀笂鐨勬媴蹇ф垨闂浼氬鎴戠殑涓汉鐢熸椿浜х敓璐熼潰褰卞搷"
+      },
+      "MAQ0168": {
+        "title": "鎴戞浘缁忓湪娌℃湁鐪熺殑鐢熺梾鐨勬儏鍐典笅锛屽悜鍏徃鎴栧鏍¤杩囩梾鍋�"
+      },
+      "MAQ0169": {
+        "title": "鎴戞湁鏃朵細鎸夌収鑷繁鐨勫叴瓒h�屼笉鏄换鍔$殑杞婚噸缂撴�ユ潵鍐冲畾鑷繁鐨勫伐浣滈『搴�"
+      },
+      "MAQ0170": {
+        "title": "宸ヤ綔璁╂垜鍏呮弧娲诲姏锛� 浠ヨ嚦浜庢垜鍙戠幇鑷繁甯稿父娌夋蹈鍦ㄥ伐浣滀腑锛岃繃浜嗙潯瑙夌殑鐐归兘涓嶇煡閬�"
+      },
+      "MAQ0171": {
+        "title": "鎴戣寰楀彉鍖栨槸闈炲父浠や汉鍏村鐨勶紝灏界瀵瑰叾浠栦汉鏉ヨ鍙兘寰堥毦"
+      },
+      "MAQ0172": {
+        "title": "鎴戞搮闀挎敼鍙樺埆浜虹殑瑙傜偣鍜岀湅娉�"
+      },
+      "MAQ0173": {
+        "title": "鎴戝苟涓嶆槸鎬昏兘鍋氬埌瑷�琛屼竴鑷�"
+      },
+      "MAQ0174": {
+        "title": "鏈夋椂鎴戝彂鐜版敼鍙樺埆浜虹殑瑙傜偣鍜岀湅娉曞緢闅�"
+      },
+      "MAQ0175": {
+        "title": "褰撻亣鍒拌嚜宸变笉鍠滄鎴栨瘮杈冨洶闅剧殑浠诲姟鏃讹紝鎴戦�氬父浼氭嫋寤朵竴娈垫椂闂村啀寮�濮�"
+      },
+      "MAQ0176": {
+        "title": "鎴戝枩娆笌鍏朵粬鍥㈤槦鎴愬憳杩涜鍗忎綔锛屼互閬垮厤閲嶅鎴栨棤鏁堢殑宸ヤ綔"
+      },
+      "MAQ0178": {
+        "title": "鎴戞�绘槸鎸夋椂瀹屾垚宸ヤ綔浠诲姟"
+      },
+      "MAQ0179": {
+        "title": "鎴戠涓�娆¤鍒板埆浜烘椂灏卞彲浠ュ緢瀹规槗鍦拌鎳備粬浠紝浣嗘槸涓嶇绗竴鍗拌薄濡備綍锛屾垜閮戒細淇濇寔绀艰矊鍜屽懆鍒�"
+      },
+      "MAQ0180": {
+        "title": "鎴戠粡甯告槸绗竴涓嚜鎰块瀵兼垨鍔犲叆椤圭洰鍥㈤槦鐨勪汉"
+      },
+      "MAQ0181": {
+        "title": "褰撴墜澶存鍦ㄥ仛鐨勯」鐩嚭鐜版剰澶栫殑鍥伴毦鏃讹紝鎴戝彂鐜版湁鏃舵垜浼氬仠涓嬫潵锛岃浆鑰屽仛鍏跺畠椤圭洰"
+      },
+      "MAQ0182": {
+        "title": "鎴戜細瀹氭湡鍚戞垜鐨勫洟闃熸垚鍛樻彁渚涘弽棣堬紝浠ュ府鍔╀粬浠釜浜哄彂灞曞苟瀹炵幇鑱屼笟鐩爣"
+      },
+      "MAQ0183": {
+        "title": "鎴戝枩娆㈢珛鍗冲紑濮嬪鐞嗗洶闅剧殑浠诲姟锛岃�屼笉鏄嫋寤�"
+      },
+      "MAQ0184": {
+        "title": "鍦ㄥ紑浼氭椂鎴戞�绘槸涓撴敞浜庝富棰橈紝涓庝粬浜轰簰鍔紝骞朵笓蹇冨湴鍊惧惉浠栦汉鐨勫彂瑷�"
+      },
+      "MAQ0185": {
+        "title": "鎴戜笉鍠滄涓鸿嚜宸辨垨鍥㈤槦璁剧珛鎸戞垬鎬х殑鐩爣锛屽苟涓嶅緱涓嶈姳棰濆鐨勬椂闂村幓杈炬垚杩欎簺鐩爣"
+      },
+      "MAQ0187": {
+        "title": "鐩告瘮涓庝粬浜哄悎浣滐紝鎴戞洿鎰挎剰鑷繁涓�浜哄畬鎴愬伐浣滀换鍔�"
+      },
+      "MAQ0190": {
+        "title": "姣忔寮�濮嬫柊宸ヤ綔鎴栨柊椤圭洰鏃讹紝鎴戦�氬父浼氬厖婊′俊蹇�"
+      },
+      "MAQ0191": {
+        "title": "鎴戝彂鐜颁富鍔ㄤ笌鍒氳璇嗙殑浜烘攢璋堟槸瀹规槗鐨勪簨"
+      },
+      "MAQ0192": {
+        "title": "鎴戞効鎰忚嚜宸卞仛鍐冲畾骞舵帴鍙楃浉搴旂殑鍚庢灉"
+      },
+      "MAQ0193": {
+        "title": "鎴戝伓灏斿洜涓哄繀椤诲畬鎴愬叾浠栭噸瑕佺殑浜嬫儏鑰屾病鏈夋寜鏃跺畬鎴愬伐浣滀换鍔�"
+      },
+      "MAQ0194": {
+        "title": "鍙鎰挎剰锛屾垜鍙互杞绘澗鍦颁笌浠讳綍浜轰氦鏈嬪弸"
+      },
+      "MAQ0195": {
+        "title": "鎴戝枩娆㈠澶嶆潅鏂规鐨勫埄寮婅繘琛屽叏闈㈢殑鍒嗘瀽"
+      },
+      "MAQ0197": {
+        "title": "鎴戜笉浼氬皾璇曡嚜宸卞幓鎻愬嚭鏂版兂娉曪紝鑰屾槸甯屾湜鎶婃绫讳簨鎯呰缁欏姝ゆ劅鍏磋叮鐨勪汉鍘诲仛"
+      },
+      "MAQ0199": {
+        "title": "鎴戞�绘槸鑳藉緢蹇兂鍑鸿鏈嶅埆浜虹殑鏈�浣虫柟娉�"
+      },
+      "MAQ0200": {
+        "title": "鎴戜笉浼氳鎸姌鎴栧け鏈涘鎴戠殑宸ヤ綔琛ㄧ幇浜х敓璐熼潰褰卞搷"
+      },
+      "MAQ0201": {
+        "title": "褰撴垜鍦ㄥ伐浣滀腑閬亣鎸姌鎴栧け璐ユ椂锛屾垜闇�瑕佽緝闀挎椂闂存墠鑳藉畬鍏ㄦ仮澶嶈嚜淇�"
+      },
+      "MAQ0202": {
+        "title": "瀵逛簬鎴戜笉鍠滄鐨勪汉锛屾垜鏃犳硶鎬绘槸淇濇寔绀艰矊鍜屾伃鏁�"
+      },
+      "MAQ0203": {
+        "title": "澶у鏁颁汉鏈�缁堥兘浼氬悓鎰忔垜鐨勮鐐�"
+      },
+      "MAQ0204": {
+        "title": "濡傛灉鎴戣涓哄垰璁よ瘑鐨勪汉瀵规垜涓嶇ぜ璨岋紝涔熶笉灏婇噸鎴戯紝閭f垜涔熶笉浼氬浠栦滑鏈夌ぜ璨屾垨灏婇噸"
+      },
+      "MAQ0205": {
+        "title": "鍦ㄨ繘琛屾煇涓」鐩椂锛屾垜浼氬畾鏈熺洃鎺ч」鐩噸瑕佽妭鐐圭殑瀹屾垚杩涘害锛屽苟璺熻繘璐熻矗鍚勪釜鍏蜂綋妯″潡鐨勫洟闃熸垚鍛�"
+      },
+      "MAQ0206": {
+        "title": "鍦ㄥ拰浠栦汉璋堝垽鐨勬椂鍊欙紝鎴戝伓灏斾細瑙夊緱缂轰箯鑷俊"
+      },
+      "MAQ0207": {
+        "title": "鏈夋椂鎴戝緢闅捐鏈嶅埆浜烘帴鍙楁垜鐨勫缓璁�"
+      },
+      "MAQ0208": {
+        "title": "鍗充娇涓嶆儏鎰匡紝鎴戜篃浼氶潪甯镐粩缁嗗湴妫�鏌ュ摢鎬曟渶灏忕殑缁嗚妭"
+      },
+      "MAQ0209": {
+        "title": "浠栦汉璁や负鎴戣兘鍔涗竴鑸�"
+      },
+      "MAQ0210": {
+        "title": "鎴戜笉鍠滄鍩硅鍥㈤槦涓殑鏂板憳宸ヤ互纭繚浠栦滑鍋氫簨鏂瑰紡鏄纭殑"
+      },
+      "MAQ0211": {
+        "title": "濡傛灉闇�瑕佺殑璇濓紝鎴戞�昏兘鎵惧埌鏇村鐨勬椂闂存潵瀹屾垚宸ヤ綔"
+      },
+      "MAQ0212": {
+        "title": "涓庢垜鐨勫悓浜嬬浉姣旓紝鎴戜笉澶枩娆㈡敹闆嗗拰鍒嗘瀽鏁版嵁銆�"
+      },
+      "MAQ0213": {
+        "title": "鎴戠‘淇濆厬鐜版墍鏈夊伐浣滀笂鐨勬壙璇猴紝鍥犱负杩欏鎴戣�岃█鏄竴涓弗鑲冦�佺鍦g殑鍘熷垯"
+      },
+      "MAQ0214": {
+        "title": "鍚屼簨浠粡甯告潵璇锋暀鎴戝簲璇ュ浣曞拰鍒汉娌熼�氭晱鎰熻瘽棰�"
+      },
+      "MAQ0216": {
+        "title": "灏界鏈夋椂鍙兘涓嶆柟渚匡紝浣嗘垜濮嬬粓閬靛畧鏀跨瓥鍜岃瀹�"
+      },
+      "MAQ0218": {
+        "title": "瀵逛簬閭d簺鎴戣涓烘瘮杈冨洶闅炬垨鑰呮垚鍔熷彲鑳芥�т笉楂樼殑椤圭洰锛屾垜缁忓父鎷栧欢鏃堕棿锛岃�屼笉绔嬪嵆鍚姩"
+      },
+      "MAQ0219": {
+        "title": "鎴戜粠鏈洜宸ヤ綔涓婄殑澶辫触鑰岀伆蹇�"
+      },
+      "MAQ0220": {
+        "title": "褰撴垜鐨勫伐浣滆礋鑽峰鍔犳椂锛屾湁鏃舵垜浼氭劅鍒板け鍘昏�愬績銆佸績鐑︽剰涔�"
+      },
+      "MAQ0221": {
+        "title": "鎴戝缁堢‘淇濇仾瀹堟垜鎵�鏈夌殑鑱屼笟鎵胯骞朵俊瀹堣瑷�"
+      },
+      "MAQ0223": {
+        "title": "鎴戞洿鍠滄閭d簺鍙互鍏呭垎鍙戞尌鍒涢�犳�х殑宸ヤ綔"
+      },
+      "MAQ0224": {
+        "title": "鏈夋椂鍊欏伐浣滀腑鐨勫け鏈涘拰澶辫触浼氫娇鎴戝ソ鍑犲ぉ閮芥棤娉曢泦涓敞鎰忓姏"
+      },
+      "MAQ0225": {
+        "title": "鎴戜笉鍠滄涓嶆柇鍦拌鏈嶅埆浜烘帴鍙楁垜鐨勫缓璁�"
+      },
+      "MAQ0226": {
+        "title": "鎴戝湪鍚屼簨涓湁鑳藉渾铻嶅湴鍜岄毦鐩稿鐨勪汉鎵撲氦閬撶殑鍚嶅0"
+      },
+      "MAQ0227": {
+        "title": "鎴戠粡甯稿鐞嗗緢澶氫笉鍚岀殑椤圭洰銆佹兂娉曟垨鑰呰璁猴紝鎴戝彂鐜拌繖璁╀汉绮剧鎸"
+      },
+      "MAQ0228": {
+        "title": "褰撲簨鎯呮病鏈夋寜鐓ф垜鐨勯鎯冲彂灞曟椂锛屾垜浼氬彉寰楁伯涓�"
+      },
+      "MAQ0229": {
+        "title": "鎴戝枩娆㈠弬鍔犲晢涓氱ぞ浜ゆ椿鍔�"
+      },
+      "MAQ0230": {
+        "title": "鏈夋椂鎴戝浜よ皥瀵硅薄鐨勬枃鍖栬儗鏅�佷範淇椼�佸拰绂佸繉涓嶅鏁忔劅"
+      },
+      "MAQ0231": {
+        "title": "鍦ㄧぞ浜や簰鍔ㄤ腑锛屾垜閫氬父瀵瑰埆浜虹殑闇�姹備笉澶熸晱鎰�"
+      },
+      "MAQ0232": {
+        "title": "鎴戝浠栦汉鐨勭涓�鍗拌薄閫氬父鏄噯纭殑"
+      },
+      "MAQ0233": {
+        "title": "鎴戦�氬父鑳藉湪宸ヤ綔涓帶鍒跺ソ鑷繁鐨勬儏缁�"
+      },
+      "MAQ0234": {
+        "title": "褰撴垜鍦ㄦ煇涓伐浣滈」鐩腑纰板埌鍥伴毦鏃讹紝鎴戞湁鏃朵細涓璇ラ」鐩紝杞�屽幓鍋氬叾瀹冮」鐩�"
+      },
+      "MAQ0235": {
+        "title": "鍦ㄦ垜鐨勭敓娲诲拰鑱屼笟涓紝鎴戞�绘槸鐭ラ亾鑷繁鎯宠浠�涔�"
+      },
+      "MAQ0236": {
+        "title": "鍜屾柊璁よ瘑鐨勪汉锛屾垜浠庝笉浼氭劅鍒版病璇濆彲璇�"
+      },
+      "MAQ0237": {
+        "title": "鍗充娇鍥㈤槦涓殑澶ч儴鍒嗘垚鍛樿窡鎴戠殑鎰忚/鐪嬫硶鐩稿乏锛屾垜閫氬父涔熶笉鎰挎剰鏀惧純鑷繁鐨勬剰瑙�/鐪嬫硶锛岃窡澶т紮鍎胯揪鎴愪竴鑷淬��"
+      },
+      "MAQ0240": {
+        "title": "濡傛灉鎴戝拰鍏朵粬浜哄悎浣滀竴椤逛换鍔★紝鎴戜細绛夌潃浠栦滑鏉ユ壘鎴戝崗璋冨伐浣�"
+      },
+      "MAQ0241": {
+        "title": "鎴戝皬鏃跺�欐浘缁忔嬁杩囨湰涓嶅睘浜庤嚜宸辩殑涓滆タ"
+      },
+      "MAQ0242": {
+        "title": "鍦ㄥ緱鍒拌�佹澘鐨勬槑纭寚绀哄墠锛屾垜閫氬父涓嶄細閲囧彇琛屽姩"
+      },
+      "MAQ0243": {
+        "title": "鎴戝父甯稿湪涓嬪睘鐨勫伐浣滄姤鍛婁腑鍙戠幇閿欒"
+      },
+      "MAQ0244": {
+        "title": "鎴戜粠鏈繚鍙嶈繃浜ら�氳鍒�"
+      },
+      "MAQ0245": {
+        "title": "鎴戝湪鍥㈤槦涓粡甯告槸鍕囦簬鎸戞垬鍥㈤槦宸ヤ綔璁炬兂鍜屾柟鍚戠殑浜�"
+      },
+      "MAQ0247": {
+        "title": "鍦ㄥ伐浣滈」鐩紑濮嬩箣鍓嶏紝鎴戜細鍜屽洟闃熸垚鍛樺厛寮�浼氬崗璋冿紝鍋氬ソ椤圭洰璁″垝"
+      },
+      "MAQ0248": {
+        "title": "鎴戜笉鎬庝箞鑺辨椂闂翠笌涓嬪睘璁ㄨ浠栦滑鐨勮亴涓氬彂灞曠洰鏍囨垨杩涘睍"
+      },
+      "MAQ0249": {
+        "title": "鎴戜粠涓嶆祻瑙堜笉濂界殑缃戠珯"
+      },
+      "MAQ0250": {
+        "title": "鎴戞湁鏃朵細闂茶亰鍒汉鐨勫闀块噷鐭�"
+      },
+      "MAQ0251": {
+        "title": "鏈璇烽�夆�滃悓鎰忊��"
+      },
+      "MAQ0252": {
+        "title": "鏈璇烽�夆�滈潪甯镐笉鍚屾剰鈥�"
+      }
+    }
+  },
   "login": {
     "url": "http://161.117.57.194/login?lang=zh_CN",
     "username": "admin",
@@ -113,5 +711,717 @@
       "status": "鏈湪瀵绘壘瀹炰範/宸ヤ綔",
       "workExperience": "鏃�"
     }
+  },
+  "testPackageList": {
+    "question": {
+      "MAQ": {
+      "MAQ0001": {
+        "title": "鎴戜笉鍠滄鑺辨椂闂存鏌ュ皬缁嗚妭鐨勫噯纭��"
+      },
+      "MAQ0003": {
+        "title": "鎴戜粠涓嶈璋庯紝鐢氳嚦杩炲皬璋庨兘娌℃湁璇磋繃"
+      },
+      "MAQ0004": {
+        "title": "褰撴垜鍋氫竴涓」鐩椂锛屾垜浼氬叏鍔涗互璧达紝鐩村埌瀹屾垚涓烘"
+      },
+      "MAQ0005": {
+        "title": "鎴戝�惧悜浜庝娇鐢ㄥ父瑙勬柟娉曪紝鑰屼笉鏄偅浜涗粠鏈皾璇曡繃鐨勬柟娉�"
+      },
+      "MAQ0006": {
+        "title": "褰撴垜涓嶅緱涓嶅幓璐熻矗涓�涓洟闃熺殑鏃跺�欙紝鎴戜細鎰熻鎴樺參銆佹亹鎯�"
+      },
+      "MAQ0007": {
+        "title": "鎴戞湁鏃跺洜涓哄悇绉嶅共鎵板洜绱狅紝鏈兘鎸夋椂瀹屾垚宸ヤ綔浠诲姟"
+      },
+      "MAQ0009": {
+        "title": "鎴戣兘澶熸帶鍒惰嚜宸辩殑鎯呯华鐘舵�侊紝浣垮叾浠栦汉涓嶅お瀹规槗鐭ラ亾鎴戝唴蹇冪殑鎰熷彈"
+      },
+      "MAQ0010": {
+        "title": "鎴戞敮鎸佹墍鍦ㄧ粍缁囩殑浠峰�艰鍜岃鑼冿紝骞朵簡瑙e叾閲嶈鎬�"
+      },
+      "MAQ0011": {
+        "title": "鎴戜笉浼氬洜澶辫触鎴栨尗鎶樿�屾硠姘�"
+      },
+      "MAQ0013": {
+        "title": "鎴戜粠鏉ユ病鏈夊湪琛椾笂涔辨墧鍨冨溇"
+      },
+      "MAQ0014": {
+        "title": "鏈夋椂鎴戝彂鐜拌鍒汉鍚粠鎴戠殑鎸囩ず鏄欢寰堝洶闅剧殑浜�"
+      },
+      "MAQ0015": {
+        "title": "蹇呰鏃讹紝鎴戣兘寰堝鏄撳湴闀挎椂闂村畬鍏ㄤ笓娉ㄤ簬閲嶈鐨勫伐浣滈」鐩�"
+      },
+      "MAQ0019": {
+        "title": "鍦ㄩ」鐩伃鍙楅噸澶ф尗鎶樹箣鍚庯紝鎴戝苟涓嶆槸鎬昏兘婵�鍙戝洟闃熺殑鏂楀織"
+      },
+      "MAQ0020": {
+        "title": "鎴戜粠鏈湪鑳屽悗璇磋繃鏈嬪弸鐨勫潖璇�"
+      },
+      "MAQ0021": {
+        "title": "鎴戝枩娆㈡牴鎹洿瑙夋潵瑙e喅闂锛岃�屼笉鏄姳杈冮暱鏃堕棿杩涜绯荤粺鐨勫垎鏋�"
+      },
+      "MAQ0024": {
+        "title": "鏀跨瓥鍜岃瀹氭�荤殑鏉ヨ鍙槸鎸囧鎬ф剰瑙侊紝鍦ㄦ柟渚挎椂搴斿綋閬靛畧锛屽湪涓嶆柟渚挎椂鍙互鐏垫椿澶勭悊"
+      },
+      "MAQ0025": {
+        "title": "闈㈠宸ヤ綔鐜鐨勫彉鍖栵紝鎴戝緢涔愭剰灏濊瘯鏂扮殑宸ヤ綔鏂瑰紡"
+      },
+      "MAQ0026": {
+        "title": "鎴戝枩娆㈡悳瀵诲拰鐮旂┒鏁版嵁锛岀湅鐪嬫暟鎹兘缁欏嚭鎬庢牱鐨勬柟鍚戙��"
+      },
+      "MAQ0027": {
+        "title": "褰撴垜鐪嬪埌鍏朵粬鍥㈤槦鎴愬憳闇�瑕佸府鍔╂椂锛屾垜浼氳皟鏁存垜鐨勫伐浣滄棩绋嬶紝鑵惧嚭鏃堕棿鏉ュ府鍔╀粬浠�"
+      },
+      "MAQ0028": {
+        "title": "鍦ㄥ紑浼氭椂锛屾垜鏈夋椂浼氳鑷繁鎴栦粬浜虹殑璐熼潰鎯呯华鎵�骞叉壈"
+      },
+      "MAQ0029": {
+        "title": "鎴戠粡甯告槸鍥㈤槦涓涓�涓彁鍑鸿鍔ㄦ柟妗堢殑"
+      },
+      "MAQ0030": {
+        "title": "鎴戜富鍔ㄥ弬涓庢垨棰嗗鍒汉涓嶆効鎰忔壙鎷呯殑宸ヤ綔椤圭洰"
+      },
+      "MAQ0034": {
+        "title": "鎴戠粡甯稿悜鎴戠殑鍚屼簨鍜屼笅灞炲己璋冿紝鎴戜滑鎵�鍋氱殑鎵�鏈夊喅绛栭兘蹇呴』绗﹀悎缁勭粐鐨勪环鍊艰鍜岃鑼�"
+      },
+      "MAQ0035": {
+        "title": "鏈夋椂鍒汉鐨勮礋闈㈡儏缁細褰卞搷鎴戣嚜宸辩殑鎯呯华"
+      },
+      "MAQ0036": {
+        "title": "鎴戠粡甯稿垱閫犳�у湴鎶婂埆浜虹殑涓嶅悓鎯虫硶缁撳悎璧锋潵锛屽苟鎵惧埌鏈夋晥鐨勯棶棰樿В鍐冲姙娉�"
+      },
+      "MAQ0038": {
+        "title": "鎴戞浘缁忓埄鐢ㄨ繃鍏朵粬浜�"
+      },
+      "MAQ0039": {
+        "title": "鎴戝枩娆㈠垎鏋愬鏉傜殑姒傚康骞跺彂鐜板畠浠箣闂寸殑閫昏緫鑱旂郴"
+      },
+      "MAQ0040": {
+        "title": "鎴戝緢浜彈浠旂粏妫�鏌ュ皬缁嗚妭鐨勮繃绋�"
+      },
+      "MAQ0041": {
+        "title": "鑷緥瀵规垜鏉ヨ寰堝鏄撳仛鍒�"
+      },
+      "MAQ0042": {
+        "title": "寮�濮嬪仛浠讳綍椤圭洰鍓嶏紝鎴戦兘浼氶鍏堟⒊鐞嗕换鍔$殑杞婚噸缂撴�ュ拰鎴鏃ユ湡"
+      },
+      "MAQ0044": {
+        "title": "鍗充娇鍦ㄥ緢蹇欑殑鏃跺�欙紝濡傛灉鎴戠煡閬撴垜鏄煇椤瑰伐浣滅殑鏈�浣充汉閫夛紝鎴戜篃浼氳嚜鎰垮幓鎵挎媴杩欎簺棰濆鐨勫伐浣�"
+      },
+      "MAQ0045": {
+        "title": "宸ヤ綔涓婇伃閬囧け璐ユ垨鎸姌鏃讹紝鎴戜細寮�濮嬫��鐤戣嚜宸�"
+      },
+      "MAQ0046": {
+        "title": "鎴戞病鏈変粩缁嗘牎瀵硅嚜宸辩殑宸ヤ綔鎴栨姤鍛婄殑涔犳儻"
+      },
+      "MAQ0047": {
+        "title": "鎴戞湁鏃跺仛浜嬮渶瑕佸埆浜烘彁閱掓墠鑳芥寜鏃跺畬鎴�"
+      },
+      "MAQ0048": {
+        "title": "鎴戝緢涔愭剰鎷呬换棰嗗鐨勮鑹�"
+      },
+      "MAQ0049": {
+        "title": "褰撴垜鐨勪笂鍙镐笉鍦ㄧ殑鏃跺�欙紝鎴戜笉鍠滄鑷繁鍋氬伐浣滀笂鐨勫喅绛�"
+      },
+      "MAQ0051": {
+        "title": "鍦ㄥ伐浣滀腑锛屾垜娌℃湁涓哄疄鐜扮洰鏍囪�屽姫鍔涘苟鑾峰緱鎴愬氨鍜岃鍙殑鍔ㄥ姏"
+      },
+      "MAQ0053": {
+        "title": "濡傛灉鑳介�夋嫨锛屾垜鏇村枩娆簨鍏堣鍒掑ソ鐨勪緥琛屾椿鍔紝鑰屼笉鍠滄鍘婚�傚簲鍚勭涓嶇‘瀹氭��"
+      },
+      "MAQ0055": {
+        "title": "褰撴墜澶存湁鍏跺畠宸ヤ綔瑕佸仛鏃讹紝鎴戜笉澶効鎰忓府鍔╁洟闃熸垚鍛�"
+      },
+      "MAQ0058": {
+        "title": "鏈夋椂鍊欐垜鎬�鐤戣嚜宸辨槸鍚﹁兘鑳滀换褰撳墠宸ヤ綔"
+      },
+      "MAQ0059": {
+        "title": "褰撴垜鍦ㄥ伐浣滀腑鍙楀埌鍒汉鐨勮川鐤戞垨鎸戞垬鏃讹紝鎴戞�昏兘澶熼伩鍏嶇敤鍏呮弧鏁屾剰鐨勬柟寮忓幓鍥炲簲"
+      },
+      "MAQ0060": {
+        "title": "鍦ㄨ鍒汉璐ㄧ枒鎴栨寫鎴樻椂锛屾垜鎬绘槸鎶戝埗鑷繁鐨勭涓�鍙嶅簲锛屼互閬垮厤鎯呯华鍖栫殑鍙嶅簲"
+      },
+      "MAQ0061": {
+        "title": "鎴戜笉鎰挎剰鎺ュ彈鐙珛鍐崇瓥鎵�甯︽潵鐨勯闄�"
+      },
+      "MAQ0062": {
+        "title": "鎴戝緢鎰挎剰涓洪渶瑕佸府鍔╃殑浜烘彁渚涘府鍔�"
+      },
+      "MAQ0064": {
+        "title": "鐩告瘮浜庝富鍔ㄧ‘瀹氳嚜宸辩殑鍙戝睍闇�姹傦紝鎴戞洿渚濊禆浜庢垜鐨勭粍缁囨潵纭畾鎴戦渶瑕佸彂灞曞摢浜涜兘鍔涘拰鎶�鑳�"
+      },
+      "MAQ0065": {
+        "title": "鍦ㄦ姤鍛婂悇绫绘暟瀛楀拰璐㈠姟鏁版嵁鏃讹紝鎴戝姏姹傚噯纭�"
+      },
+      "MAQ0067": {
+        "title": "鎴戠粡甯镐細鎻愬嚭澶氱鏂规鏉ヨВ鍐虫煇涓棶棰�"
+      },
+      "MAQ0069": {
+        "title": "鍦ㄧ‘瀹氬伐浣滅殑浼樺厛绛夌骇鏃讹紝鎴戦�氬父浼氬皢鎴戜笉鍠滄鐨勫伐浣滃畨鎺掑埌鏈�鍚�"
+      },
+      "MAQ0070": {
+        "title": "鎴戠粡甯稿彂鐜版垜涓嶅緱涓嶆悂缃伐浣滈」鐩�"
+      },
+      "MAQ0071": {
+        "title": "鍦ㄥ紑濮嬩竴涓」鐩墠锛屾垜浼氬垪鍑烘墍鏈夐渶瑕佸畬鎴愮殑浠诲姟"
+      },
+      "MAQ0072": {
+        "title": "鎴戣寰楀緢闅惧拰閭d簺璐ㄧ枒鎴戣鐐圭殑鍥㈤槦鎴愬憳鐩稿"
+      },
+      "MAQ0073": {
+        "title": "鎴戠粡甯搁�氳繃澶栫晫鐨勫弽棣堝拰鑷垜鍙嶇渷鏉ユ繁鍏ユ�濊�冨浣曟彁鍗囪嚜宸辩殑鎶�鑳藉拰绔炰簤鍔�"
+      },
+      "MAQ0074": {
+        "title": "涓�鏃﹀洟闃熷仛鍑轰簡鍐冲畾锛屽嵆浣挎垜涓嶈禐鍚岋紝鎴戜篃浼氳窡鐫�鍥㈤槦鐨勫喅瀹氳蛋"
+      },
+      "MAQ0076": {
+        "title": "鍦ㄥ仛鍑哄洶闅剧殑鍐冲畾鏃讹紝鎴戝苟涓嶆�绘槸鑳藉閬靛惊缁勭粐鐨勪环鍊艰鍜岃鑼�"
+      },
+      "MAQ0077": {
+        "title": "褰撴垜鍦ㄥ伐浣滀腑鍙楀埌鎵硅瘎鏃讹紝鎴戝鏄撶敓姘旓紝澶卞幓鍐烽潤"
+      },
+      "MAQ0078": {
+        "title": "鎴戝彂鐜拌姳寰堝鏃堕棿鏉ユ鏌ユ暟鎹紝鍒嗘瀽闂鐨勬牴婧愭槸浠跺緢鏋嚗鐨勪簨"
+      },
+      "MAQ0079": {
+        "title": "褰撴垜鎯呯华婵�鍔ㄦ椂锛屽氨鏃犳硶娓呮櫚鍦版�濊��"
+      },
+      "MAQ0080": {
+        "title": "鎬绘湁浜轰細琚笂绾т换鍛藉幓棰嗗涓�涓」鐩紝鑰屾垜瑕佸仛鐨勬槸绛夌潃骞跺惉浠庝粬浠殑瀹夋帓"
+      },
+      "MAQ0081": {
+        "title": "鏈夋椂鍊欐垜寰堥毦闆嗕腑绮惧姏鍘诲畬鎴愯嚜宸变笉鍠滄鐨勪换鍔�"
+      },
+      "MAQ0082": {
+        "title": "鐢变簬鎰忔枡涔嬪鐨勫洶闅撅紝鏈夊嚑娆℃垜鍐冲畾鏀惧純鏌愪簺椤圭洰"
+      },
+      "MAQ0084": {
+        "title": "鎴戝父甯告槸鍥㈤槦涓涓�涓彂鐜板伐浣滀腑鐨勬敼杩涙満浼氱殑浜�"
+      },
+      "MAQ0085": {
+        "title": "鎴戝畾鏈熶簡瑙f墍鍦ㄥ洟闃熺殑鏈�鏂扮姸鍐碉紝浠ョ‘淇濇垜浠兘澶熷疄鐜板洟闃熺洰鏍�"
+      },
+      "MAQ0086": {
+        "title": "鎴戝彂鐜板緢闅鹃�傚簲璁″垝鐨勬敼鍙橈紝鍥犱负鎬绘槸浼氭湁鐩稿綋澶х殑骞叉壈"
+      },
+      "MAQ0087": {
+        "title": "鍦ㄧぞ浜よ仛浼氱殑鍦哄悎鎷涘緟濂藉垰璁よ瘑鐨勪汉瀵规垜鏉ヨ鏄欢瀹规槗鐨勪簨"
+      },
+      "MAQ0088": {
+        "title": "鎴戝伓灏斾細璁╁埆浜轰负鎴戠殑閿欒鍙楀埌璐e"
+      },
+      "MAQ0089": {
+        "title": "鎴戝苟涓嶈兘瀹屽叏鎺屾帶鑷繁鐨勫懡杩�"
+      },
+      "MAQ0090": {
+        "title": "鎴戣寰楁縺鍔变竴涓柊鐨勮�屼笖鎴愬憳鑳屾櫙澶氭牱鍖栫殑鍥㈤槦鏄尯鍥伴毦鐨勪簨"
+      },
+      "MAQ0091": {
+        "title": "宸ヤ綔涓婄殑鍘嬪姏浠庢潵閮戒笉浼氬奖鍝嶆垜鐨勭潯鐪犺川閲�"
+      },
+      "MAQ0092": {
+        "title": "鎴戝�惧悜浜庨伩鍏嶅弬鍔犺繃澶氱殑绀句氦鎴栦汉闄呬氦寰�娲诲姩"
+      },
+      "MAQ0094": {
+        "title": "鎴戝苟涓嶆�绘槸鐭ラ亾濡備綍涓庡垰璁よ瘑鐨勪汉鏀�璋�"
+      },
+      "MAQ0095": {
+        "title": "鎴戝枩娆㈠鍛樺伐杩涜鏂颁换鍔$殑鍩硅锛屽苟鍚戜粬浠В閲婁负浠�涔堣繖浜涘煿璁鍥㈤槦鎴愬氨鍜屽伐浣滅哗鏁堝緢閲嶈"
+      },
+      "MAQ0097": {
+        "title": "鍒汉缁忓父鑳藉鍦ㄥ洟闃熷伐浣滅殑鎴愭灉涓彂鐜版垜鎵�娌℃湁鍙戠幇鐨勯敊璇�"
+      },
+      "MAQ0098": {
+        "title": "鎴戝�惧悜浜庤姳璐规瘮鍏朵粬浜烘洿澶氱殑鏃堕棿鏉ユ帰绱㈡暟鎹紝浠ュ鎵炬綔鍦ㄧ殑闂鍘熷洜锛屼粠鑰屼骇鐢熸湁鐢ㄧ殑瑙佽В"
+      },
+      "MAQ0099": {
+        "title": "濡傛灉鎴戠殑鑰佹澘涓嶅湪韬竟锛屾垜鎰挎剰鑷繁鍋氶噸瑕佺殑鍐冲畾"
+      },
+      "MAQ0100": {
+        "title": "鎴戜笉鍠滄闇�瑕佸紑鍙戞柊鐨勮В鍐虫柟妗堢殑宸ヤ綔"
+      },
+      "MAQ0101": {
+        "title": "鍙湁鍦ㄥ拰鑰佹澘鍏呭垎鍟嗚浜嗚嚜宸辩殑鎯虫硶鍚庯紝鎴戞墠浼氬惎鍔ㄦ煇涓柊涓炬帾"
+      },
+      "MAQ0103": {
+        "title": "鎴戜細鍔姏鍦ㄦ埅姝㈡棩鏈熷墠瀹屾垚浠诲姟锛屽厬鐜板伐浣滀腑鐨勬壙璇猴紝濡傛湁蹇呰鍙互鐗虹壊涓汉鏃堕棿"
+      },
+      "MAQ0104": {
+        "title": "鏈夋椂鎴戜細鍙楁儏缁敮閰嶈�屾棤娉曟帶鍒惰嚜宸辩殑搴斿鏂瑰紡"
+      },
+      "MAQ0106": {
+        "title": "鎴戠粡甯搁�氳繃鍙傚姞鐮旇浼氥�佺綉缁滅爺璁ㄤ細鍜岄槄璇绘潵鏇存柊鑷繁鐨勪笓涓氬拰琛屼笟鐭ヨ瘑"
+      },
+      "MAQ0107": {
+        "title": "鎴戝浜庣涓�鍗拌薄涓嶅ソ鐨勪汉涓嶅お鏈夎�愬績鍜岀ぜ璨�"
+      },
+      "MAQ0110": {
+        "title": "浜轰滑缁忓父鏉ユ壘鎴戣璁轰粬浠殑闂鎴栬嫤鎭�"
+      },
+      "MAQ0111": {
+        "title": "鎴戠粡甯稿府鍔╁埆浜烘洿濂藉湴鐞嗚В鍜屽鐞嗕粬浠嚜宸辩殑璐熼潰鎯呯华"
+      },
+      "MAQ0112": {
+        "title": "鎴戠殑鍚屼簨浠兘澶熷緢瀹规槗鐪嬪嚭鎴戠殑鎯呯华鐘舵��"
+      },
+      "MAQ0113": {
+        "title": "鎴戝苟涓嶆槸鎬绘湁鏃堕棿妫�鏌ユ垜鐨勫伐浣滐紝骞剁浉淇′笉妫�鏌ヤ篃闂涓嶅ぇ"
+      },
+      "MAQ0115": {
+        "title": "褰撴柊鐨勫伐浣滄祦绋嬫垨鎶�鏈寮曞叆鏃讹紝鎴戦�氬父鏄渶鏃╂帴鍙楀苟閲囩敤瀹冪殑浜�"
+      },
+      "MAQ0117": {
+        "title": "鍗充娇闈复楂樺帇鐨勫伐浣滐紝鎴戜篃浼氫繚鎸佷箰瑙傜殑鏈熸湜"
+      },
+      "MAQ0118": {
+        "title": "鏈夋椂鎴戜細寰堥毦鐞嗚В鑷繁鐨勬儏缁弽搴�"
+      },
+      "MAQ0119": {
+        "title": "鍦ㄥ伐浣滀腑锛屾垜缁忓父璁剧珛鏈夋寫鎴樻�х殑鐩爣锛岀劧鍚庡姫鍔涘疄鐜扮洰鏍�"
+      },
+      "MAQ0120": {
+        "title": "鎴戦潪甯告姷瑙﹂偅浜涗笉寰椾笉鍘诲弬鍔犵殑绀句氦娲诲姩锛岃涓洪偅浼氬緢蹇冪疮"
+      },
+      "MAQ0124": {
+        "title": "鎴戞�绘槸鐭ラ亾鑷繁鐨勬儏缁劅鍙椾互鍙婂師鍥�"
+      },
+      "MAQ0126": {
+        "title": "鎴戞洿鍠滄涓嶇揣涓嶆參锛屼粠瀹逛笉杩殑宸ヤ綔鑺傚锛岃�屼笉鍠滄缁忓父闇�瑕佸悓鏃跺畬鎴愬涓换鍔$殑宸ヤ綔鑺傚"
+      },
+      "MAQ0127": {
+        "title": "褰撴垜鎰忚瘑鍒版湁浜哄湪璇勪及鎴戠殑琛ㄧ幇鏃讹紝鎴戜細鍙樺緱姣斿埆浜烘洿鐒﹁檻"
+      },
+      "MAQ0129": {
+        "title": "褰撴垜涓嶅緱涓嶆寜鐓т换鍔$殑杞婚噸缂撴�ョ殑娆″簭鏉ュ伐浣滄椂锛屾垜浼氭湁涓�绉嶅彈闄愬埗鐨勬劅瑙�"
+      },
+      "MAQ0130": {
+        "title": "鎴戞湁鏃朵細鎰熷埌杩囧害鍔崇疮锛屼絾鏄垜濮嬬粓鐩镐俊鑷繁鏈夎冻澶熺殑绮惧姏鏉ュ畬鎴愭墍鏈夊伐浣滀换鍔�"
+      },
+      "MAQ0131": {
+        "title": "涓庝富鍔ㄦ壙鎷呯浉姣旓紝鎴戞洿鍠滄琚笂绾ц姹傚幓鎵挎媴鏌愰」浠诲姟鎴栧姞鍏ユ垨棰嗗涓�涓」鐩洟闃�"
+      },
+      "MAQ0132": {
+        "title": "浜轰滑閬囧埌鍥伴毦鏃堕�氬父浼氬埌鎴戣繖閲屾潵瀵绘眰鎯呮劅鏀寔"
+      },
+      "MAQ0133": {
+        "title": "鎴戝苟涓嶆�绘槸鑳藉璇氬疄鍦伴潰瀵硅嚜宸�"
+      },
+      "MAQ0134": {
+        "title": "鎴戞瘮杈冩搮闀垮畨鎱版伯涓ф垨鐢熸皵鐨勫悓浜嬶紝骞惰鍏跺喎闈欎笅鏉�"
+      },
+      "MAQ0135": {
+        "title": "鎴戣鐪熷�惧惉锛屼互姝ゆ潵浜嗚В鍒汉鐨勬劅鍙楀拰闇�姹�"
+      },
+      "MAQ0136": {
+        "title": "鎴戞湁鏃朵负浜嗚揪鎴愮洰鏍囦細瀵规斂绛栧拰瑙勫畾浣滅伒娲荤殑澶勭悊"
+      },
+      "MAQ0138": {
+        "title": "鎴戞洿鍠滄鍙娴嬬殑銆佹寜閮ㄥ氨鐝殑鏃ュ父宸ヤ綔"
+      },
+      "MAQ0140": {
+        "title": "鎴戝枩娆㈤偅绉嶄笂鍙稿鎴戝厖鍒嗘巿鏉冿紝璁╂垜鑳借嚜涓诲喅绛栫殑宸ヤ綔鐜"
+      },
+      "MAQ0141": {
+        "title": "鎴戞瘮鑷繁璁よ瘑鐨勫ぇ澶氭暟浜洪兘鏇村姞鍧氭寔鏄潪鍘熷垯"
+      },
+      "MAQ0142": {
+        "title": "鎴戝鍙備笌鍏泭浜嬩笟(蹇楁効娲诲姩)涓嶅お鎰熷叴瓒�"
+      },
+      "MAQ0143": {
+        "title": "鎴戜笉鍠滄鍒嗘瀽鍋囨兂浼氬彂鐢熺殑鎯呭鎴栫悊璁烘ā鍨�"
+      },
+      "MAQ0144": {
+        "title": "鍒濇涓庝汉瑙侀潰鏃讹紝鎴戞瘮杈冩矇榛樺瑷�锛屽父甯哥瓑寰呭鏂逛富鍔ㄥ紑鍙d氦璋�"
+      },
+      "MAQ0145": {
+        "title": "鎴戞湁鏃朵細鍋氬嚭涓�浜涜鎴戜簨鍚庢劅鍒板悗鎮旂殑鍐冲畾"
+      },
+      "MAQ0146": {
+        "title": "鏈夋椂鍊欙紝鎴戝緢闅剧悊瑙e埆浜虹殑鎯呯华鍙嶅簲"
+      },
+      "MAQ0147": {
+        "title": "鎴戞洿鍠滄閬靛惊宸茬粡瀹屽杽浜嗙殑宸ヤ綔娴佺▼锛岃�屼笉鏄�冭檻鏂版柟娉�"
+      },
+      "MAQ0149": {
+        "title": "鍦ㄤ汉闄呬氦寰�涓紝鎴戝父甯稿仛涓嶅埌鎹綅鎬濊��"
+      },
+      "MAQ0150": {
+        "title": "鎴戣寰楀ソ鍍忓叾浠栦汉姣旀垜鏇磋兘鎶曞叆鏇村绮惧姏鍘诲畬鎴愬伐浣滀换鍔�"
+      },
+      "MAQ0151": {
+        "title": "鎴戝枩娆㈡暣鐞嗗拰鍙戣〃鍏锋湁浠や汉淇℃湇鐨勭悊鐢辩殑婕旇锛屼互姝ゆ潵璇存湇鍏朵粬浜�"
+      },
+      "MAQ0152": {
+        "title": "鎴戜笉鍠滄濮嬬粓蹇妭濂忓湴宸ヤ綔"
+      },
+      "MAQ0156": {
+        "title": "褰撴垜鏈兘瀹炵幇宸ヤ綔涓殑涓�涓噸瑕佺洰鏍囨椂锛屾垜寰堝揩灏变細鎭㈠杩囨潵锛岄噸鏂颁笓娉ㄤ簬濡備綍杈炬垚鐩爣"
+      },
+      "MAQ0157": {
+        "title": "鎴戜笉鎰挎剰鏀瑰彉鎴戞棦鏈夌殑宸ヤ綔鏂瑰紡"
+      },
+      "MAQ0158": {
+        "title": "鎴戝枩娆笉鏂彉鍖栵紝鑰屼笉鏄ǔ瀹�"
+      },
+      "MAQ0159": {
+        "title": "褰撴垜鍦ㄥ伐浣滀腑寰楀埌璐熼潰鍙嶉鏃讹紝鎴戜篃浠庝笉鎬�鐤戣嚜宸卞伐浣滅殑鑳藉姏"
+      },
+      "MAQ0160": {
+        "title": "鎴戜竴鐩存湁寮虹儓鐨勬剰鎰垮幓棰嗗鍜屾寚鎸ヤ竴缇や汉"
+      },
+      "MAQ0161": {
+        "title": "闈㈠涓�涓殰纰嶆垨鍥伴毦锛屾垜浼氫笉鍋滃湴鍔姏鍘诲厠鏈嶅畠锛岀洿鍒版垚鍔�"
+      },
+      "MAQ0162": {
+        "title": "鍦ㄥ伐浣滈」鐩殑璁″垝闃舵锛屾垜鎬绘槸纭璇ラ」鐩殑鍒╃泭鏀稿叧鏂瑰苟纭繚浠栦滑瀵硅椤圭洰鐨勬壙璇�"
+      },
+      "MAQ0163": {
+        "title": "鏈夋椂鎴戜細鍙楀埌鎯呯华鐨勫奖鍝嶏紝鍋氬嚭涓�浜涜鑷繁鍚庢倲鐨勫喅瀹�"
+      },
+      "MAQ0164": {
+        "title": "鎴戞�绘槸鐭ラ亾鏄粈涔堝奖鍝嶄簡鎴戠殑鎯呯华"
+      },
+      "MAQ0165": {
+        "title": "褰撳埆浜哄悜鎴戞姳鎬ㄤ粬浠湪宸ヤ綔涓婃垨鐢熸椿涓鍒扮殑闂鏃讹紝鎴戝父甯告棤娉曟劅鍚岃韩鍙�"
+      },
+      "MAQ0166": {
+        "title": "瀵逛簬鎴戞潵璇达紝璇存湇鍒汉鏄欢瀹规槗鐨勪簨"
+      },
+      "MAQ0167": {
+        "title": "鏈夋椂鎴戝彂鐜板伐浣滀笂鐨勬媴蹇ф垨闂浼氬鎴戠殑涓汉鐢熸椿浜х敓璐熼潰褰卞搷"
+      },
+      "MAQ0168": {
+        "title": "鎴戞浘缁忓湪娌℃湁鐪熺殑鐢熺梾鐨勬儏鍐典笅锛屽悜鍏徃鎴栧鏍¤杩囩梾鍋�"
+      },
+      "MAQ0169": {
+        "title": "鎴戞湁鏃朵細鎸夌収鑷繁鐨勫叴瓒h�屼笉鏄换鍔$殑杞婚噸缂撴�ユ潵鍐冲畾鑷繁鐨勫伐浣滈『搴�"
+      },
+      "MAQ0170": {
+        "title": "宸ヤ綔璁╂垜鍏呮弧娲诲姏锛� 浠ヨ嚦浜庢垜鍙戠幇鑷繁甯稿父娌夋蹈鍦ㄥ伐浣滀腑锛岃繃浜嗙潯瑙夌殑鐐归兘涓嶇煡閬�"
+      },
+      "MAQ0171": {
+        "title": "鎴戣寰楀彉鍖栨槸闈炲父浠や汉鍏村鐨勶紝灏界瀵瑰叾浠栦汉鏉ヨ鍙兘寰堥毦"
+      },
+      "MAQ0172": {
+        "title": "鎴戞搮闀挎敼鍙樺埆浜虹殑瑙傜偣鍜岀湅娉�"
+      },
+      "MAQ0173": {
+        "title": "鎴戝苟涓嶆槸鎬昏兘鍋氬埌瑷�琛屼竴鑷�"
+      },
+      "MAQ0174": {
+        "title": "鏈夋椂鎴戝彂鐜版敼鍙樺埆浜虹殑瑙傜偣鍜岀湅娉曞緢闅�"
+      },
+      "MAQ0175": {
+        "title": "褰撻亣鍒拌嚜宸变笉鍠滄鎴栨瘮杈冨洶闅剧殑浠诲姟鏃讹紝鎴戦�氬父浼氭嫋寤朵竴娈垫椂闂村啀寮�濮�"
+      },
+      "MAQ0176": {
+        "title": "鎴戝枩娆笌鍏朵粬鍥㈤槦鎴愬憳杩涜鍗忎綔锛屼互閬垮厤閲嶅鎴栨棤鏁堢殑宸ヤ綔"
+      },
+      "MAQ0178": {
+        "title": "鎴戞�绘槸鎸夋椂瀹屾垚宸ヤ綔浠诲姟"
+      },
+      "MAQ0179": {
+        "title": "鎴戠涓�娆¤鍒板埆浜烘椂灏卞彲浠ュ緢瀹规槗鍦拌鎳備粬浠紝浣嗘槸涓嶇绗竴鍗拌薄濡備綍锛屾垜閮戒細淇濇寔绀艰矊鍜屽懆鍒�"
+      },
+      "MAQ0180": {
+        "title": "鎴戠粡甯告槸绗竴涓嚜鎰块瀵兼垨鍔犲叆椤圭洰鍥㈤槦鐨勪汉"
+      },
+      "MAQ0181": {
+        "title": "褰撴墜澶存鍦ㄥ仛鐨勯」鐩嚭鐜版剰澶栫殑鍥伴毦鏃讹紝鎴戝彂鐜版湁鏃舵垜浼氬仠涓嬫潵锛岃浆鑰屽仛鍏跺畠椤圭洰"
+      },
+      "MAQ0182": {
+        "title": "鎴戜細瀹氭湡鍚戞垜鐨勫洟闃熸垚鍛樻彁渚涘弽棣堬紝浠ュ府鍔╀粬浠釜浜哄彂灞曞苟瀹炵幇鑱屼笟鐩爣"
+      },
+      "MAQ0183": {
+        "title": "鎴戝枩娆㈢珛鍗冲紑濮嬪鐞嗗洶闅剧殑浠诲姟锛岃�屼笉鏄嫋寤�"
+      },
+      "MAQ0184": {
+        "title": "鍦ㄥ紑浼氭椂鎴戞�绘槸涓撴敞浜庝富棰橈紝涓庝粬浜轰簰鍔紝骞朵笓蹇冨湴鍊惧惉浠栦汉鐨勫彂瑷�"
+      },
+      "MAQ0185": {
+        "title": "鎴戜笉鍠滄涓鸿嚜宸辨垨鍥㈤槦璁剧珛鎸戞垬鎬х殑鐩爣锛屽苟涓嶅緱涓嶈姳棰濆鐨勬椂闂村幓杈炬垚杩欎簺鐩爣"
+      },
+      "MAQ0187": {
+        "title": "鐩告瘮涓庝粬浜哄悎浣滐紝鎴戞洿鎰挎剰鑷繁涓�浜哄畬鎴愬伐浣滀换鍔�"
+      },
+      "MAQ0190": {
+        "title": "姣忔寮�濮嬫柊宸ヤ綔鎴栨柊椤圭洰鏃讹紝鎴戦�氬父浼氬厖婊′俊蹇�"
+      },
+      "MAQ0191": {
+        "title": "鎴戝彂鐜颁富鍔ㄤ笌鍒氳璇嗙殑浜烘攢璋堟槸瀹规槗鐨勪簨"
+      },
+      "MAQ0192": {
+        "title": "鎴戞効鎰忚嚜宸卞仛鍐冲畾骞舵帴鍙楃浉搴旂殑鍚庢灉"
+      },
+      "MAQ0193": {
+        "title": "鎴戝伓灏斿洜涓哄繀椤诲畬鎴愬叾浠栭噸瑕佺殑浜嬫儏鑰屾病鏈夋寜鏃跺畬鎴愬伐浣滀换鍔�"
+      },
+      "MAQ0194": {
+        "title": "鍙鎰挎剰锛屾垜鍙互杞绘澗鍦颁笌浠讳綍浜轰氦鏈嬪弸"
+      },
+      "MAQ0195": {
+        "title": "鎴戝枩娆㈠澶嶆潅鏂规鐨勫埄寮婅繘琛屽叏闈㈢殑鍒嗘瀽"
+      },
+      "MAQ0197": {
+        "title": "鎴戜笉浼氬皾璇曡嚜宸卞幓鎻愬嚭鏂版兂娉曪紝鑰屾槸甯屾湜鎶婃绫讳簨鎯呰缁欏姝ゆ劅鍏磋叮鐨勪汉鍘诲仛"
+      },
+      "MAQ0199": {
+        "title": "鎴戞�绘槸鑳藉緢蹇兂鍑鸿鏈嶅埆浜虹殑鏈�浣虫柟娉�"
+      },
+      "MAQ0200": {
+        "title": "鎴戜笉浼氳鎸姌鎴栧け鏈涘鎴戠殑宸ヤ綔琛ㄧ幇浜х敓璐熼潰褰卞搷"
+      },
+      "MAQ0201": {
+        "title": "褰撴垜鍦ㄥ伐浣滀腑閬亣鎸姌鎴栧け璐ユ椂锛屾垜闇�瑕佽緝闀挎椂闂存墠鑳藉畬鍏ㄦ仮澶嶈嚜淇�"
+      },
+      "MAQ0202": {
+        "title": "瀵逛簬鎴戜笉鍠滄鐨勪汉锛屾垜鏃犳硶鎬绘槸淇濇寔绀艰矊鍜屾伃鏁�"
+      },
+      "MAQ0203": {
+        "title": "澶у鏁颁汉鏈�缁堥兘浼氬悓鎰忔垜鐨勮鐐�"
+      },
+      "MAQ0204": {
+        "title": "濡傛灉鎴戣涓哄垰璁よ瘑鐨勪汉瀵规垜涓嶇ぜ璨岋紝涔熶笉灏婇噸鎴戯紝閭f垜涔熶笉浼氬浠栦滑鏈夌ぜ璨屾垨灏婇噸"
+      },
+      "MAQ0205": {
+        "title": "鍦ㄨ繘琛屾煇涓」鐩椂锛屾垜浼氬畾鏈熺洃鎺ч」鐩噸瑕佽妭鐐圭殑瀹屾垚杩涘害锛屽苟璺熻繘璐熻矗鍚勪釜鍏蜂綋妯″潡鐨勫洟闃熸垚鍛�"
+      },
+      "MAQ0206": {
+        "title": "鍦ㄥ拰浠栦汉璋堝垽鐨勬椂鍊欙紝鎴戝伓灏斾細瑙夊緱缂轰箯鑷俊"
+      },
+      "MAQ0207": {
+        "title": "鏈夋椂鎴戝緢闅捐鏈嶅埆浜烘帴鍙楁垜鐨勫缓璁�"
+      },
+      "MAQ0208": {
+        "title": "鍗充娇涓嶆儏鎰匡紝鎴戜篃浼氶潪甯镐粩缁嗗湴妫�鏌ュ摢鎬曟渶灏忕殑缁嗚妭"
+      },
+      "MAQ0209": {
+        "title": "浠栦汉璁や负鎴戣兘鍔涗竴鑸�"
+      },
+      "MAQ0210": {
+        "title": "鎴戜笉鍠滄鍩硅鍥㈤槦涓殑鏂板憳宸ヤ互纭繚浠栦滑鍋氫簨鏂瑰紡鏄纭殑"
+      },
+      "MAQ0211": {
+        "title": "濡傛灉闇�瑕佺殑璇濓紝鎴戞�昏兘鎵惧埌鏇村鐨勬椂闂存潵瀹屾垚宸ヤ綔"
+      },
+      "MAQ0212": {
+        "title": "涓庢垜鐨勫悓浜嬬浉姣旓紝鎴戜笉澶枩娆㈡敹闆嗗拰鍒嗘瀽鏁版嵁銆�"
+      },
+      "MAQ0213": {
+        "title": "鎴戠‘淇濆厬鐜版墍鏈夊伐浣滀笂鐨勬壙璇猴紝鍥犱负杩欏鎴戣�岃█鏄竴涓弗鑲冦�佺鍦g殑鍘熷垯"
+      },
+      "MAQ0214": {
+        "title": "鍚屼簨浠粡甯告潵璇锋暀鎴戝簲璇ュ浣曞拰鍒汉娌熼�氭晱鎰熻瘽棰�"
+      },
+      "MAQ0216": {
+        "title": "灏界鏈夋椂鍙兘涓嶆柟渚匡紝浣嗘垜濮嬬粓閬靛畧鏀跨瓥鍜岃瀹�"
+      },
+      "MAQ0218": {
+        "title": "瀵逛簬閭d簺鎴戣涓烘瘮杈冨洶闅炬垨鑰呮垚鍔熷彲鑳芥�т笉楂樼殑椤圭洰锛屾垜缁忓父鎷栧欢鏃堕棿锛岃�屼笉绔嬪嵆鍚姩"
+      },
+      "MAQ0219": {
+        "title": "鎴戜粠鏈洜宸ヤ綔涓婄殑澶辫触鑰岀伆蹇�"
+      },
+      "MAQ0220": {
+        "title": "褰撴垜鐨勫伐浣滆礋鑽峰鍔犳椂锛屾湁鏃舵垜浼氭劅鍒板け鍘昏�愬績銆佸績鐑︽剰涔�"
+      },
+      "MAQ0221": {
+        "title": "鎴戝缁堢‘淇濇仾瀹堟垜鎵�鏈夌殑鑱屼笟鎵胯骞朵俊瀹堣瑷�"
+      },
+      "MAQ0223": {
+        "title": "鎴戞洿鍠滄閭d簺鍙互鍏呭垎鍙戞尌鍒涢�犳�х殑宸ヤ綔"
+      },
+      "MAQ0224": {
+        "title": "鏈夋椂鍊欏伐浣滀腑鐨勫け鏈涘拰澶辫触浼氫娇鎴戝ソ鍑犲ぉ閮芥棤娉曢泦涓敞鎰忓姏"
+      },
+      "MAQ0225": {
+        "title": "鎴戜笉鍠滄涓嶆柇鍦拌鏈嶅埆浜烘帴鍙楁垜鐨勫缓璁�"
+      },
+      "MAQ0226": {
+        "title": "鎴戝湪鍚屼簨涓湁鑳藉渾铻嶅湴鍜岄毦鐩稿鐨勪汉鎵撲氦閬撶殑鍚嶅0"
+      },
+      "MAQ0227": {
+        "title": "鎴戠粡甯稿鐞嗗緢澶氫笉鍚岀殑椤圭洰銆佹兂娉曟垨鑰呰璁猴紝鎴戝彂鐜拌繖璁╀汉绮剧鎸"
+      },
+      "MAQ0228": {
+        "title": "褰撲簨鎯呮病鏈夋寜鐓ф垜鐨勯鎯冲彂灞曟椂锛屾垜浼氬彉寰楁伯涓�"
+      },
+      "MAQ0229": {
+        "title": "鎴戝枩娆㈠弬鍔犲晢涓氱ぞ浜ゆ椿鍔�"
+      },
+      "MAQ0230": {
+        "title": "鏈夋椂鎴戝浜よ皥瀵硅薄鐨勬枃鍖栬儗鏅�佷範淇椼�佸拰绂佸繉涓嶅鏁忔劅"
+      },
+      "MAQ0231": {
+        "title": "鍦ㄧぞ浜や簰鍔ㄤ腑锛屾垜閫氬父瀵瑰埆浜虹殑闇�姹備笉澶熸晱鎰�"
+      },
+      "MAQ0232": {
+        "title": "鎴戝浠栦汉鐨勭涓�鍗拌薄閫氬父鏄噯纭殑"
+      },
+      "MAQ0233": {
+        "title": "鎴戦�氬父鑳藉湪宸ヤ綔涓帶鍒跺ソ鑷繁鐨勬儏缁�"
+      },
+      "MAQ0234": {
+        "title": "褰撴垜鍦ㄦ煇涓伐浣滈」鐩腑纰板埌鍥伴毦鏃讹紝鎴戞湁鏃朵細涓璇ラ」鐩紝杞�屽幓鍋氬叾瀹冮」鐩�"
+      },
+      "MAQ0235": {
+        "title": "鍦ㄦ垜鐨勭敓娲诲拰鑱屼笟涓紝鎴戞�绘槸鐭ラ亾鑷繁鎯宠浠�涔�"
+      },
+      "MAQ0236": {
+        "title": "鍜屾柊璁よ瘑鐨勪汉锛屾垜浠庝笉浼氭劅鍒版病璇濆彲璇�"
+      },
+      "MAQ0237": {
+        "title": "鍗充娇鍥㈤槦涓殑澶ч儴鍒嗘垚鍛樿窡鎴戠殑鎰忚/鐪嬫硶鐩稿乏锛屾垜閫氬父涔熶笉鎰挎剰鏀惧純鑷繁鐨勬剰瑙�/鐪嬫硶锛岃窡澶т紮鍎胯揪鎴愪竴鑷淬��"
+      },
+      "MAQ0240": {
+        "title": "濡傛灉鎴戝拰鍏朵粬浜哄悎浣滀竴椤逛换鍔★紝鎴戜細绛夌潃浠栦滑鏉ユ壘鎴戝崗璋冨伐浣�"
+      },
+      "MAQ0241": {
+        "title": "鎴戝皬鏃跺�欐浘缁忔嬁杩囨湰涓嶅睘浜庤嚜宸辩殑涓滆タ"
+      },
+      "MAQ0242": {
+        "title": "鍦ㄥ緱鍒拌�佹澘鐨勬槑纭寚绀哄墠锛屾垜閫氬父涓嶄細閲囧彇琛屽姩"
+      },
+      "MAQ0243": {
+        "title": "鎴戝父甯稿湪涓嬪睘鐨勫伐浣滄姤鍛婁腑鍙戠幇閿欒"
+      },
+      "MAQ0244": {
+        "title": "鎴戜粠鏈繚鍙嶈繃浜ら�氳鍒�"
+      },
+      "MAQ0245": {
+        "title": "鎴戝湪鍥㈤槦涓粡甯告槸鍕囦簬鎸戞垬鍥㈤槦宸ヤ綔璁炬兂鍜屾柟鍚戠殑浜�"
+      },
+      "MAQ0247": {
+        "title": "鍦ㄥ伐浣滈」鐩紑濮嬩箣鍓嶏紝鎴戜細鍜屽洟闃熸垚鍛樺厛寮�浼氬崗璋冿紝鍋氬ソ椤圭洰璁″垝"
+      },
+      "MAQ0248": {
+        "title": "鎴戜笉鎬庝箞鑺辨椂闂翠笌涓嬪睘璁ㄨ浠栦滑鐨勮亴涓氬彂灞曠洰鏍囨垨杩涘睍"
+      },
+      "MAQ0249": {
+        "title": "鎴戜粠涓嶆祻瑙堜笉濂界殑缃戠珯"
+      },
+      "MAQ0250": {
+        "title": "鎴戞湁鏃朵細闂茶亰鍒汉鐨勫闀块噷鐭�"
+      },
+      "MAQ0251": {
+        "title": "鏈璇烽�夆�滃悓鎰忊��"
+      },
+      "MAQ0252": {
+        "title": "鏈璇烽�夆�滈潪甯镐笉鍚屾剰鈥�"
+      }
+    }
+    },
+    "menu": "娴嬭瘯鍖呯鐞�/娴嬭瘯鍖呭垪琛�",
+    "hint": "杩欐槸淇敼鍚庣殑浜嬩腑鎻愮ず璇�",
+    "name": "楂樻槑",
+    "email": "2077506045@qq.com",
+    "add": {
+      "company": "TAI娴嬭瘯",
+      "type": "浜烘牸娴嬭瘯鍖�",
+      "area": "缇庡浗",
+      "product": "MAQV2",
+      "hrEmail": "4c08@qq.com",
+      "invalid": "2024-01-01 00:00:00",
+      "memberLang": "English",
+      "hrReportLang": "English",
+      "reportTemplate": "MAQV2-Complete-English",
+      "memberReportLang": "English"
+    },
+    "edit": {
+      "company": "TAI娴嬭瘯淇敼",
+      "area": "涓浗",
+      "type": "浜烘牸娴嬭瘯鍖�",
+      "product": "MAQV2",
+      "hrEmail": "2077506045@qq.com",
+      "invalid": "2025-01-01 09:00:00",
+      "memberLang": "涓枃",
+      "hrReportLang": "涓枃",
+      "reportTemplate": "MAQV2-Complete-Chinese",
+      "memberReportLang": "涓枃"
+    },
+    "info": {
+      "position":"鑱屽憳",
+      "dept": "浜轰簨閮�"
+    },
+    "downloadWaitTime": 20
+  },
+  "memberDetail": {
+    "add": {
+      "name": "鐧界憺杈�",
+      "dept": "浜轰簨閮�",
+      "email": "sadfasldf@qq.com",
+      "phone": "15930084180",
+      "remark": "杩欐槸涓�涓娉ㄤ俊鎭�"
+    },
+    "edit": {
+      "name": "楂樻槑",
+      "dept": "浜嬩笟閮�",
+      "email": "2077506045@qq.com",
+      "phone": "15011947664",
+      "remark": "杩欐槸涓�涓慨鏀瑰悗鐨勫娉ㄤ俊鎭�"
+    },
+    "downloadWaitTime": 20
+  },
+  "productAccredit": {
+    "menu": "娴嬭瘯鍖呯鐞�/浜у搧鍖呮巿鏉�",
+    "username": "ZCH2023",
+    "product": "CAQ",
+    "password": "123456",
+    "code": "ots",
+    "add": {
+      "company": "TAI浜у搧鍖呮巿鏉冩祴璇�",
+      "area": "涓浗",
+      "type": "鏅哄姏娴嬮獙鍖�",
+      "product": "CAQ",
+      "hrEmail": "2077506045@qq.com",
+      "invalid": "2025-01-01 09:00:00",
+      "memberLang": "涓枃",
+      "hrReportLang": "涓枃",
+      "reportTemplate": "CAQ-CAQ-Chinese",
+      "memberReportLang": "涓枃"
+    }
+
+  },
+  "groupReport": {
   }
-}
\ No newline at end of file
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/elements/export_test_data_elements.py b/elements/export_test_data_elements.py
new file mode 100644
index 0000000..d5fe2a7
--- /dev/null
+++ b/elements/export_test_data_elements.py
@@ -0,0 +1,30 @@
+from selenium.webdriver.common.by import By
+
+
+class ExportTestDataElements:
+    # 鏌ョ湅璇勬祴鎶ュ憡tab_name
+    tab_name_report = "鏌ョ湅璇勬祴鎶ュ憡"
+
+    # this-iframe
+    this_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/report/reportView/evaluationReport')]")
+
+    # 浜у搧鍖卻elect
+    product_select = (By.XPATH, "//select[@name='productId']")
+    # 浜у搧鍖卭ption
+    product_option = (By.XPATH, "//select[@name='productId']/option")
+    # 娴嬭瘯寮�濮嬫椂闂�
+    test_begin_time_input = (By.XPATH, "//input[@name='params[beginTime]']")
+    # 娴嬭瘯缁撴潫鏃堕棿
+    test_end_time_input = (By.XPATH, "//input[@name='params[endTime]']")
+    # this-table澶村閫夋
+    table_thead_checkbox = (By.XPATH, "//table[@id='bootstrap-table']/thead/tr//input")
+    # this-瀵煎嚭娴嬭瘯鏁版嵁鎸夐挳
+    export_test_data_btn = (By.XPATH, "//a[@onclick='exportDataReport();']")
+    # 鎼滅储鎸夐挳
+    search_btn = (By.XPATH, "//a[@onclick='$.table.search()']")
+    # 瀵煎嚭鏁版嵁
+    export_data_btn = (By.XPATH, "//a[contains(@onclick,'exportDataReport();')]")
+
+
+    # 鍔犺浇妗�
+    layer_reload = (By.XPATH, "//div[@class='loaderbox']/div")
diff --git a/elements/group_report_elements.py b/elements/group_report_elements.py
new file mode 100644
index 0000000..612f672
--- /dev/null
+++ b/elements/group_report_elements.py
@@ -0,0 +1,36 @@
+from selenium.webdriver.common.by import By
+
+
+class GroupReportElements:
+    # 鏌ョ湅璇勬祴鎶ュ憡tab_name
+    tab_name_report = "缁勫埆鎶ュ憡"
+
+    # this-iframe
+    this_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/groupReport')]")
+    # 鏂板缁勫埆鎶ュ憡iframe
+    add_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/groupReport/add')]")
+
+    # 鏂板鎸夐挳
+    add_btn = (By.XPATH, "//a[@onclick='$.operate.add()']")
+    # 鍒犻櫎鎸夐挳
+    delete_btn = (By.XPATH, "//a[@onclick='$.operate.removeAll()']")
+    # 绗竴涓粍鍒暟鎹寜閽�
+    group_data_btn = (By.XPATH, "//a[contains(@onclick,'downGroupData')]")
+    # 绗竴涓粍鍒姤鍛婃寜閽�
+    group_report_btn = (By.XPATH, "//a[contains(@onclick,'downReport')]")
+    # 鎼滅储鎸夐挳
+    search_btn = (By.XPATH, "//a[@onclick='$.table.search()']")
+
+    # add-鍚嶇О
+    add_name_input = (By.XPATH, "//input[@name='name']")
+    # add-瀵煎叆鏁版嵁
+    add_load_file_input = (By.XPATH, "//input[@name='locationFile']")
+
+    # this-浜屾纭鎸夐挳
+    layer_confirm_btn = (By.XPATH, "//div/a[text()='纭']")
+
+    # this-table澶村閫夋
+    table_thead_checkbox = (By.XPATH, "//table[@id='bootstrap-table']/thead/tr//input")
+
+    # 鍔犺浇妗�
+    layer_reload = (By.XPATH, "//div[@class='loaderbox']/div")
diff --git a/elements/home_elements.py b/elements/home_elements.py
index 5202115..8465060 100644
--- a/elements/home_elements.py
+++ b/elements/home_elements.py
@@ -1,8 +1,17 @@
 from selenium.webdriver.common.by import By
 
+elements = [
+    {'name': 'menu_ul', 'desc': '渚ц竟鏍忚彍鍗�', 'loc': (By.XPATH, "//ul[@id='side-menu']"), 'action': None}
+]
+
 
 class HomeElements:
     # 渚ц竟鏍忚彍鍗�
     menu_ul = (By.XPATH, "//ul[@id='side-menu']")
+    # 鐢ㄦ埛鑿滃崟3
+    user_menu_3 = (By.XPATH, "//ul[@class='nav navbar-top-links navbar-right welcome-message']/li[3]")
+    # 鐧诲嚭鎸夐挳
+    logout_btn = (By.XPATH, "//a[@href='logout']")
 
-
+    # page鎵�鏈塼ab鐨刟鏍囩
+    nav_tabs = (By.XPATH, "//nav[@class='page-tabs menuTabs']/div/a")
\ No newline at end of file
diff --git a/elements/login_elements.py b/elements/login_elements.py
index d19e2bd..6a72e1e 100644
--- a/elements/login_elements.py
+++ b/elements/login_elements.py
@@ -1,6 +1,13 @@
 from selenium.webdriver.common.by import By
 
 
+# elements = [
+#     {'name': 'username_ipt', 'desc': '鐢ㄦ埛鍚嶈緭鍏�', 'loc': (By.XPATH, "//form//input[@name='username']"), 'action': 'send_keys()'},
+#     {'name': 'password_ipt', 'desc': '鐧诲綍瀵嗙爜杈撳叆', 'loc': (By.XPATH, "//form//input[@name='password']"), 'action': 'send_keys()'},
+#     {'name': 'code_ipt', 'desc': '楠岃瘉鐮佽緭鍏�', 'loc': (By.XPATH, "//form//input[@name='validateCode']"), 'action': 'send_keys()'},
+#     {'name': 'login_btn', 'desc': '鐧诲綍鎸夐挳鐐瑰嚮', 'loc': (By.XPATH, "//form//button"), 'action': 'click()'},
+# ]
+
 class LoginElements:
     # 鐧诲綍鐢ㄦ埛鍚嶈緭鍏ユ
     username_input = (By.XPATH, "//form//input[@name='username']")
@@ -10,4 +17,5 @@
     validate_code_input = (By.XPATH, "//form//input[@name='validateCode']")
     # 鐧诲綍鎸夐挳
     login_btn = (By.XPATH, "//form//button")
-
+    # 棣栭〉宸︿笂logo
+    home_logo = (By.XPATH, "//span[text()='TAI-OTS']")
diff --git a/elements/maq_answer_elements.py b/elements/maq_answer_elements.py
index e14a358..5f0a9ad 100644
--- a/elements/maq_answer_elements.py
+++ b/elements/maq_answer_elements.py
@@ -1,9 +1,22 @@
 from selenium.webdriver.common.by import By
 
+# elements = [
+#     {'name': 'start_btn', 'desc': '寮�濮嬫祴璇曟寜閽�', 'loc': (By.XPATH, "//button"), 'action': 'click()'},
+#     {'name': 'options', 'desc': '棰樼洰閫夐」', 'loc': (By.XPATH, "//span[@class='q-item-span-content']"), 'action': None},
+#     {'name': 'continue_testing_btn', 'desc': '缁х画娴嬭瘯鎸夐挳', 'loc': (By.XPATH, "//button/span[text()='缁х画娴嬭瘯']"), 'action': None},
+#     {'name': 'submit_btn', 'desc': '鎻愪氦鎸夐挳', 'loc': (By.XPATH, "//button/span[contains(text(),'鎻愪氦')]/.."), 'action': None},
+#     {'name': 'upload_success_title', 'desc': '涓婁紶鎴愬姛鏍囬',
+#      'loc': (By.XPATH, "//main/h2[contains(text(), '鏁版嵁宸茬粡鎴愬姛鍦颁笂浼犺嚦鏈嶅姟鍣�')]"), 'wait': 10, 'action': 'text()'},
+#     {'name': 'loading_text', 'desc': '鍔犺浇妗嗘枃瀛�', 'loc': (By.XPATH, "//div[@class='el-loading-spinner']/p"),
+#      'action': 'text()'},
+#     {'name': 'title', 'desc': '鏍囬鏂囧瓧', 'loc': (By.XPATH, "//div[@class='align-center']/span[2]"), 'wait': 10, 'action': 'text()'},
+# ]
 
 class MAQAnswerElements:
     # 寮�濮嬫祴璇曟寜閽�
     start_btn = (By.XPATH, "//button")
+    # 棰樼洰
+    q_title = (By.XPATH, "//div[@class='q-title']")
     # 棰樼洰閫夐」
     options = (By.XPATH, "//span[@class='q-item-span-content']")
     # 绂佺敤鐨勯�夐」
@@ -14,10 +27,14 @@
     submit_btn = (By.XPATH, "//button/span[contains(text(),'鎻愪氦')]/..")
     # 涓婁紶鎴愬姛鏍囬
     upload_success_title = (By.XPATH, "//main/h2[contains(text(), '鏁版嵁宸茬粡鎴愬姛鍦颁笂浼犺嚦鏈嶅姟鍣�')]")
+    # 涓婁紶鎴愬姛鏍囬
+    network_exception_title = (By.XPATH, "//main/h2[contains(text(), '缃戠粶寮傚父')]")
 
     # 鍔犺浇妗嗘枃瀛�
     loading_text = (By.XPATH, "//div[@class='el-loading-spinner']/p")
 
+    # 浜嬩腑鎻愮ず璇唴瀹�
+    hint_text = (By.XPATH, "//main[@class='el-main']/div/p[2]/span[3]/font")
+
     # 鏍囬鏂囧瓧
     title = (By.XPATH, "//div[@class='align-center']/span[2]")
-
diff --git a/elements/member_detail_elements.py b/elements/member_detail_elements.py
new file mode 100644
index 0000000..f077ecf
--- /dev/null
+++ b/elements/member_detail_elements.py
@@ -0,0 +1,95 @@
+from selenium.webdriver.common.by import By
+
+
+class MemberDetailElements:
+    # 鍙戦�佺姸鎬乼ab_name
+    tab_name_send_status = "鏌ョ湅鍙戦�佺姸鎬�"
+    # 鏌ョ湅鎶ュ憡tab_name
+    tab_name_report = "鏌ョ湅鍙戦�佺姸鎬�"
+    # 璇勬祴浜哄憳鍚嶅崟tab_name
+    tab_name_member_detail = "璇勬祴浜哄憳鍚嶅崟"
+    # 鏌ョ湅鎶ュ憡閭欢鍙戦�佽褰�
+    tab_name_report_send_log = "鏌ョ湅鎶ュ憡閭欢鍙戦�佽褰�"
+
+    # 璇勬祴浜哄憳鍚嶅崟iframe
+    this_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/testMember/memberDetail')]")
+    # 鏂板iframe
+    add_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/testMember/add')]")
+    # 淇敼娴嬭瘯鍖卛frame
+    edit_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/testMember/edit')]")
+    # 鏌ョ湅鍙戦�佺姸鎬乮frame
+    send_status_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/sendtask/condition')]")
+    # 鏌ョ湅鎶ュ憡iframe
+    report_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/report/member/reportView')]")
+    # 鏌ョ湅鎶ュ憡閭欢鍙戦�佽褰昳frame
+    report_send_log_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/report/hrSendlog')]")
+
+
+    # this-鏂板鎸夐挳
+    create_btn = (By.XPATH, "//a[@onclick='$.operate.add()']")
+    # this-淇敼鎸夐挳
+    edit_btn = (By.XPATH, "//a[@onclick='$.operate.edit()']")
+    # this-鍒楄〃閭鍦板潃
+    table_email_td = (By.XPATH, "//table[@id='bootstrap-table']/tbody/tr/td[4]")
+    # this-鍒楄〃tr
+    table_data_tr = (By.XPATH, "//table[@id='bootstrap-table']/tbody/tr")
+    # this-table澶村閫夋
+    table_thead_checkbox = (By.XPATH, "//table[@id='bootstrap-table']/thead/tr//input")
+    # this-table绗竴琛宼r鏌ョ湅鎶ュ憡鎸夐挳
+    table_report_btn = (By.XPATH, "//table[@id='bootstrap-table']/tbody/tr[1]//a")
+    # this-鍒犻櫎鎸夐挳
+    delete_btn = (By.XPATH, "//a[@onclick='$.operate.removeAll()']")
+    # this-瀵煎嚭鎸夐挳
+    export_btn = (By.XPATH, "//a[@onclick='$.table.exportExcel()']")
+    # this-鎵归噺瀵煎叆鎸夐挳
+    import_btn = (By.XPATH, "//a[@onclick='importExcel()']")
+    # this-鏂囦欢涓婁紶杈撳叆妗�
+    import_input = (By.XPATH, "//input[@id='file']")
+    # this-瀵煎叆鎴愬姛鎻愮ず
+    import_success_text = (By.XPATH, "//div[contains(text(), '鎭枩')]")
+    # 纭瀵煎叆鎸夐挳
+    import_confirm_btn = (By.XPATH, "//a[contains(text(), '瀵煎叆')]")
+    # this-鍙戦�侀偖浠舵寜閽�
+    send_email_btn = (By.XPATH, "//a[@onclick='javascript:sendEmail()']")
+    # this-鍙戦�佺煭淇℃寜閽�
+    send_sms_btn = (By.XPATH, "//a[@onclick='javascript:sendSms()']")
+    # this-瀵煎嚭娴嬭瘯閾炬帴鎸夐挳
+    export_url_btn = (By.XPATH, "//a[@onclick='exportExcelTestLink()']")
+    # this-鏌ョ湅鎶ュ憡閭欢鍙戦�佽褰曟寜閽�
+    report_send_log_btn = (By.XPATH, "//a[@onclick='opensendHrlog()']")
+    # this-鏌ョ湅鍙戦�佺姸鎬佹寜閽�
+    send_status_btn = (By.XPATH, "//a[@onclick='opensendlog()']")
+    # this-浜屾纭鎸夐挳
+    layer_confirm_btn = (By.XPATH, "//div/a[text()='纭']")
+
+    # add-濮撳悕
+    add_member_name_input = (By.XPATH, "//input[@name='memberName']")
+    # add-閮ㄩ棬
+    add_member_dept_input = (By.XPATH, "//input[@name='memberDept']")
+    # add-閭
+    add_member_email_input = (By.XPATH, "//textarea[@name='memberEmail']")
+    # add-鎵嬫満鍙风爜
+    add_member_phone_input = (By.XPATH, "//input[@name='memberPhone']")
+    # add-澶囨敞
+    add_remark_input = (By.XPATH, "//input[@name='remark']")
+    # add-纭鎸夐挳
+    add_confirm_btn = (By.XPATH, "//iframe[contains(@src,'/exam/testMember/add')]/../../div[3]/a[1]")
+
+    # edit-纭鎸夐挳
+    edit_confirm_btn = (By.XPATH, "//iframe[contains(@src,'/exam/testMember/edit')]/../../div[3]/a[1]")
+    edit_cancel_btn = (By.XPATH, "//iframe[contains(@src,'/exam/testMember/edit')]/../../div[3]/a[2]")
+
+    # send_status-table鍒楄〃tr
+    send_status_table_tr = (By.XPATH, "//table[@id='bootstrap-table']/tbody/tr")
+
+    # report_send_log-HR閭欢琛ュ彂
+    hr_resend_btn = (By.XPATH, "//a[@onclick='reissueEmailNew(1)']")
+    # report_send_log-娴嬭瘯鑰呴偖浠惰ˉ鍙�
+    member_resend_btn = (By.XPATH, "//a[@onclick='reissueEmailNew(2)']")
+    # report_send_log-table绗竴琛岄噸璇曟鏁�
+    resend_number_text = (By.XPATH, "//table[@id='bootstrap-table']/tbody/tr[1]/td[10]")
+
+    # 鎿嶄綔鎴愬姛寮圭獥
+    operate_success_layer = (By.XPATH, "//div[text()='鎿嶄綔鎴愬姛']")
+    # 鍔犺浇妗�
+    layer_reload = (By.XPATH, "//div[@class='loaderbox']/div")
diff --git a/elements/product_accredit__elements.py b/elements/product_accredit__elements.py
new file mode 100644
index 0000000..e52bb4c
--- /dev/null
+++ b/elements/product_accredit__elements.py
@@ -0,0 +1,35 @@
+from selenium.webdriver.common.by import By
+
+
+class ProductAccreditElements:
+    # 鏌ョ湅璇勬祴鎶ュ憡tab_name
+    tab_name_report = "浜у搧鍖呮巿鏉�"
+
+    # this-iframe
+    this_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/paper/dis')]")
+    # 鎺堟潈绐楀彛
+    accredit_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/paper/edit/')]")
+
+    # 鐢ㄦ埛鍚嶆
+    search_username_input = (By.XPATH, "//input[@name='loginName']")
+    # 鎼滅储鎸夐挳
+    search_btn = (By.XPATH, "//a[@onclick='$.table.search()']")
+    # this-table澶村閫夋
+    table_thead_checkbox = (By.XPATH, "//table[@id='bootstrap-table']/thead/tr//input")
+
+    # 浜у搧鍖呮巿鏉冩寜閽�
+    product_btn = (By.XPATH, "//a[contains(@onclick,'$.operate.edit')]")
+
+    # 鎺堟潈绐楀彛浜у搧鍖呭垪琛╯elect
+    accredit_product_select = (By.XPATH, "//select[@name='prodId']")
+    # 鎺堟潈绐楀彛浜у搧鍖呭垪琛╫ption
+    accredit_product_option = (By.XPATH, "//select[@name='prodId']/option")
+    # 鎶ュ憡妯℃澘绗竴涓�
+    accredit_temp_checkbox = (By.XPATH, "//ui[@id='tempB']/li[1]/span/input")
+    # 浜у搧鍖呮巿鏉冩寜閽�
+    accredit_accredit_btn = (By.XPATH, "//a[contains(@onclick,'insertRow()')]")
+    # this-浜屾纭鎸夐挳
+    layer_confirm_btn = (By.XPATH, "//div/a[text()='纭']")
+
+    # 鍔犺浇妗�
+    layer_reload = (By.XPATH, "//div[@class='loaderbox']/div")
diff --git a/elements/report_elements.py b/elements/report_elements.py
new file mode 100644
index 0000000..8fb1139
--- /dev/null
+++ b/elements/report_elements.py
@@ -0,0 +1,27 @@
+from selenium.webdriver.common.by import By
+
+
+class ReportElements:
+    # 鏌ョ湅璇勬祴鎶ュ憡tab_name
+    tab_name_report = "鏌ョ湅璇勬祴鎶ュ憡"
+
+    # this-iframe
+    this_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/report/reportView')]")
+
+    # 閲嶆柊鐢熸垚鎶ュ憡骞跺鍑�
+    generate_export_btn = (By.XPATH, "//a[@onclick='exportDetailReportExcel();']")
+
+    # 涓嬭浇宸茬敓鎴愭姤鍛�
+    download_report_btn = (By.XPATH, "//a[@onclick='exportSendedReportExcel();']")
+
+    # 瀵煎嚭鎶ュ憡
+    export_btn = (By.XPATH, "//a[contains(@onclick,'testerReport')]")
+
+    # 瀵煎嚭鏁版嵁
+    export_data_btn = (By.XPATH, "//a[contains(@onclick,'exportDataReport();')]")
+
+    # this-table澶村閫夋
+    table_thead_checkbox = (By.XPATH, "//table[@id='bootstrap-table']/thead/tr//input")
+
+    # 鍔犺浇妗�
+    layer_reload = (By.XPATH, "//div[@class='loaderbox']/div")
diff --git a/elements/share_add_elements.py b/elements/share_add_elements.py
index 4dd516f..738d200 100644
--- a/elements/share_add_elements.py
+++ b/elements/share_add_elements.py
@@ -1,6 +1,40 @@
 from selenium.webdriver.common.by import By
 
 
+# elements = [
+#     {'name': 'name_input', 'desc': '濮撳悕鏂囨湰妗�', 'loc': (By.XPATH, "//input[@name='memberName']"), 'action': 'send_keys()'},
+#     {'name': 'email_input', 'desc': '閭鏂囨湰妗�', 'loc': (By.XPATH, "//textarea[@name='memberEmail']"), 'action': 'send_keys()'},
+#     {'name': 'phone_input', 'desc': '鎵嬫満鍙风爜鏂囨湰妗�', 'loc': (By.XPATH, "//textarea[@name='memberPhone']"), 'action': 'send_keys()'},
+#     {'name': 'submit_btn', 'desc': '鎻愪氦鎸夐挳', 'loc': (By.XPATH, "//button"), 'wait': 10, 'action': 'click()'},
+#
+#     {'name': 'test_url_text', 'desc': '娴嬭瘯閾炬帴', 'loc': (By.XPATH, "//a"), 'action': 'text()'},
+#
+#     {'name': 'fill_email_input', 'desc': '鍩烘湰淇℃伅-鐢靛瓙閭', 'loc': (By.XPATH, "//form/div[2]//input"), 'action': 'send_keys()'},
+#     {'name': 'fill_position_input', 'desc': '鍩烘湰淇℃伅-鑱屼綅', 'loc': (By.XPATH, "//form/div[3]//input"), 'action': 'send_keys()'},
+#     {'name': 'fill_dept_input', 'desc': '鍩烘湰淇℃伅-閮ㄩ棬', 'loc': (By.XPATH, "//form/div[4]//input"), 'action': 'send_keys()'},
+#
+#     {'name': 'ciaq_email_input', 'desc': 'ciaq-閭', 'loc': (By.XPATH, "//form/div[2]//input"), 'action': 'send_keys()'},
+#     {'name': 'ciaq_sex_select', 'desc': 'ciaq-鎬у埆閫夋嫨', 'loc': (By.XPATH, "//form/div[3]//input"), 'optionsLoc': (By.XPATH, "//form/div[3]//ul/li[contains(@class,'el-select-dropdown__item')]/span"), 'action': 'select()'},
+#     {'name': 'ciaq_age_input', 'desc': 'ciaq-骞撮緞', 'loc': (By.XPATH, "//form/div[4]//input"), 'action': 'send_keys()'},
+#     {'name': 'ciaq_grade_select', 'desc': 'ciaq-骞寸骇閫夋嫨', 'loc': (By.XPATH, "//form/div[5]//input"), 'optionsLoc': (By.XPATH, "//form/div[5]//ul/li[contains(@class,'el-select-dropdown__item')]/span"), 'action': 'select()'},
+#     {'name': 'ciaq_address_input', 'desc': 'ciaq-楂樹腑鍦板潃', 'loc': (By.XPATH, "//form/div[6]//input"), 'action': 'send_keys()'},
+#     {'name': 'ciaq_university_input', 'desc': 'ciaq-澶у鍚嶇О', 'loc': (By.XPATH, "//form/div[7]//input"), 'action': 'send_keys()'},
+#     {'name': 'ciaq_universityAddress_input', 'desc': 'ciaq-澶у鍦板潃', 'loc': (By.XPATH, "//form/div[8]//input"), 'action': 'send_keys()'},
+#     {'name': 'ciaq_college_input', 'desc': 'ciaq-瀛﹂櫌鍚嶇О', 'loc': (By.XPATH, "//form/div[9]//input"), 'action': 'send_keys()'},
+#     {'name': 'ciaq_major_input', 'desc': 'ciaq-涓撲笟鍚嶇О', 'loc': (By.XPATH, "//form/div[10]//input"), 'action': 'send_keys()'},
+#     {'name': 'ciaq_subject_select', 'desc': 'ciaq-涓撲笟绫诲埆閫夋嫨', 'loc': (By.XPATH, "//form/div[11]//input"),
+#      'optionsLoc': (By.XPATH, "//form/div[11]//ul/li[contains(@class,'el-select-dropdown__item')]/span"),
+#      'action': 'select()'},
+#     {'name': 'ciaq_GPA_input', 'desc': 'ciaq-GPA', 'loc': (By.XPATH, "//form/div[12]//input"), 'action': 'send_keys()'},
+#     {'name': 'ciaq_work_input', 'desc': 'ciaq-GPA', 'loc': (By.XPATH, "//form/div[13]//input"), 'action': 'send_keys()'},
+#     {'name': 'ciaq_status_select', 'desc': 'ciaq-姹傝亴鐘舵�侀�夋嫨', 'loc': (By.XPATH, "//form/div[14]//input"),
+#      'optionsLoc': (By.XPATH, "//form/div[14]//ul/li[contains(@class,'el-select-dropdown__item')]/span"),
+#      'action': 'select()'},
+#     {'name': 'ciaq_workExperience_select', 'desc': 'ciaq-宸ヤ綔缁忛獙閫夋嫨', 'loc': (By.XPATH, "//form/div[15]//input"),
+#      'optionsLoc': (By.XPATH, "//form/div[15]//ul/li[contains(@class,'el-select-dropdown__item')]/span"),
+#      'action': 'select()'},
+# ]
+
 class ShareAddElements:
     # 濮撳悕
     name = (By.XPATH, "//input[@name='memberName']")
diff --git a/elements/test_package_list_elements.py b/elements/test_package_list_elements.py
index a8a6406..5230fe7 100644
--- a/elements/test_package_list_elements.py
+++ b/elements/test_package_list_elements.py
@@ -1,29 +1,91 @@
 from selenium.webdriver.common.by import By
 
+# elements = [
+#     {'name': 'this_iframe', 'desc': '娴嬭瘯鍖呭垪琛╥frame', 'loc': (By.XPATH, "//iframe[@src='/exam/test_package']"), 'action': 'iframe()'},
+#     {'name': 'add_iframe', '娣诲姞娴嬭瘯鍖卛frame': '渚ц竟鏍忚彍鍗�', 'loc': (By.XPATH, "//iframe[@src='/exam/test_package/add']"), 'action': 'iframe()'},
+#     {'name': 'prodTree_iframe', 'desc': '浜у搧鍖呮爲iframe', 'loc': (By.XPATH, "//iframe[contains(@src,'/exam/product/getProdList')]"), 'action': 'iframe()'},
+#     {'name': 'share_iframe', 'desc': '鍒嗕韩iframe', 'loc': (By.XPATH, "//iframe[contains(@src,'/exam/test_package/share')]"), 'action': 'iframe()'},
+#
+#     {'name': 'create_btn', 'desc': '鍒涘缓鎸夐挳', 'loc': (By.XPATH, "//a[@onclick='$.operate.add()']"), 'action': 'click()'},
+#     {'name': 'table_packageName_a', 'desc': '娴嬭瘯鍖呭垪琛ㄦ祴璇曞寘鍚嶇Оa鏍囩', 'loc': (By.XPATH, "//table[@id='bootstrap-table']/tbody/tr/td[2]/a"), 'action': None},
+#     {'name': 'table_packageName_option', 'desc': '娴嬭瘯鍖呭垪琛ㄦ祴璇曞寘鍚嶇Оa鏍囩', 'loc': (By.XPATH, "//table[@id='bootstrap-table']/tbody/tr/td[2]/a"), 'action': 'option()'},
+#     {'name': 'table_package_tr', 'desc': '鍒楄〃tr', 'loc': (By.XPATH, "//table[@id='bootstrap-table']/tbody/tr"), 'action': None},
+#     {'name': 'share_1_btn', 'desc': '鐢熸垚鍒嗕韩閾炬帴鎸夐挳', 'loc': (By.XPATH, "//a[@onclick='share(1)']"), 'action': 'click()'},
+#     {'name': 'delete_btn', 'desc': '鍒犻櫎鎸夐挳', 'loc': (By.XPATH, "//a[@onclick='$.operate.removeAll()']"), 'action': 'click()'},
+#     {'name': 'delete_confirm_btn', 'desc': '鍒犻櫎纭鎸夐挳', 'loc': (By.XPATH, "//div/a[text()='纭']"), 'action': 'click()'},
+#
+#     {'name': 'add_testPackageName_input', 'desc': 'add-娴嬭瘯鍖呭悕绉拌緭鍏�', 'loc': (By.XPATH, "//input[@name='testName']"), 'action': 'send_keys()'},
+#     {'name': 'add_reportCompanyName_input', 'desc': 'add-鎶ュ憡浼佷笟鍚嶇О杈撳叆', 'loc': (By.XPATH, "//input[@name='reportCompanyName']"), 'action': 'send_keys()'},
+#     {'name': 'add_testPackageType_select', 'desc': 'add-绫诲瀷閫夋嫨', 'loc': (By.XPATH, "//select[@name='testType']/../span"), 'optionsLoc': (By.XPATH, "//ul[contains(@id,'select2-testType')]/li"), 'action': 'select()'},
+#     {'name': 'add_testPackageArea_select', 'desc': 'add-鍖哄煙閫夋嫨', 'loc': (By.XPATH, "//select[@name='testArea']/../span"), 'optionsLoc': (By.XPATH, "//ul[contains(@id,'select2-testArea')]/li"), 'action': 'select()'},
+#     {'name': 'add_prodTree_btn', 'desc': 'add-浜у搧鍖呮爲寮瑰嚭鎸夐挳', 'loc': (By.XPATH, "//span[@onclick='selectProdTree()']"), 'action': 'click()'},
+#     {'name': 'add_hrEmail_input', 'desc': 'add-HR鎺ユ敹鎶ュ憡閭杈撳叆', 'loc': (By.XPATH, "//input[@name='testEmail']"), 'action': 'send_keys()'},
+#     {'name': 'add_invalidTime_input', 'desc': 'add-鏈夋晥鏈熻緭鍏�', 'loc': (By.XPATH, "//input[@name='invalidTime']"), 'action': 'send_keys()'},
+#     {'name': 'add_invalidTime_btn', 'desc': 'add-鏈夋晥鏈熺偣鍑�', 'loc': (By.XPATH, "//input[@name='invalidTime']"), 'action': 'click()'},
+#     {'name': 'add_templateLangType_select', 'desc': 'add-娴嬭瘯鑰呴個璇烽偖浠跺唴瀹规ā鏉块�夋嫨', 'loc': (By.XPATH, "//select[@name='templateLangType']/../button"), 'optionsLoc': (By.XPATH, "//select[@name='templateLangType']/../div/div/ul/li/a/span[2]"), 'action': 'select()'},
+#     {'name': 'add_hrTemplateLangType_select', 'desc': 'add-hr璇█绫诲瀷閫夋嫨', 'loc': (By.XPATH, "//select[@name='hrTemplateLangType']/../button"), 'optionsLoc': (By.XPATH, "//select[@name='hrTemplateLangType']/../div/div/ul/li/a/span[2]"), 'action': 'select()'},
+#     {'name': 'add_reportTemplateId_select', 'desc': 'add-鎶ュ憡妯℃澘閫夋嫨', 'loc': (By.XPATH, "//select[@name='reportTemplateId']/../button"), 'optionsLoc': (By.XPATH, "//select[@name='reportTemplateId']/../div/div/ul/li/a/span[2]"), 'action': 'select()'},
+#     {'name': 'add_position_input', 'desc': 'add-瑕佽瘎浠风殑宀椾綅杈撳叆', 'loc': (By.XPATH, "//input[@name='position']"), 'action': 'send_keys()'},
+#     {'name': 'add_professionalCategory_input', 'desc': 'add-鑱屼笟澶х被杈撳叆', 'loc': (By.XPATH, "//input[@name='professionalCategory']"), 'action': 'send_keys()'},
+#     {'name': 'add_superiorPosition_input', 'desc': 'add-涓婄骇宀椾綅杈撳叆', 'loc': (By.XPATH, "//input[@name='superiorPosition']"), 'action': 'send_keys()'},
+#     {'name': 'add_autoSendReport_checkbox', 'desc': 'add-娴嬭瘯鑰呮帴鏀舵姤鍛婂閫夋', 'loc': (By.XPATH, "//input[@name='autoSendReport']"), 'action': 'click()'},
+#     {'name': 'add_memberTemplateLangType_select', 'desc': 'add-娴嬭瘯鑰呮姤鍛婅瑷�绫诲瀷閫夋嫨', 'loc': (By.XPATH, "//select[@name='memberTemplateLangType']/../button"), 'optionsLoc': (By.XPATH, "//select[@name='memberTemplateLangType']/../div/div/ul/li/a/span[2]"), 'action': 'select()'},
+#     {'name': 'add_code_checkbox', 'desc': 'add-浜哄彛瀛︾紪鐮侀�夋', 'loc': (By.XPATH, "//label[@class='check-box']"), 'action': None},
+#     {'name': 'add_confirm_btn', 'desc': 'add-纭鎸夐挳', 'loc': (By.XPATH, "//iframe[@src='/exam/test_package/add']/../../div[3]/a[1]"), 'action': 'click()'},
+#
+#     {'name': 'prodTree_option', 'desc': 'prodTree-浜у搧鍖呴�夐」', 'loc': (By.XPATH, "//div[@id='tree']/li/a/span[2]"), 'action': 'option()'},
+#     {'name': 'prodTree_confirm_btn', 'desc': 'proTree-纭鎸夐挳', 'loc': (By.XPATH, "//iframe[contains(@src,'/exam/product/getProdList')]/../../div[3]/a[1]"), 'action': 'click()'},
+#
+#     {'name': 'share_url_text', 'desc': 'share-url鏂囨湰', 'loc': (By.XPATH, "//input[@id='shareUrl']"), 'action': 'value_js()'},
+#     {'name': 'share_cancel_btn', 'desc': 'share-鍏抽棴鎸夐挳', 'loc': (By.XPATH, "//iframe[contains(@src,'/exam/test_package/share')]/../../div[3]/a[2]"), 'action': 'click()'},
+#
+#
+# ]
 
 class TestPackageListElements:
+    # this-tab
+    tab_name_this = "娴嬭瘯鍖呭垪琛�"
+
+
     # 娴嬭瘯鍖呭垪琛╥frame
     this_iframe = (By.XPATH, "//iframe[@src='/exam/test_package']")
     # 娣诲姞娴嬭瘯鍖卛frame
     add_iframe = (By.XPATH, "//iframe[@src='/exam/test_package/add']")
+    # 淇敼娴嬭瘯鍖卛frame
+    edit_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/test_package/edit')]")
     # 浜у搧鍖呮爲iframe
     prodTree_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/product/getProdList')]")
     # 鍒嗕韩iframe
     share_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/test_package/share')]")
-
+    # 浜嬩腑鎻愮ず璇璱frame
+    hint_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/test_package/editHint')]")
+    # 鏌ョ湅鎶ュ憡iframe
+    report_iframe = (By.XPATH, "//iframe[contains(@src,'/exam/report/reportView')]")
 
     # this-鍒涘缓鎸夐挳
     create_btn = (By.XPATH, "//a[@onclick='$.operate.add()']")
+    # this-淇敼鎸夐挳
+    edit_btn = (By.XPATH, "//a[@onclick='$.operate.edit()']")
     # this-娴嬭瘯鍖呭垪琛ㄦ祴璇曞寘鍚嶇Оa鏍囩
     table_packageName_a = (By.XPATH, "//table[@id='bootstrap-table']/tbody/tr/td[2]/a")
     # this-鍒楄〃tr
     table_package_tr = (By.XPATH, "//table[@id='bootstrap-table']/tbody/tr")
+    # this-table澶村閫夋
+    table_thead_checkbox = (By.XPATH, "//table[@id='bootstrap-table']/thead/tr//input")
     # this-鐢熸垚鍒嗕韩閾炬帴鎸夐挳
     share_1_btn = (By.XPATH, "//a[@onclick='share(1)']")
+    # this-鍥炴敹娴嬭瘯鍖呮寜閽�
+    recover_btn = (By.XPATH, "//a[@onclick='javascript:recover()']")
+    # this-浜嬩腑鎻愮ず璇寜閽�
+    hint_btn = (By.XPATH, "//a[@onclick='editHint()']")
+    # this-鎶ュ憡鎸夐挳
+    report_btn = (By.XPATH, "//a[@onclick='javascript:testReport()']")
     # this-鍒犻櫎鎸夐挳
     delete_btn = (By.XPATH, "//a[@onclick='$.operate.removeAll()']")
     # this-鍒犻櫎纭鎸夐挳
     delete_confirm_btn = (By.XPATH, "//div/a[text()='纭']")
+    # this-浜屾纭鎸夐挳
+    layer_confirm_btn = (By.XPATH, "//div/a[text()='纭']")
 
     # add-娴嬭瘯鍖呭悕绉�
     add_testPackageName_input = (By.XPATH, "//input[@name='testName']")
@@ -31,12 +93,18 @@
     add_reportCompanyName_input = (By.XPATH, "//input[@name='reportCompanyName']")
     # add-绫诲瀷
     add_testPackageType_select = (By.XPATH, "//select[@name='testType']/../span")
+    # add-绫诲瀷鏂囨湰
+    add_testPackageType_text = (By.XPATH, "//select[@name='testType']/../span/span/span/span[1]")
     # add-绫诲瀷閫夐」
     add_testPackageType_option = (By.XPATH, "//ul[contains(@id,'select2-testType')]/li")
     # add-鍖哄煙
     add_testPackageArea_select = (By.XPATH, "//select[@name='testArea']/../span")
+    # add-鍖哄煙鏂囨湰
+    add_testPackageArea_text = (By.XPATH, "//select[@name='testArea']/../span/span/span/span[1]")
     # add-鍖哄煙閫夐」
     add_testPackageArea_option = (By.XPATH, "//ul[contains(@id,'select2-testArea')]/li")
+    # add-浜у搧鍖呰緭鍏ユ
+    add_prodTree_input = (By.XPATH, "//input[@name='prodName']")
     # add-浜у搧鍖呮爲寮瑰嚭鎸夐挳
     add_prodTree_btn = (By.XPATH, "//span[@onclick='selectProdTree()']")
     # add-HR鎺ユ敹鎶ュ憡閭
@@ -47,30 +115,43 @@
     add_templateLangType_select = (By.XPATH, "//select[@name='templateLangType']/../button")
     # add-娴嬭瘯鑰呴個璇烽偖浠跺唴瀹规ā鏉块�夐」
     add_templateLangType_option = (By.XPATH, "//select[@name='templateLangType']/../div/div/ul/li/a/span[2]")
+    # add-娴嬭瘯鑰呴個璇烽偖浠跺唴瀹�
+    add_templateLangType_text = (By.XPATH, "//textarea[@name='template']")
     # add-HR璇█绫诲瀷
     add_hrTemplateLangType_select = (By.XPATH, "//select[@name='hrTemplateLangType']/../button")
     # add-HR璇█绫诲瀷閫夐」
     add_hrTemplateLangType_option = (By.XPATH, "//select[@name='hrTemplateLangType']/../div/div/ul/li/a/span[2]")
+    # add-娴嬭瘯鑰呴個璇烽偖浠跺唴瀹�
+    add_hrTemplateLangType_text = (By.XPATH, "//textarea[@name='hrTemplate']")
     # add-鎶ュ憡妯℃澘
     add_reportTemplateId_select = (By.XPATH, "//select[@name='reportTemplateId']/../button")
+    # add-鎶ュ憡妯℃澘閫夐」
+    add_reportTemplateId_option = (By.XPATH, "//select[@name='reportTemplateId']/../div/div/ul/li/a/span[2]")
+    # add-鎶ュ憡妯℃澘鍐呭
+    add_reportTemplateId_text = (By.XPATH, "//select[@name='reportTemplateId']/../button/div/div/div")
     # add-瑕佽瘎浠风殑宀椾綅
     add_position_input = (By.XPATH, "//input[@name='position']")
     # add-鑱屼笟澶х被
     add_professionalCategory_input = (By.XPATH, "//input[@name='professionalCategory']")
     # add-涓婄骇宀椾綅
     add_superiorPosition_input = (By.XPATH, "//input[@name='superiorPosition']")
-    # add-鎶ュ憡妯℃澘閫夐」
-    add_reportTemplateId_option = (By.XPATH, "//select[@name='reportTemplateId']/../div/div/ul/li/a/span[2]")
     # add-娴嬭瘯鑰呮帴鏀舵姤鍛�
     add_autoSendReport_checkbox = (By.XPATH, "//input[@name='autoSendReport']")
     # add-娴嬭瘯鑰呮姤鍛婅瑷�绫诲瀷
-    add_memberTemplateLangType_select = (By.XPATH, "//select[@name='memberTemplateLangType']/../button")
+    add_memberReportLangType_select = (By.XPATH, "//select[@name='memberTemplateLangType']/../button")
     # add-娴嬭瘯鑰呮姤鍛婅瑷�绫诲瀷閫夐」
-    add_memberTemplateLangType_option = (By.XPATH, "//select[@name='memberTemplateLangType']/../div/div/ul/li/a/span[2]")
+    add_memberReportLangType_option = (By.XPATH, "//select[@name='memberTemplateLangType']/../div/div/ul/li/a/span[2]")
+    # add-娴嬭瘯鑰呮姤鍛婂唴瀹�
+    add_memberReportLangType_text = (By.XPATH, "//textarea[@name='memberTemplate']")
     # 浜哄彛瀛︾紪鐮侀�夐」
     add_code_checkbox = (By.XPATH, "//label[@class='check-box']")
     # add-纭鎸夐挳
     add_confirm_btn = (By.XPATH, "//iframe[@src='/exam/test_package/add']/../../div[3]/a[1]")
+
+    # edit-纭鎸夐挳
+    edit_confirm_btn = (By.XPATH, "//iframe[contains(@src,'/exam/test_package/edit')]/../../div[3]/a[1]")
+    edit_cancel_btn = (By.XPATH, "//iframe[contains(@src,'/exam/test_package/edit')]/../../div[3]/a[2]")
+
 
     # prodTree-浜у搧鍖呴�夐」
     prodTree_option = (By.XPATH, "//div[@id='tree']/li/a/span[2]")
@@ -81,3 +162,14 @@
     share_url_input = (By.XPATH, "//input[@id='shareUrl']")
     # share-鍏抽棴鎸夐挳
     share_cancel_btn = (By.XPATH, "//iframe[contains(@src,'/exam/test_package/share')]/../../div[3]/a[2]")
+
+    # hint-绗洓涓寚瀵艰鏂囨湰鍩�
+    hint_textarea = (By.XPATH, "//div[@class='ibox float-e-margins']/div/div[10]//textarea")
+    # hint-妯℃�佺獥鍙f枃鏈爣绛�
+    hint_modal_span = (By.XPATH, "//div[@id='modalWindow']//div[@class='note-editable']/p[3]/font/span")
+    # hint-妯℃�佺獥鍙d繚瀛樻寜閽�
+    hint_modal_save_btn = (By.XPATH, "//div[@id='modalWindow']//div[@class='modal-footer']/button[@id='save']")
+
+
+    # 鎿嶄綔鎴愬姛寮圭獥
+    operate_success_layer = (By.XPATH, "//div[text()='鎿嶄綔鎴愬姛']")
diff --git a/main.py b/main.py
index fa7772c..9de8852 100644
--- a/main.py
+++ b/main.py
@@ -5,7 +5,7 @@
 
 
 def run_testcases():
-    pytest.main(['-vs', '--html=report/report.html', 'testcase'])
+    pytest.main(['-vs', '--html=report/report.html', 'testcase/test_2package_list.py'])
 
 
 if __name__ == '__main__':
diff --git a/po/caq_answer_page.py b/po/caq_answer_page.py
index 73dcc4b..2816cf5 100644
--- a/po/caq_answer_page.py
+++ b/po/caq_answer_page.py
@@ -1,7 +1,7 @@
 import random
 
 from base.base_page import BasePage
-from elements.caq_answer_elements import CAQAnswerElements as Answer
+from elements.caq_answer_elements import CAQAnswerElements
 from selenium.common.exceptions import *
 
 import time
@@ -13,52 +13,56 @@
     """
     loading_count = 0
 
+    es = CAQAnswerElements
+
     def answer(self):
+        # 鐐瑰嚮寮�濮嬫寜閽�
+        self.click(self.es.start_btn, timeout=10)
         # 鏆傚仠3绉�
         time.sleep(3)
         i = 0
         while i < 27:
             if i == 0:
-                self.click_wait(Answer.continue_testing_btn)
+                self.click(self.es.continue_testing_btn, timeout=10)
             elif i < 4:
                 # 鑾峰彇鍒版墍鏈夐�夐」
-                options_1 = self.elements_is_visibility(Answer.options_1)
+                options_1 = self.elements_is_visibility(self.es.options_1)
                 number = random.randint(0, 4)
                 self.click_element_js(options_1[number])
 
-                options_2 = self.elements_is_visibility(Answer.options_2)
+                options_2 = self.elements_is_visibility(self.es.options_2)
                 self.click_element_js(options_2[number])
 
-                options_3 = self.elements_is_visibility(Answer.options_3)
+                options_3 = self.elements_is_visibility(self.es.options_3)
                 self.click_element_js(options_3[number])
 
-                options_4 = self.elements_is_visibility(Answer.options_4)
+                options_4 = self.elements_is_visibility(self.es.options_4)
                 self.click_element_js(options_4[number])
 
-                options_5 = self.elements_is_visibility(Answer.options_5)
+                options_5 = self.elements_is_visibility(self.es.options_5)
                 self.click_element_js(options_5[number])
 
-                self.click_js(Answer.next_btn)
+                self.click_js(self.es.next_btn)
             if i == 4:
-                self.click_wait(Answer.continue_testing_btn)
+                self.click(self.es.continue_testing_btn, timeout=10)
 
             # # 鏍囬涓嶅瓨鍦ㄧ洿鎺ヨ繑鍥濬alse
             # if not self.title_is_display():
             #     return False
 
             if 4 < i < 26:
-                options_6 = self.elements_is_visibility(Answer.options_6)
+                options_6 = self.elements_is_visibility(self.es.options_6)
                 number = random.randint(0, 4)
                 self.click_element_js(options_6[number])
                 if i == 23:
-                    self.click_js(Answer.submit_btn)
+                    self.click_js(self.es.submit_btn)
                     # 鏁版嵁鏄惁涓婁紶瀹屾垚
                     time.sleep(15)
                     if self.upload_is_success():
                         return True
                 else:
 
-                    self.click_js(Answer.next_btn)
+                    self.click_js(self.es.next_btn)
             i += 1
 
     def upload_is_success(self):
@@ -69,7 +73,7 @@
         i = 0
         while i < 60:
             try:
-                self.get_element_wait(Answer.upload_success_title)
+                self.get_element_wait(self.es.upload_success_title)
                 return True
             except TimeoutException:
                 i += 1
@@ -82,7 +86,7 @@
         :return:
         """
         try:
-            button = self.get_element(Answer.submit_btn)
+            button = self.get_ele(self.es.submit_btn)
             if button.is_enabled():
                 return True
             else:
@@ -97,7 +101,7 @@
         """
         try:
             # 鐐瑰嚮缁х画娴嬭瘯鎸夐挳
-            button = self.get_element(Answer.continue_testing_btn)
+            button = self.get_ele(self.es.continue_testing_btn)
             if button.is_enabled():
                 return True
             else:
@@ -112,7 +116,7 @@
         """
         try:
             # 鑾峰彇鏍囬
-            self.get_element_wait(Answer.title)
+            self.get_element_wait(self.es.title)
             return True
         except TimeoutException:
             return False
@@ -125,7 +129,7 @@
         i = 0
         while i < 10:
             try:
-                self.get_element(Answer.loading_text)
+                self.get_element(self.es.loading_text)
                 i += 1
                 time.sleep(1)
             except:
@@ -138,4 +142,4 @@
         寮�濮嬫祴璇曟寜閽�
         :return:
         """
-        self.click_wait(Answer.start_btn)
+        self.click_wait(self.es.start_btn)
diff --git a/po/export_test_data_page.py b/po/export_test_data_page.py
new file mode 100644
index 0000000..d78b066
--- /dev/null
+++ b/po/export_test_data_page.py
@@ -0,0 +1,38 @@
+import time
+
+from base.base_page import BasePage
+from elements.export_test_data_elements import ExportTestDataElements
+from selenium.common.exceptions import TimeoutException, NoSuchElementException
+
+
+class ExportTestDataPage(BasePage):
+    """
+    瀵煎嚭娴嬭瘯鏁版嵁椤甸潰
+    """
+    # 椤甸潰鍏冪礌
+    es = ExportTestDataElements
+
+    def __init__(self, driver):
+        super().__init__(driver)
+        try:
+            self.driver.switch_to.default_content()
+            self.switch_iframe(self.es.this_iframe)
+        except:
+            pass
+
+    def wait_layer_reload_hide(self, timeout=600):
+        """
+        绛夊緟鍔犺浇妗嗘秷澶�
+        :param timeout: 瓒呮椂鏃堕棿
+        :return:
+        """
+        for i in range(1, 600):
+            try:
+                # 鍔犺浇妗嗗瓨鍦ㄧ潯鐪犱竴绉�
+                self.get_ele(self.es.layer_reload)
+                time.sleep(1)
+            except NoSuchElementException:
+                # 涓嶅瓨鍦ㄨ烦鍑哄惊鐜�
+                break
+
+
diff --git a/po/group_report_page.py b/po/group_report_page.py
new file mode 100644
index 0000000..9847a36
--- /dev/null
+++ b/po/group_report_page.py
@@ -0,0 +1,27 @@
+from base.base_page import BasePage
+from elements.group_report_elements import GroupReportElements
+from selenium.common.exceptions import TimeoutException
+
+
+class GroupReportPage(BasePage):
+    """
+    缁勫埆鎶ュ憡椤甸潰
+    """
+    # 椤甸潰鍏冪礌
+    es = GroupReportElements
+
+    def __init__(self, driver):
+        super().__init__(driver)
+        try:
+            self.driver.switch_to.default_content()
+            self.switch_iframe(self.es.this_iframe)
+        except:
+            pass
+
+
+
+
+
+
+
+
diff --git a/po/home_page.py b/po/home_page.py
index 2802d29..74690e9 100644
--- a/po/home_page.py
+++ b/po/home_page.py
@@ -1,5 +1,6 @@
 from base.base_page import BasePage
 from selenium.webdriver.common.by import By
+from elements.home_elements import HomeElements
 import time
 
 
@@ -7,6 +8,20 @@
     """
     涓婚〉闈晶杈规爮鑿滃崟涓巘ab鏍忔搷浣滈〉闈�
     """
+
+    es = HomeElements
+
+    def __init__(self, driver):
+        super().__init__(driver)
+        self.driver = driver
+        # 鍒囨崲鍒版渶椤跺眰鐨勬枃妗�
+        driver.switch_to.default_content()
+
+    def logout(self):
+        # 鐐瑰嚮绗笁涓敤鎴疯彍鍗�
+        self.click(self.es.user_menu_3)
+        # 鐐瑰嚮鐧诲嚭
+        self.click(self.es.logout_btn)
 
     def menu_select(self, menu_text, is_first=True):
         """
@@ -29,19 +44,34 @@
         if is_first:
             # 鑿滃崟鍏冪礌瀹氫綅
             menu_loc = (By.XPATH, "//ul[@id='side-menu']//span[text()='" + menu + "']")
-            # 鑾峰彇鑿滃崟鍏冪礌
-            menu_element = self.get_element(menu_loc)
-            # 鐐瑰嚮鑿滃崟
-            menu_element.click()
-            time.sleep(1)
+            # 鑿滃崟涓媢l瀹氫綅
+            menu_ul_loc = (By.XPATH, "//ul[@id='side-menu']//span[text()='" + menu + "']/../../ul")
+            # 鑾峰彇鍒皍l鍏冪礌
+            ul = self.get_ele(menu_ul_loc)
+            # 鑾峰彇ul鐨刢lass灞炴��
+            ul_class = ul.get_attribute("class")
+            # 鍒ゆ柇class鏄惁鍖呭惈in瀛楃涓�
+            if "in" not in ul_class:
+                # 涓嶅寘鍚垯涓烘湭鎵撳紑鐘舵�侊紝鍙互鐐瑰嚮
+                self.click(menu_loc, timeout=10)
         else:
             # 鑿滃崟鍏冪礌瀹氫綅
             menu_loc = (By.XPATH, "//ul[@id='side-menu']//a[text()='" + menu + "']")
-            # 鑾峰彇鑿滃崟鍏冪礌
-            menu_element = self.get_element(menu_loc)
-            # 鐐瑰嚮鑿滃崟
-            menu_element.click()
-            time.sleep(1)
+            # 鍒ゆ柇menu_text鏄惁杩樺寘鍚�/
+            if "/" in menu_text:
+                # 鍖呭惈鍒欒〃绀鸿繕鏈変笅绾ц彍鍗曪紝鍒ゆ柇涓嬬骇鑿滃崟鏄惁涓哄睍寮�鐘舵��
+                # 鑿滃崟涓媢l瀹氫綅
+                menu_ul_loc = (By.XPATH, "//ul[@id='side-menu']//a[text()='" + menu + "']/../ul")
+                # 鑾峰彇鍒皍l鍏冪礌
+                ul = self.get_ele(menu_ul_loc)
+                # 鑾峰彇ul鐨刢lass灞炴��
+                ul_class = ul.get_attribute("class")
+                # 鍒ゆ柇class鏄惁鍖呭惈in瀛楃涓�
+                if "in" not in ul_class:
+                    # 涓嶅寘鍚垯涓烘湭鎵撳紑鐘舵�侊紝鍙互鐐瑰嚮
+                    self.click(menu_loc, timeout=10)
+            else:
+                self.click(menu_loc, timeout=10)
 
         if "/" in menu_text:
             # 鑾峰彇/绗竴娆″嚭鐜扮殑浣嶇疆
@@ -50,3 +80,14 @@
             menu_text = menu_text[index + 1: len(menu_text)]
             # 閫掑綊璋冪敤
             self.menu_select(menu_text, False)
+
+
+
+    def close_tab(self, tab_name):
+        """鍏抽棴椤甸潰tab"""
+        # 鑾峰彇鎵�鏈塼ab
+        tabs = self.get_eles(self.es.nav_tabs)
+        for tab in tabs:
+            if tab.text == tab_name:
+                # 鐐瑰嚮鍏抽棴鍥炬爣
+                tab.find_element(By.XPATH, "i").click()
diff --git a/po/login_page.py b/po/login_page.py
index 08b28b2..14cd9cc 100644
--- a/po/login_page.py
+++ b/po/login_page.py
@@ -1,65 +1,43 @@
 from base.base_page import BasePage
-from elements.login_elements import LoginElements as Login
+from elements.login_elements import LoginElements
+from selenium.common.exceptions import TimeoutException
 
 
 class LoginPage(BasePage):
     """
     鐧诲綍椤甸潰
     """
+    # 椤甸潰鍏冪礌
+    es = LoginElements
 
-    def username_input(self, username):
-        """
-        濉啓鐢ㄦ埛鍚�
-        :param username: 鐢ㄦ埛鍚�
-        :return:
-        """
-        self.send_text(username, Login.username_input)
+    def __init__(self, driver):
+        super().__init__(driver)
+        self.driver = driver
+        # 鍒囨崲鍒版渶椤跺眰鏂囨。
+        driver.switch_to.default_content()
 
-    def password_input(self, password):
-        """
-        濉啓瀵嗙爜
-        :param password: 瀵嗙爜
-        :return:
-        """
-        self.send_text(password, Login.password_input)
+    def login(self, username, password, code):
+        # 杈撳叆鐢ㄦ埛鍚�
+        self.fill(self.es.username_input, username)
+        # 杈撳叆瀵嗙爜
+        self.fill(self.es.password_input, password)
+        # 杈撳叆楠岃瘉鐮�
+        self.fill(self.es.validate_code_input, code)
+        # 鐐瑰嚮鐧诲綍鎸夐挳
+        self.click(self.es.login_btn)
 
-    def validate_code_input(self, validate_code):
-        """
-        濉啓楠岃瘉鐮�
-        :param validate_code: 楠岃瘉鐮�
-        :return:
-        """
-        self.send_text(validate_code, Login.validate_code_input)
-
-    def login_btn(self):
-        """
-        鐐瑰嚮鐧诲綍鎸夐挳
-        :return:
-        """
-        self.click(Login.login_btn)
-
-    def login(self, username, password, validate_code):
-        """
-        鐧诲綍
-        :param username: 鐢ㄦ埛鍚�
-        :param password: 瀵嗙爜
-        :param validate_code: 楠岃瘉鐮�
-        :return:
-        """
-        self.username_input(username)
-        self.password_input(password)
-        self.validate_code_input(validate_code)
-        self.login_btn()
-
-    def is_login_success(self):
+    def login_assert(self):
         """
         鍒ゆ柇鏄惁鐧诲綍鎴愬姛
         :return: bool
         """
-        current_url = self.driver.current_url
-        if "index" in self.driver.current_url:
-            return True
-        else:
+        try:
+            ele = self.get_ele(self.es.home_logo, timeout=10)
+            if ele.text == "TAI-OTS":
+                return True
+        except TimeoutException:
             return False
 
 
+
+
diff --git a/po/maq_answer_page.py b/po/maq_answer_page.py
index d95deb6..fbf2696 100644
--- a/po/maq_answer_page.py
+++ b/po/maq_answer_page.py
@@ -1,7 +1,7 @@
 import random
 
 from base.base_page import BasePage
-from elements.maq_answer_elements import MAQAnswerElements as Answer
+from elements.maq_answer_elements import MAQAnswerElements
 from selenium.common.exceptions import *
 
 import time
@@ -11,15 +11,30 @@
     """
     绛旈椤甸潰
     """
+
     loading_count = 0
 
-    def answer(self):
+    se = MAQAnswerElements
+
+    def answer(self, hint=None, question: dict = None):
+        flag = False
         # 鏆傚仠3绉�
         time.sleep(3)
+        # 鐐瑰嚮寮�濮嬬瓟棰�
+        self.click(self.se.start_btn)
+        question_title = None
         while True:
+            # time.sleep(0.5)
             # 缁х画娴嬭瘯鎸夐挳鍑虹幇鍒欑偣鍑�
             if self.continue_btn_is_display():
-                self.click(Answer.continue_testing_btn)
+                # 鍒ゆ柇hint鏄惁鏈夊唴瀹�
+                if hint:
+                    # 鑾峰彇鎻愮ず璇唴瀹�
+                    hint_text = self.get_ele(self.se.hint_text).text
+                    # 鍒ゆ柇鎻愮ず璇唴瀹规槸鍚﹀寘鍚紶鍏ョ殑hint
+                    if hint in hint_text:
+                        flag = True
+                self.click(self.se.continue_testing_btn)
 
             # 鏍囬涓嶅瓨鍦ㄧ洿鎺ヨ繑鍥濬alse
             if not self.title_is_display():
@@ -27,22 +42,41 @@
 
             try:
                 # 鑾峰彇鍒版墍鏈夐�夐」
-                options = self.get_elements(Answer.options)
+                options = self.get_eles(self.se.options)
                 if len(options) < 6:
                     continue
                 number = random.randint(0, 5)
                 if options[number].is_enabled():
+                    # 鑾峰彇鍒伴鐩�
+                    # q_title = self.get_ele(self.se.q_title).text
+                    # q_title涓巕uestion_title涓嶇浉鍚屽垯鍐欏叆question涓�
+                    # 閬嶅巻瀛楀吀
+                    # if question:
+                    #     for key in question.keys():
+                    #         q_title = self.get_ele(self.se.q_title).text
+                    #         if question[key]["title"] in q_title and "answer" not in question[key]:
+                    #             question[key]["answer"] = number + 1
+                    #             question_title = q_title
+                    #             break
                     options[number].click()
             except:
                 pass
 
             # 鎻愪氦鎸夐挳瀛樺湪鍒欑偣鍑�
             if self.submit_btn_is_display():
-                self.click(Answer.submit_btn)
+                self.click(self.se.submit_btn)
                 # 鏁版嵁鏄惁涓婁紶瀹屾垚
                 time.sleep(15)
                 if self.upload_is_success():
+                    if hint:
+                        return flag
                     return True
+                # 鏄惁缃戠粶寮傚父
+                try:
+                    self.get_ele(self.se.network_exception_title)
+                    return "缃戠粶寮傚父"
+                except NoSuchElementException:
+                    pass
                 return False
 
     def upload_is_success(self):
@@ -53,7 +87,7 @@
         i = 0
         while i < 60:
             try:
-                self.get_element_wait(Answer.upload_success_title)
+                self.get_ele(self.se.upload_success_title, timeout=5)
                 return True
             except TimeoutException:
                 i += 1
@@ -66,7 +100,7 @@
         :return:
         """
         try:
-            button = self.get_element(Answer.submit_btn)
+            button = self.get_ele(self.se.submit_btn)
             if button.is_enabled():
                 return True
             else:
@@ -81,7 +115,7 @@
         """
         try:
             # 鐐瑰嚮缁х画娴嬭瘯鎸夐挳
-            button = self.get_element(Answer.continue_testing_btn)
+            button = self.get_ele(self.se.continue_testing_btn)
             if button.is_enabled():
                 return True
             else:
@@ -96,30 +130,23 @@
         """
         try:
             # 鑾峰彇鏍囬
-            self.get_element_wait(Answer.title)
+            self.get_ele(self.se.title, timeout=10)
             return True
         except TimeoutException:
             return False
 
-    def loadin_text(self):
-        """
-        鍒ゆ柇鍔犺浇妗嗗姞杞斤紝濡傛灉鍔犺浇瓒呰繃10绉掔洿鎺ラ��鍑哄綋鍓嶆祴璇�
-        :return:
-        """
-        i = 0
-        while i < 10:
-            try:
-                self.get_element(Answer.loading_text)
-                i += 1
-                time.sleep(1)
-            except:
-                return False
-        else:
-            return True
-
-    def start_btn(self):
-        """
-        寮�濮嬫祴璇曟寜閽�
-        :return:
-        """
-        self.click_wait(Answer.start_btn)
+    # def loadin_text(self):
+    #     """
+    #     鍒ゆ柇鍔犺浇妗嗗姞杞斤紝濡傛灉鍔犺浇瓒呰繃10绉掔洿鎺ラ��鍑哄綋鍓嶆祴璇�
+    #     :return:
+    #     """
+    #     i = 0
+    #     while i < 10:
+    #         try:
+    #             self.oper_elem("")
+    #             i += 1
+    #             time.sleep(1)
+    #         except:
+    #             return False
+    #     else:
+    #         return True
diff --git a/po/member_detail_page.py b/po/member_detail_page.py
new file mode 100644
index 0000000..49a6dad
--- /dev/null
+++ b/po/member_detail_page.py
@@ -0,0 +1,164 @@
+from base.base_page import BasePage
+from selenium.webdriver.common.by import By
+from elements.member_detail_elements import MemberDetailElements
+from datetime import datetime
+import time
+
+
+class MemberDetailPage(BasePage):
+    """
+    娴嬭瘯鍖呭垪琛ㄩ〉闈�
+    """
+
+    es = MemberDetailElements
+
+    def __init__(self, driver):
+        """鍒濆鍖栨椂灏唅frame鍒囨崲鍒板綋鍓嶉〉闈�"""
+        super().__init__(driver)
+        try:
+            self.driver.switch_to.default_content()
+            self.switch_iframe(self.es.this_iframe)
+        except:
+            pass
+
+    def add_member(self, data: dict):
+        """
+        鏂板娴嬭瘎浜哄憳
+        :param data:
+        :return:
+        """
+        # 鐐瑰嚮鏂板鎸夐挳
+        self.click(self.es.create_btn)
+        # 鍒囨崲鍒癮dd鐨刬frame
+        self.switch_iframe(self.es.add_iframe)
+        # 濉啓淇℃伅
+        self.fill(self.es.add_member_name_input, data["name"])
+        self.fill(self.es.add_member_dept_input, data["dept"])
+        self.fill(self.es.add_member_email_input, data["email"])
+        self.fill(self.es.add_member_phone_input, data["phone"])
+        self.fill(self.es.add_remark_input, data["remark"])
+        # 鍥炲埌涓婁竴灞俰frame
+        self.switch_parent_iframe()
+        # 鐐瑰嚮纭畾鎸夐挳
+        self.click(self.es.add_confirm_btn)
+        return data["email"]
+
+    def edit_member(self, memberEmail, data: dict):
+        """
+        淇敼娴嬭瘎浜哄憳
+        :param memberEmail:
+        :param data:
+        :return:
+        """
+        # 鍕鹃�夋祴璇勪汉鍛�
+        self.select_email_checkbox(memberEmail)
+        # 鐐瑰嚮淇敼鎸夐挳
+        self.click(self.es.edit_btn)
+        # 鍒囨崲鍒癳dit鐨刬frame
+        self.switch_iframe(self.es.edit_iframe)
+        # 濉啓淇℃伅
+        self.fill(self.es.add_member_name_input, data["name"])
+        self.fill(self.es.add_member_dept_input, data["dept"])
+        self.fill(self.es.add_member_email_input, data["email"])
+        self.fill(self.es.add_member_phone_input, data["phone"])
+        self.fill(self.es.add_remark_input, data["remark"])
+        # 鍥炲埌涓婁竴灞俰frame
+        self.switch_parent_iframe()
+        # 鐐瑰嚮纭畾鎸夐挳
+        self.click(self.es.edit_confirm_btn)
+        return data["email"]
+
+    def is_edit_success(self, memberEmail, data: dict):
+        """鍒ゆ柇鏄惁淇敼鎴愬姛"""
+        # 鍕鹃�夋祴璇勪汉鍛�
+        self.select_email_checkbox(memberEmail)
+        # 鐐瑰嚮淇敼鎸夐挳
+        self.click(self.es.edit_btn)
+        # 鍒囨崲鍒癳dit鐨刬frame
+        self.switch_iframe(self.es.edit_iframe)
+        # 鍒ゆ柇淇℃伅
+        flag = self.equals(self.es.add_member_name_input, data["name"])
+        if not flag:
+            return flag
+        flag = self.equals(self.es.add_member_dept_input, data["dept"])
+        if not flag:
+            return flag
+        flag = self.equals(self.es.add_member_email_input, data["email"])
+        if not flag:
+            return flag
+        flag = self.equals(self.es.add_member_phone_input, data["phone"])
+        if not flag:
+            return flag
+        flag = self.equals(self.es.add_remark_input, data["remark"])
+        if not flag:
+            return flag
+        # 鍥炲埌涓婁竴灞俰frame
+        self.switch_parent_iframe()
+        # 鐐瑰嚮鍏抽棴鎸夐挳
+        self.click(self.es.edit_cancel_btn)
+        return True
+
+    def is_create_success(self, memberEmail):
+        """鍒ゆ柇鏄惁鍒涘缓鎴愬姛"""
+        emails = self.get_eles(self.es.table_email_td)
+        for email in emails:
+            if email.text == memberEmail:
+                return True
+        return False
+
+    def is_remote_success(self):
+        """鍒ゆ柇鏄惁鍒犻櫎鎴愬姛"""
+
+    def select_email_checkbox(self, memberEmail):
+        """
+        閫変腑璇勬祴浜哄憳
+        :param memberEmail:
+        :return:
+        """
+        # 鑾峰彇鍒皌able鐨勬墍鏈塼r
+        table_trs = self.get_eles(self.es.table_data_tr)
+        for tr in table_trs:
+            # 鍒ゆ柇澶嶉�夋鏄惁涓洪�変腑鐘舵��
+            tr_class = tr.get_attribute("class")
+            if tr_class == "selected":
+                # 宸茬偣鍑昏繘琛屼笅涓�娆″惊鐜�
+                continue
+            # 閭鍦╰r涓殑瀹氫綅
+            email_loc = (By.XPATH, "td[4]")
+            # 鑾峰彇tr涓殑娴嬭瘯鍖呭悕绉�
+            tr_email = tr.find_element(*email_loc).text
+            if tr_email == memberEmail:
+                # 澶嶉�夋鍦╰r涓殑瀹氫綅
+                package_checkbox_loc = (By.XPATH, "td[1]/input")
+                # 鑾峰彇澶嶉�夋鍏冪礌
+                tr_checkbox = tr.find_element(*package_checkbox_loc)
+                # 鐐瑰嚮澶嶉�夋
+                tr_checkbox.click()
+                break
+
+    def unselect_email_checkbox(self, memberEmail):
+        """
+        閫変腑璇勬祴浜哄憳
+        :param memberEmail:
+        :return:
+        """
+        # 鑾峰彇鍒皌able鐨勬墍鏈塼r
+        table_trs = self.get_eles(self.es.table_data_tr)
+        for tr in table_trs:
+            # 鍒ゆ柇澶嶉�夋鏄惁涓洪�変腑鐘舵��
+            tr_class = tr.get_attribute("class")
+            if tr_class != "selected":
+                # 宸茬偣鍑昏繘琛屼笅涓�娆″惊鐜�
+                continue
+            # 閭鍦╰r涓殑瀹氫綅
+            email_loc = (By.XPATH, "td[4]")
+            # 鑾峰彇tr涓殑娴嬭瘯鍖呭悕绉�
+            tr_email = tr.find_element(*email_loc).text
+            if tr_email == memberEmail:
+                # 澶嶉�夋鍦╰r涓殑瀹氫綅
+                package_checkbox_loc = (By.XPATH, "td[1]/input")
+                # 鑾峰彇澶嶉�夋鍏冪礌
+                tr_checkbox = tr.find_element(*package_checkbox_loc)
+                # 鐐瑰嚮澶嶉�夋
+                tr_checkbox.click()
+                break
diff --git a/po/product_accredit_page.py b/po/product_accredit_page.py
new file mode 100644
index 0000000..c9fd916
--- /dev/null
+++ b/po/product_accredit_page.py
@@ -0,0 +1,38 @@
+import time
+
+from base.base_page import BasePage
+from elements.product_accredit__elements import ProductAccreditElements
+from selenium.common.exceptions import TimeoutException, NoSuchElementException
+
+
+class ProductAccreditPage(BasePage):
+    """
+    鐧诲綍椤甸潰
+    """
+    # 椤甸潰鍏冪礌
+    es = ProductAccreditElements
+
+    def __init__(self, driver):
+        super().__init__(driver)
+        try:
+            self.driver.switch_to.default_content()
+            self.switch_iframe(self.es.this_iframe)
+        except:
+            pass
+
+    def wait_layer_reload_hide(self, timeout=600):
+        """
+        绛夊緟鍔犺浇妗嗘秷澶�
+        :param timeout: 瓒呮椂鏃堕棿
+        :return:
+        """
+        for i in range(1, 600):
+            try:
+                # 鍔犺浇妗嗗瓨鍦ㄧ潯鐪犱竴绉�
+                self.get_ele(self.es.layer_reload)
+                time.sleep(1)
+            except NoSuchElementException:
+                # 涓嶅瓨鍦ㄨ烦鍑哄惊鐜�
+                break
+
+
diff --git a/po/report_page.py b/po/report_page.py
new file mode 100644
index 0000000..42cfd21
--- /dev/null
+++ b/po/report_page.py
@@ -0,0 +1,38 @@
+import time
+
+from base.base_page import BasePage
+from elements.report_elements import ReportElements
+from selenium.common.exceptions import TimeoutException, NoSuchElementException
+
+
+class ReportPage(BasePage):
+    """
+    鐧诲綍椤甸潰
+    """
+    # 椤甸潰鍏冪礌
+    es = ReportElements
+
+    def __init__(self, driver):
+        super().__init__(driver)
+        try:
+            self.driver.switch_to.default_content()
+            self.switch_iframe(self.es.this_iframe)
+        except:
+            pass
+
+    def wait_layer_reload_hide(self, timeout=600):
+        """
+        绛夊緟鍔犺浇妗嗘秷澶�
+        :param timeout: 瓒呮椂鏃堕棿
+        :return:
+        """
+        for i in range(1, 600):
+            try:
+                # 鍔犺浇妗嗗瓨鍦ㄧ潯鐪犱竴绉�
+                self.get_ele(self.es.layer_reload)
+                time.sleep(1)
+            except NoSuchElementException:
+                # 涓嶅瓨鍦ㄨ烦鍑哄惊鐜�
+                break
+
+
diff --git a/po/share_add_page.py b/po/share_add_page.py
index e3de559..a20733a 100644
--- a/po/share_add_page.py
+++ b/po/share_add_page.py
@@ -1,5 +1,5 @@
 from base.base_page import BasePage
-from elements.share_add_elements import ShareAddElements as Share
+from elements.share_add_elements import ShareAddElements
 import time
 
 
@@ -8,44 +8,23 @@
     鍒嗕韩閾炬帴鎵撳紑鐨勯〉闈�
     """
 
-    def name_input(self, name):
-        """
-        杈撳叆濮撳悕
-        :param name:
-        :return:
-        """
-        self.send_text(name, Share.name)
+    es = ShareAddElements
 
-    def email_input(self, email):
+    def get_test_url(self, name, email):
         """
-        杈撳叆閭
-        :param email:
-        :return:
-        """
-        self.send_text(email, Share.email)
-
-    def submit_btn(self):
-        """
-        鐐瑰嚮鎻愪氦
-        :return:
-        """
-        self.click_wait(Share.submit_btn)
-
-    def page_default_operation(self, name, email):
-        """
-        椤甸潰榛樿鎿嶄綔
+        濉啓淇℃伅骞舵彁浜わ紝杩斿洖娴嬭瘯閾炬帴
         :param name:
         :param email:
         :return:
         """
         # 杈撳叆濮撳悕
-        self.name_input(name)
+        self.fill(self.es.name, name, timeout=10)
         # 杈撳叆閭
-        self.email_input(email)
+        self.fill(self.es.email, email)
         # 鐐瑰嚮鎻愪氦
-        self.submit_btn()
+        self.click(self.es.submit_btn)
         # 鑾峰彇娴嬭瘯閾炬帴骞惰繑鍥�
-        return self.get_element_wait(Share.test_url).text
+        return self.get_ele(self.es.test_url).text
 
     def fill_info(self, email, position, dept):
         """
@@ -55,11 +34,10 @@
         :param dept: 閮ㄩ棬
         :return:
         """
-        self.send_text_wait(email, Share.fill_email)
-        self.send_text_wait(position, Share.fill_position)
-        self.send_text_wait(dept, Share.fill_dept)
-        self.click(Share.submit_btn)
-        time.sleep(2)
+        self.fill(self.es.fill_email, email, timeout=10)
+        self.fill(self.es.fill_position, position)
+        self.fill(self.es.fill_dept, dept)
+        self.click(self.es.submit_btn)
 
     def fill_info_CIAQ(self, info):
         """
@@ -67,21 +45,21 @@
         :param info:
         :return:
         """
-        self.send_text_wait(info["email"], Share.ciaq_email_input)
-        self.selector(Share.ciaq_sex_select, Share.ciaq_sex_option, info["sex"])
-        self.send_text_wait(info["age"], Share.ciaq_age_input)
-        self.selector(Share.ciaq_grade_select, Share.ciaq_grade_option, info["grade"])
-        self.send_text_wait(info["address"], Share.ciaq_address_input)
-        self.send_text_wait(info["university"], Share.ciaq_university_input)
-        self.send_text_wait(info["universityAddress"], Share.ciaq_universityAddress_input)
-        self.send_text_wait(info["college"], Share.ciaq_college_input)
-        self.send_text_wait(info["major"], Share.ciaq_major_input)
-        self.selector(Share.ciaq_subject_select, Share.ciaq_subject_option, info["subject"])
-        self.send_text_wait(info["GPA"], Share.ciaq_GPA_input)
-        self.send_text_wait(info["work"], Share.ciaq_work_input)
-        self.selector(Share.ciaq_status_select, Share.ciaq_status_option, info["status"])
-        self.selector(Share.ciaq_workExperience_select, Share.ciaq_workExperience_option, info["workExperience"])
-        self.click_wait(Share.submit_btn)
+        self.send_text_wait(info["email"], self.es.ciaq_email_input)
+        self.selector(self.es.ciaq_sex_select, self.es.ciaq_sex_option, info["sex"])
+        self.send_text_wait(info["age"], self.es.ciaq_age_input)
+        self.selector(self.es.ciaq_grade_select, self.es.ciaq_grade_option, info["grade"])
+        self.send_text_wait(info["address"], self.es.ciaq_address_input)
+        self.send_text_wait(info["university"], self.es.ciaq_university_input)
+        self.send_text_wait(info["universityAddress"], self.es.ciaq_universityAddress_input)
+        self.send_text_wait(info["college"], self.es.ciaq_college_input)
+        self.send_text_wait(info["major"], self.es.ciaq_major_input)
+        self.selector(self.es.ciaq_subject_select, self.es.ciaq_subject_option, info["subject"])
+        self.send_text_wait(info["GPA"], self.es.ciaq_GPA_input)
+        self.send_text_wait(info["work"], self.es.ciaq_work_input)
+        self.selector(self.es.ciaq_status_select, self.es.ciaq_status_option, info["status"])
+        self.selector(self.es.ciaq_workExperience_select, self.es.ciaq_workExperience_option, info["workExperience"])
+        self.click_wait(self.es.submit_btn)
 
     def selector(self, select_loc, options_loc, text):
         """
diff --git a/po/test_package_list_page.py b/po/test_package_list_page.py
index 6725bb6..d7f54cf 100644
--- a/po/test_package_list_page.py
+++ b/po/test_package_list_page.py
@@ -1,6 +1,7 @@
 from base.base_page import BasePage
 from selenium.webdriver.common.by import By
-from elements.test_package_list_elements import TestPackageListElements as PackageList
+from elements.test_package_list_elements import TestPackageListElements
+from datetime import datetime
 import time
 
 
@@ -9,66 +10,252 @@
     娴嬭瘯鍖呭垪琛ㄩ〉闈�
     """
 
+    es = TestPackageListElements
+
     def __init__(self, driver):
         """鍒濆鍖栨椂灏唅frame鍒囨崲鍒板綋鍓嶉〉闈�"""
         super().__init__(driver)
         try:
             self.driver.switch_to.default_content()
-            self.switch_iframe(PackageList.this_iframe)
+            self.switch_iframe(self.es.this_iframe)
         except:
             pass
 
-    def create_btn(self):
+    def create_package(self, data: dict):
         """
-        鐐瑰嚮鍒涘缓鎸夐挳
+        鍒涘缓娴嬭瘯鍖�
+        :param data: 娴嬭瘯鍖呭弬鏁�
         :return:
         """
-        self.click_wait(PackageList.create_btn)
-        # 鍒囨崲鍒癮dd绐楀彛鐨刬frame
-        self.switch_iframe(PackageList.add_iframe)
+        # 鐐瑰嚮鍒涘缓鎸夐挳
+        self.click(self.es.create_btn)
+        # 鍒囨崲鍒癮dd鐨刬frame
+        self.switch_iframe(self.es.add_iframe)
+        # 鑾峰彇褰撳墠鏃堕棿
+        current_time = datetime.now()
+        # 杞崲涓哄瓧绗︿覆
+        time_str = current_time.strftime("%Y%m%d%H%M%S")
+        # 鍒涘缓娴嬭瘯鍖呭~鍐欑殑鍙傛暟
+        # 娴嬭瘯鍖呭悕绉�
+        test_package_name = data["product"] + "鑷姩娴嬭瘯鍖�-" + time_str
+        # 濉啓娴嬭瘯鍖呭悕绉�
+        self.fill(self.es.add_testPackageName_input, test_package_name, timeout=10)
+        # 濉啓鎶ュ憡浼佷笟鍚嶇О
+        self.fill(self.es.add_reportCompanyName_input, data["company"], timeout=10)
+        # 閫夋嫨娴嬭瘯鍖呯被鍨�
+        self.select(self.es.add_testPackageType_select, self.es.add_testPackageType_option, data["type"])
+        # 閫夋嫨鍖哄煙
+        self.select(self.es.add_testPackageArea_select, self.es.add_testPackageArea_option, data["area"])
+        # 閫夋嫨浜у搧鍖�
+        self.prodTree_select(data["product"])
+        # 杈撳叆hr閭
+        self.fill(self.es.add_hrEmail_input, data["hrEmail"])
+        # 杈撳叆鏈夋晥鏈�
+        self.fill(self.es.add_invalidTime, data["invalid"])
+        # 鐐瑰嚮鏈夋晥鏈熻緭鍏ユ鏉ラ殣钘忔棩鏈熼�夋嫨鍣�
+        self.click(self.es.add_invalidTime)
+        # 閫夋嫨閭�璇烽偖浠惰瑷�绫诲瀷
+        self.select(self.es.add_templateLangType_select, self.es.add_templateLangType_option, data["memberLang"])
+        # 閫夋嫨HR閭欢璇█绫诲瀷
+        self.select(self.es.add_hrTemplateLangType_select, self.es.add_hrTemplateLangType_option, data["hrReportLang"])
+        # 閫夋嫨鎶ュ憡妯℃澘
+        self.select(self.es.add_reportTemplateId_select, self.es.add_reportTemplateId_option, data["reportTemplate"])
 
-    def delete_package(self):
+        # 鍒ゆ柇鏄惁涓哄伐浣滃垎鏋愬寘
+        if data["type"] == "宸ヤ綔鍒嗘瀽鍖�":
+            # 濡傛灉鏄垯濉啓
+            # 杈撳叆瑕佽瘎浠风殑宀椾綅
+            self.fill(self.es.add_position_input, data["position"])
+            # 杈撳叆鑱屼笟澶х被
+            self.fill(self.es.add_professionalCategory_input, data["professionalCategory"])
+            # 杈撳叆涓婄骇宀椾綅
+            self.fill(self.es.add_superiorPosition_input, data["superiorPosition"])
+
+        # 鐐瑰嚮娴嬭瘯鑰呮帴鏀舵姤鍛�
+        self.click(self.es.add_autoSendReport_checkbox)
+        # 閫夋嫨娴嬭瘯鑰呮姤鍛婇偖绠辫瑷�绫诲瀷
+        self.select(self.es.add_memberReportLangType_select, self.es.add_memberReportLangType_option,
+                    data["memberReportLang"])
+        # 鍥炲埌涓婁竴灞俰frame
+        self.switch_parent_iframe()
+        # 鐐瑰嚮纭鎸夐挳
+        self.click(self.es.add_confirm_btn)
+        return test_package_name
+
+    def edit_package(self, data: dict):
+        """
+        淇敼娴嬭瘯鍖�
+        :param data:
+        :return:
+        """
+        # 鍒囨崲鍒癳dit鐨刬frame
+        self.switch_iframe(self.es.edit_iframe)
+        # 鑾峰彇褰撳墠鏃堕棿
+        current_time = datetime.now()
+        # 杞崲涓哄瓧绗︿覆
+        time_str = current_time.strftime("%Y%m%d%H%M%S")
+        # 鍒涘缓娴嬭瘯鍖呭~鍐欑殑鍙傛暟
+        # 娴嬭瘯鍖呭悕绉�
+        test_package_name = data["product"] + "鑷姩娴嬭瘯鍖�-" + time_str
+        # 濉啓娴嬭瘯鍖呭悕绉�
+        self.fill(self.es.add_testPackageName_input, test_package_name, timeout=10)
+        # 濉啓鎶ュ憡浼佷笟鍚嶇О
+        self.fill(self.es.add_reportCompanyName_input, data["company"], timeout=10)
+        # 閫夋嫨鍖哄煙
+        self.select(self.es.add_testPackageArea_select, self.es.add_testPackageArea_option, data["area"])
+        # 杈撳叆hr閭
+        self.fill(self.es.add_hrEmail_input, data["hrEmail"])
+        # 杈撳叆鏈夋晥鏈�
+        self.fill(self.es.add_invalidTime, data["invalid"])
+        # 鐐瑰嚮鏈夋晥鏈熻緭鍏ユ鏉ラ殣钘忔棩鏈熼�夋嫨鍣�
+        self.click(self.es.add_invalidTime)
+        # 閫夋嫨閭�璇烽偖浠惰瑷�绫诲瀷
+        self.select(self.es.add_templateLangType_select, self.es.add_templateLangType_option, data["memberLang"])
+        # 閫夋嫨HR閭欢璇█绫诲瀷
+        self.select(self.es.add_hrTemplateLangType_select, self.es.add_hrTemplateLangType_option, data["hrReportLang"])
+        # 閫夋嫨鎶ュ憡妯℃澘
+        self.select(self.es.add_reportTemplateId_select, self.es.add_reportTemplateId_option, data["reportTemplate"])
+
+        # 鍒ゆ柇鏄惁涓哄伐浣滃垎鏋愬寘
+        if data["type"] == "宸ヤ綔鍒嗘瀽鍖�":
+            # 濡傛灉鏄垯濉啓
+            # 杈撳叆瑕佽瘎浠风殑宀椾綅
+            self.fill(self.es.add_position_input, data["position"])
+            # 杈撳叆鑱屼笟澶х被
+            self.fill(self.es.add_professionalCategory_input, data["professionalCategory"])
+            # 杈撳叆涓婄骇宀椾綅
+            self.fill(self.es.add_superiorPosition_input, data["superiorPosition"])
+        # 閫夋嫨娴嬭瘯鑰呮姤鍛婇偖绠辫瑷�绫诲瀷
+        self.select(self.es.add_memberReportLangType_select, self.es.add_memberReportLangType_option,
+                    data["memberReportLang"])
+        # 鍥炲埌涓婁竴灞俰frame
+        self.switch_parent_iframe()
+        # 鐐瑰嚮纭鎸夐挳
+        self.click(self.es.edit_confirm_btn)
+        return test_package_name
+
+    def verify_edit_success(self, package_name, data):
+        """
+        楠岃瘉淇敼鏄惁鎴愬姛
+        :param package_name: 娴嬭瘯鍖呭悕绉�
+        :param data:
+        :return:
+        """
+        # 鍕鹃�夊搴旀祴璇曞寘
+        self.select_package_checkbox(package_name)
+        # 鐐瑰嚮淇敼鎸夐挳
+        self.click(self.es.edit_btn)
+        time.sleep(2)
+        # 鍒囨崲鍒癳dit鐨刬frame
+        self.switch_iframe(self.es.edit_iframe)
+        # 鍒ゆ柇娴嬭瘯鍖呭悕绉�
+        flag = self.equals(self.es.add_testPackageName_input, package_name)
+        if not flag:
+            return flag
+        # 鍒ゆ柇鎶ュ憡浼佷笟鍚嶇О
+        flag = self.equals(self.es.add_reportCompanyName_input, data["company"])
+        if not flag:
+            return flag
+        # 鍒ゆ柇绫诲瀷
+        flag = self.equals(self.es.add_testPackageType_text, data["type"])
+        if not flag:
+            return flag
+        # 鍒ゆ柇鍖哄煙
+        flag = self.equals(self.es.add_testPackageArea_text, data["area"])
+        if not flag:
+            return flag
+        # 鍒ゆ柇浜у搧鍖�
+        flag = self.equals(self.es.add_prodTree_input, data["product"])
+        if not flag:
+            return flag
+        # 鍒ゆ柇HR鎺ユ敹鎶ュ憡閭
+        flag = self.equals(self.es.add_hrEmail_input, data["hrEmail"])
+        if not flag:
+            return flag
+        # 鍒ゆ柇鏈夋晥鏈�
+        flag = self.equals(self.es.add_invalidTime, data["invalid"])
+        if not flag:
+            return flag
+
+        # 鍒ゆ柇璇█绫诲瀷
+        text = "浜茬埍鐨�"
+        if data["memberLang"] == "English":
+            text = "Dear"
+        elif data["memberLang"] == "喙勦笚喔�":
+            text = "喙�喔`傅喔⑧笝"
+        # 鍒ゆ柇娴嬭瘯鑰呴個璇峰唴瀹�
+        flag = self.contains(self.es.add_templateLangType_text, text)
+        if not flag:
+            return flag
+
+        # 鍒ゆ柇璇█绫诲瀷
+        text = "浜茬埍鐨�"
+        if data["hrReportLang"] == "English":
+            text = "Dear HR Staff at"
+        elif data["hrReportLang"] == "喙勦笚喔�":
+            text = "喙�喔`傅喔⑧笝喔澿箞喔侧涪喔氞父喔勦竸喔ム競喔竾"
+        # 鍒ゆ柇HR閭欢鍐呭
+        flag = self.contains(self.es.add_hrTemplateLangType_text, text)
+        if not flag:
+            return flag
+
+        # 鍒ゆ柇鎶ュ憡妯℃澘
+        flag = self.contains(self.es.add_reportTemplateId_text, data["reportTemplate"])
+        if not flag:
+            return flag
+
+        # 鍒ゆ柇鏄惁涓哄伐浣滃垎鏋愬寘
+        if data["type"] == "宸ヤ綔鍒嗘瀽鍖�":
+            # 鍒ゆ柇瑕佽瘎浠风殑宀椾綅
+            flag = self.equals(self.es.add_position_input, data["position"])
+            if not flag:
+                return flag
+            # 鍒ゆ柇鑱屼笟澶х被
+            flag = self.equals(self.es.add_professionalCategory_input, data["professionalCategory"])
+            if not flag:
+                return flag
+            # 鍒ゆ柇涓婄骇宀椾綅
+            flag = self.equals(self.es.add_superiorPosition_input, data["superiorPosition"])
+            if not flag:
+                return flag
+
+        # 鍒ゆ柇璇█绫诲瀷
+        text = "浜茬埍鐨�"
+        if data["memberReportLang"] == "English":
+            text = "Dear HR Staff at"
+        elif data["memberReportLang"] == "喙勦笚喔�":
+            text = "喙�喔`傅喔⑧笝"
+        # 鍒ゆ柇娴嬭瘯鑰�
+        flag = self.contains(self.es.add_memberReportLangType_text, text)
+        if not flag:
+            return flag
+
+        # 鍒ゆ柇浜哄彛瀛︾紪鐮�
+        if "checkCode" in data:
+            # 鏍¢獙琚嬀閫夌殑浜哄彛閫夌紪鐮�
+            flag = self.verify_code_checked(data["checkCode"])
+            if not flag:
+                return flag
+        if "uncheckCode" in data:
+            # 鏍¢獙琚彇娑堝嬀閫夌殑浜哄彛閫夌紪鐮�
+            flag = self.verify_code_unchecked(data["checkCode"])
+            if not flag:
+                return flag
+
+        return flag
+
+
+    def delete_package(self, package_name):
         """
         鍒犻櫎娴嬭瘯鍖�
         :return:
         """
+        # 鍕鹃�夊搴旀祴璇曞寘
+        self.select_package_checkbox(package_name)
         # 鐐瑰嚮鍒犻櫎鎸夐挳
-        self.click_wait(PackageList.delete_btn)
+        self.click(self.es.delete_btn)
         # 鐐瑰嚮纭鎸夐挳
-        self.click_wait(PackageList.delete_confirm_btn)
-
-    def testPackageName_input(self, testPackageName):
-        """
-        杈撳叆娴嬭瘯鍖呭悕绉�
-        :param testPackageName: 娴嬭瘯鍖呭悕绉�
-        :return:
-        """
-        self.send_text_wait(testPackageName, PackageList.add_testPackageName_input)
-
-    def reportCompanyName_input(self, reportCompanyName):
-        """
-        杈撳叆鎶ュ憡浼佷笟鍚嶇О
-        :param reportCompanyName: 鎶ュ憡浼佷笟鍚嶇О
-        :return:
-        """
-        self.send_text_wait(reportCompanyName, PackageList.add_reportCompanyName_input)
-
-    def testPackageType_select(self, testPackageType):
-        """
-        閫夋嫨娴嬭瘯鍖呯被鍨�
-        :param testPackageType:
-        :return:
-        """
-        # 鐐瑰嚮涓嬫媺妗�
-        self.click_wait(PackageList.add_testPackageType_select)
-        # 鑾峰彇鎵�鏈夐�夐」
-        options = self.get_elements_wait(PackageList.add_testPackageType_option)
-        # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑
-        for opt in options:
-            if opt.text == testPackageType:
-                # 鐩哥瓑鍒欑偣鍑昏閫夐」
-                opt.click()
-                break
+        self.click(self.es.delete_confirm_btn)
 
     def prodTree_select(self, prodName):
         """
@@ -77,12 +264,11 @@
         :return:
         """
         # 鐐瑰嚮鏌ヨ鎸夐挳
-        self.click_wait(PackageList.add_prodTree_btn)
+        self.click(self.es.add_prodTree_btn)
         # 鍒囨崲鍒皃rodTree鐨刬frame
-        self.switch_iframe_wait(PackageList.prodTree_iframe)
-        time.sleep(2)
+        self.switch_iframe_wait(self.es.prodTree_iframe)
         # 鑾峰彇鎵�鏈夐�夐」
-        options = self.get_elements_wait(PackageList.prodTree_option)
+        options = self.get_eles(self.es.prodTree_option, timeout=10)
         # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ラ�夐」鐩哥瓑
         for opt in options:
             if opt.text == prodName:
@@ -91,137 +277,7 @@
         # 鍒囨崲鍒颁笂涓�灞傜殑iframe
         self.switch_parent_iframe()
         # 鐐瑰嚮纭鎸夐挳
-        self.click_wait(PackageList.prodTree_confirm_btn)
-
-    def hrReportEmail_input(self, hr_email):
-        """
-        杈撳叆HR鎺ユ敹鎶ュ憡閭
-        :param hr_email:
-        :return:
-        """
-        self.send_text_wait(hr_email, PackageList.add_hrEmail_input)
-
-    def invalidTime_input(self, invalid_time):
-        """
-        杈撳叆鏈夋晥鏈�
-        :param invalid_time:
-        :return:
-        """
-        self.send_text_wait(invalid_time, PackageList.add_invalidTime)
-        self.click_wait(PackageList.add_invalidTime)
-
-    def testTemplateLangType_select(self, text):
-        """
-        閫夋嫨娴嬭瘯鑰呴個璇烽偖浠跺唴瀹规ā鏉�
-        :param text: 璇█绫诲瀷锛屽彲浠ラ�夋嫨澶氫釜锛屼娇鐢� , 鍒嗛殧
-        :return:
-        """
-        # 鍒嗗壊text
-        lang_types = text.split(",")
-        # 鐐瑰嚮涓嬫媺妗�
-        self.click_wait(PackageList.add_templateLangType_select)
-        # 鑾峰彇鎵�鏈夐�夐」
-        options = self.get_elements_wait(PackageList.add_templateLangType_option)
-        # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑
-        for opt in options:
-            for lang_type in lang_types:
-                if opt.text == lang_type:
-                    # 鐩哥瓑鍒欑偣鍑昏閫夐」
-                    opt.click()
-                    break
-
-    def hrTemplateLangType_select(self, text):
-        """
-        閫夋嫨HR閭欢鍐呭妯℃澘
-        :param text: 璇█绫诲瀷锛屽彲浠ラ�夋嫨澶氫釜锛屼娇鐢� , 鍒嗛殧
-        :return:
-        """
-        # 鍒嗗壊text
-        lang_types = text.split(",")
-        # 鐐瑰嚮涓嬫媺妗�
-        self.click_wait(PackageList.add_hrTemplateLangType_select)
-        # 鑾峰彇鎵�鏈夐�夐」
-        options = self.get_elements_wait(PackageList.add_hrTemplateLangType_option)
-        # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑
-        for opt in options:
-            for lang_type in lang_types:
-                if opt.text == lang_type:
-                    # 鐩哥瓑鍒欑偣鍑昏閫夐」
-                    opt.click()
-                    break
-
-    def reportTemplate_select(self, text):
-        """
-        鎶ュ憡妯℃澘閫夋嫨
-        :param text: 妯℃澘锛屽彲浠ラ�夋嫨澶氫釜锛屼娇鐢� , 鍒嗛殧
-        :return:
-        """
-        # 鍒嗗壊text
-        templates = text.split(",")
-        # 鐐瑰嚮涓嬫媺妗�
-        self.click_wait(PackageList.add_reportTemplateId_select)
-        # 鑾峰彇鎵�鏈夐�夐」
-        options = self.get_elements_wait(PackageList.add_reportTemplateId_option)
-        # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑
-        for opt in options:
-            for template in templates:
-                if opt.text == template:
-                    # 鐩哥瓑鍒欑偣鍑昏閫夐」
-                    opt.click()
-                    break
-        # 鍐嶆鐐瑰嚮涓嬫媺妗�
-        self.click_wait(PackageList.add_reportTemplateId_select)
-
-    def position_input(self, text):
-        """
-        杈撳叆瑕佽瘎浠风殑宀椾綅
-        :param text:
-        :return:
-        """
-        self.send_text_wait(text, PackageList.add_position_input)
-
-    def professionalCategory_input(self, text):
-        """
-        杈撳叆鑱屼笟澶х被
-        :param text:
-        :return:
-        """
-        self.send_text_wait(text, PackageList.add_professionalCategory_input)
-
-    def superiorPosition_input(self, text):
-        """
-        杈撳叆涓婄骇宀椾綅
-        :param text:
-        :return:
-        """
-        self.send_text_wait(text, PackageList.add_superiorPosition_input)
-
-    def autoSendReport_checkbox(self):
-        """
-        鐐瑰嚮娴嬭瘯鑰呮帴鏀舵姤鍛�
-        :return:
-        """
-        self.click_wait(PackageList.add_autoSendReport_checkbox)
-
-    def memberReportLangType_select(self, text):
-        """
-        娴嬭瘯鑰呮姤鍛婇偖浠惰瑷�绫诲瀷
-        :param text: 璇█绫诲瀷锛屽彲浠ラ�夋嫨澶氫釜锛屼娇鐢� , 鍒嗛殧
-        :return:
-        """
-        # 鍒嗗壊text
-        lang_types = text.split(",")
-        # 鐐瑰嚮涓嬫媺妗�
-        self.click_wait(PackageList.add_memberTemplateLangType_select)
-        # 鑾峰彇鎵�鏈夐�夐」
-        options = self.get_elements_wait(PackageList.add_memberTemplateLangType_option)
-        # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑
-        for opt in options:
-            for lang_type in lang_types:
-                if opt.text == lang_type:
-                    # 鐩哥瓑鍒欑偣鍑昏閫夐」
-                    opt.click()
-                    break
+        self.click(self.es.prodTree_confirm_btn)
 
     def select_code_checkbox(self, check_text, uncheck_text):
         """
@@ -231,32 +287,23 @@
         :return:
         """
         # 鑾峰彇鎵�鏈変汉鍙i�夌紪鐮侀�夋鍏冪礌
-        code_boxs = self.get_elements_wait(PackageList.add_code_checkbox)
+        code_boxs = self.get_elements_wait(self.es.add_code_checkbox)
 
         # 灏哻heck_text鍒嗗壊
         code_check_texts = check_text.split(',')
+        # 閫夋嫨浜哄彛瀛︾紪鐮�
         for code_text in code_check_texts:
             for code_box in code_boxs:
                 if code_text == code_box.text:
                     code_box.click()
 
-        # 灏哻heck_text鍒嗗壊
+        # 灏唘ncheck_text鍒嗗壊
         code_uncheck_texts = uncheck_text.split(',')
+        # 鍙栨秷閫夋嫨浜哄彛瀛︾紪鐮�
         for code_text in code_uncheck_texts:
             for code_box in code_boxs:
                 if code_text == code_box.text:
                     code_box.click()
-
-
-
-    def add_confirm(self):
-        """
-        鐐瑰嚮纭鎸夐挳
-        :return:
-        """
-        # 鍥炲埌涓婁竴灞俰frame
-        self.switch_parent_iframe()
-        self.click_wait(PackageList.add_confirm_btn)
 
     def is_create_success(self, packageName):
         """
@@ -264,72 +311,101 @@
         :param packageName: 娴嬭瘯鍖呭悕绉�
         :return: bool
         """
-        names = self.get_elements_wait(PackageList.table_packageName_a)
+        names = self.get_eles(self.es.table_packageName_a)
         for name in names:
             if name.text == packageName:
                 return True
         return False
 
-    def click_package_checkbox(self, packageName):
+    def select_package_checkbox(self, packageName):
         """
         閫変腑娴嬭瘯鍖咃紝鍕鹃�夊搴旀祴璇曞寘鍒楄〃鐨勫閫夋
         :param packageName: 娴嬭瘯鍖呭悕绉�
         :return:
         """
         # 鑾峰彇鍒皌able鐨勬墍鏈塼r
-        table_trs = self.get_elements_wait(PackageList.table_package_tr)
+        table_trs = self.get_eles(self.es.table_package_tr)
         for tr in table_trs:
+            # 鍒ゆ柇澶嶉�夋鏄惁涓洪�変腑鐘舵��
+            tr_class = tr.get_attribute("class")
+            if tr_class == "selected":
+                # 宸茬偣鍑荤洿鎺ラ��鍑哄惊鐜�
+                continue
             # 娴嬭瘯鍖呭悕绉板湪tr涓殑瀹氫綅
             package_name_loc = (By.XPATH, "td[2]/a")
             # 鑾峰彇tr涓殑娴嬭瘯鍖呭悕绉�
-            tr_package_name = self.get_element_in(tr, package_name_loc).text
+            tr_package_name = tr.find_element(*package_name_loc).text
             if tr_package_name == packageName:
                 # 澶嶉�夋鍦╰r涓殑瀹氫綅
                 package_checkbox_loc = (By.XPATH, "td[1]/input")
                 # 鑾峰彇澶嶉�夋鍏冪礌
-                tr_checkbox = self.get_element_in(tr, package_checkbox_loc)
+                tr_checkbox = tr.find_element(*package_checkbox_loc)
                 # 鐐瑰嚮澶嶉�夋
                 tr_checkbox.click()
                 break
 
-    def click_share_1_btn(self):
+    def click_package_name(self, packageName):
         """
-        鐐瑰嚮鐢熸垚鍒嗕韩閾炬帴鎸夐挳
+        鐐瑰嚮鍖呭悕绉拌烦杞〉闈�
+        :param packageName:
         :return:
         """
-        self.click_wait(PackageList.share_1_btn)
+        # 鑾峰彇鍒版墍鏈夋祴璇曞寘鍚嶇Оa鏍囩
+        package_names = self.get_eles(self.es.table_packageName_a)
+        for name in package_names:
+            if name.text == packageName:
+                name.click()
 
-    def get_share_url(self):
+    def get_share_url(self, package_name):
         """
         鑾峰彇鍒嗕韩閾炬帴
         :return: url
         """
+        # 鍕鹃�夋祴璇曞寘
+        self.select_package_checkbox(package_name)
+        # 鐐瑰嚮鐢熸垚鍒嗕韩閾炬帴鎸夐挳
+        self.click(self.es.share_1_btn)
         # 鍒囨崲鍒皊hare鐨刬frame涓�
-        self.switch_iframe(PackageList.share_iframe)
+        self.switch_iframe(self.es.share_iframe)
         # 鑾峰彇url
-        url = self.get_input_value_js(PackageList.share_url_input)
+        url = self.get_value_js(self.es.share_url_input)
         # 閫�鍥炰笂涓�灞俰frame
         self.switch_parent_iframe()
         # 鐐瑰嚮鍏抽棴鎸夐挳
-        self.click_wait(PackageList.share_cancel_btn)
-        time.sleep(1)
+        self.click(self.es.share_cancel_btn)
+        time.sleep(2)
         return url
 
-    def selector(self, click_loc, options_loc, text):
+    def verify_code_checked(self, text: str):
         """
-        閫氱敤閫夋嫨鍣紝鐩存帴璋冪敤閫夋嫨涓嬫媺妗嗛�夐」
-        :param click_loc: 鐐瑰嚮鍚庡嚭鐜颁笅鎷夐�夐」鐨勫厓绱犲畾浣�
-        :param options_loc: 閫夐」鐨勫厓绱犲畾浣�
-        :param text: 鍒ゆ柇鐐瑰嚮鐨勬枃鏈�
+        鏍¢獙浜哄彛瀛︾紪鐮佹槸鍚﹀嬀閫�
         :return:
         """
-        # 鐐瑰嚮涓嬫媺妗�
-        self.click_wait(click_loc)
-        # 鑾峰彇鎵�鏈夐�夐」
-        options = self.get_elements_wait(options_loc)
-        # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑
-        for opt in options:
-            if opt.text == text:
-                # 鐩哥瓑鍒欑偣鍑昏閫夐」
-                opt.click()
-                break
+        texts = text.split(",")
+        # 鑾峰彇鍒版墍鏈変汉鍙e缂栫爜鐨刲abel
+        eles = self.get_eles(self.es.add_code_checkbox)
+        for ele in eles:
+            for t in texts:
+                if t == ele.text:
+                    ele_class = ele.find_element(By.XPATH, "div").get_attribute("class")
+                    # 濡傛灉class涓嶅寘鍚玞hecked鍒欒繑鍥濬alse
+                    if "checked" not in ele_class:
+                        return False
+
+
+    def verify_code_unchecked(self, text: str):
+        """
+        鏍¢獙浜哄彛瀛︾紪鐮佹槸鍚︽病鏈夎鍕鹃��
+        :return:
+        """
+        texts = text.split(",")
+        # 鑾峰彇鍒版墍鏈変汉鍙e缂栫爜鐨刲abel
+        eles = self.get_eles(self.es.add_code_checkbox)
+        for ele in eles:
+            for t in texts:
+                if t== ele.text:
+                    ele_class = ele.find_element(By.XPATH, "div").get_attribute("class")
+                    # 濡傛灉class鍖呭惈checked鍒欒繑鍥濬alse
+                    if "checked" in ele_class:
+                        return False
+
diff --git a/report/report.html b/report/report.html
index f7900d7..ba2fafe 100644
--- a/report/report.html
+++ b/report/report.html
@@ -253,10 +253,10 @@
 }
 </script>
     <h1>report.html</h1>
-    <p>Report generated on 18-Jul-2023 at 17:34:03 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v3.2.0</p>
+    <p>Report generated on 28-Jul-2023 at 16:53:13 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v3.2.0</p>
     <h2>Summary</h2>
-    <p>5 tests ran in 133.54 seconds. </p>
-    <p class="filter" hidden="true">(Un)check the boxes to filter the results.</p><input checked="true" class="filter" data-test-result="passed" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="passed">5 passed</span>, <input checked="true" class="filter" data-test-result="skipped" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="skipped">0 skipped</span>, <input checked="true" class="filter" data-test-result="failed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="failed">0 failed</span>, <input checked="true" class="filter" data-test-result="error" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="error">0 errors</span>, <input checked="true" class="filter" data-test-result="xfailed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="xfailed">0 expected failures</span>, <input checked="true" class="filter" data-test-result="xpassed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="xpassed">0 unexpected passes</span>
+    <p>19 tests ran in 567.35 seconds. </p>
+    <p class="filter" hidden="true">(Un)check the boxes to filter the results.</p><input checked="true" class="filter" data-test-result="passed" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="passed">19 passed</span>, <input checked="true" class="filter" data-test-result="skipped" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="skipped">0 skipped</span>, <input checked="true" class="filter" data-test-result="failed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="failed">0 failed</span>, <input checked="true" class="filter" data-test-result="error" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="error">0 errors</span>, <input checked="true" class="filter" data-test-result="xfailed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="xfailed">0 expected failures</span>, <input checked="true" class="filter" data-test-result="xpassed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="xpassed">0 unexpected passes</span>
     <h2>Results</h2>
     <table id="results-table">
       <thead id="results-table-head">
@@ -270,8 +270,8 @@
       <tbody class="passed results-table-row">
         <tr>
           <td class="col-result">Passed</td>
-          <td class="col-name">testcase/test_ciaq.py::TestCIAQ::test_login[login]</td>
-          <td class="col-duration">5.01</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_create_package[testPackageList]</td>
+          <td class="col-duration">9.81</td>
           <td class="col-links"></td></tr>
         <tr>
           <td class="extra" colspan="4">
@@ -279,8 +279,8 @@
       <tbody class="passed results-table-row">
         <tr>
           <td class="col-result">Passed</td>
-          <td class="col-name">testcase/test_ciaq.py::TestCIAQ::test_create_package[CIAQ]</td>
-          <td class="col-duration">2.07</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_edit_package[testPackageList]</td>
+          <td class="col-duration">10.59</td>
           <td class="col-links"></td></tr>
         <tr>
           <td class="extra" colspan="4">
@@ -288,8 +288,8 @@
       <tbody class="passed results-table-row">
         <tr>
           <td class="col-result">Passed</td>
-          <td class="col-name">testcase/test_ciaq.py::TestCIAQ::test_open_url[CIAQ]</td>
-          <td class="col-duration">17.20</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_add_member[memberDetail]</td>
+          <td class="col-duration">10.96</td>
           <td class="col-links"></td></tr>
         <tr>
           <td class="extra" colspan="4">
@@ -297,8 +297,8 @@
       <tbody class="passed results-table-row">
         <tr>
           <td class="col-result">Passed</td>
-          <td class="col-name">testcase/test_ciaq.py::TestCIAQ::test_answer</td>
-          <td class="col-duration">101.78</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_edit_member[memberDetail]</td>
+          <td class="col-duration">6.59</td>
           <td class="col-links"></td></tr>
         <tr>
           <td class="extra" colspan="4">
@@ -306,8 +306,134 @@
       <tbody class="passed results-table-row">
         <tr>
           <td class="col-result">Passed</td>
-          <td class="col-name">testcase/test_ciaq.py::TestCIAQ::test_delete_package</td>
-          <td class="col-duration">7.31</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_export_member[memberDetail]</td>
+          <td class="col-duration">2.31</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_export_url[memberDetail]</td>
+          <td class="col-duration">1.13</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_import[memberDetail]</td>
+          <td class="col-duration">4.23</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_send_email[memberDetail]</td>
+          <td class="col-duration">8.24</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_send_sms[memberDetail]</td>
+          <td class="col-duration">9.00</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_skip_report[memberDetail]</td>
+          <td class="col-duration">5.16</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_remove_member[memberDetail]</td>
+          <td class="col-duration">1.87</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_edit_prompt[testPackageList]</td>
+          <td class="col-duration">368.04</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_verify_member_status[testPackageList]</td>
+          <td class="col-duration">5.39</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_generate_export_report[testPackageList]</td>
+          <td class="col-duration">26.83</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_download_report[testPackageList]</td>
+          <td class="col-duration">2.08</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_export_report[testPackageList]</td>
+          <td class="col-duration">20.38</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_export_data[testPackageList]</td>
+          <td class="col-duration">2.18</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_hr_resend[testPackageList]</td>
+          <td class="col-duration">30.40</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="empty log">No log output captured.</div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">testcase/test_2package_list.py::TestPackageList::test_member_resend[testPackageList]</td>
+          <td class="col-duration">37.73</td>
           <td class="col-links"></td></tr>
         <tr>
           <td class="extra" colspan="4">
diff --git a/testcase/conftest.py b/testcase/conftest.py
index 84df2a8..d82f962 100644
--- a/testcase/conftest.py
+++ b/testcase/conftest.py
@@ -5,9 +5,23 @@
 import pytest
 import json
 import os
+from selenium import webdriver
+from selenium.webdriver.chrome.options import Options
+from selenium.webdriver.chrome.service import Service
+from webdriver_manager.chrome import ChromeDriverManager
 
 
-@pytest.fixture
+@pytest.fixture(scope="session")
+def driver(request):
+    options = Options()
+    options.debugger_address = "127.0.0.1:9222"
+    # 鍒濆鍖杦ebdriver
+    driver = webdriver.Chrome(options=options)
+    request.addfinalizer(driver.quit)
+    return driver
+
+
+@pytest.fixture(scope="session")
 def data_read(request) -> dict:
     """
     璇诲彇娴嬭瘯浣跨敤鐨勬暟鎹�
@@ -16,6 +30,8 @@
     """
     # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
     root_path = os.getcwd()
+    if "\\testcase" in root_path:
+        root_path = root_path[0:root_path.rfind("\\testcase")]
     # 鑾峰彇鍒拌鑾峰彇鏁版嵁鐨勯敭
     key = request.param
     # 璇诲彇鏁版嵁
diff --git a/testcase/test_2package_list.py b/testcase/test_2package_list.py
new file mode 100644
index 0000000..79c0606
--- /dev/null
+++ b/testcase/test_2package_list.py
@@ -0,0 +1,820 @@
+import os
+from datetime import datetime
+import time
+from selenium.webdriver.common.by import By
+from selenium.common.exceptions import TimeoutException
+from selenium.common.exceptions import NoSuchElementException
+
+import pytest
+from comm.comm import *
+from comm.read_data import *
+from comm.write_data import *
+from selenium import webdriver
+from po.login_page import LoginPage
+from po.home_page import HomePage
+from po.test_package_list_page import TestPackageListPage
+from po.member_detail_page import MemberDetailPage
+from po.report_page import ReportPage
+from po.share_add_page import ShareAddPage
+from po.maq_answer_page import MAQAnswerPage
+from po.caq_answer_page import CAQAnswerPage
+from comm.my_random import *
+
+
+class TestPackageList:
+    driver = None
+    test_package_name = "MAQV2鑷姩娴嬭瘯鍖�-20230727155906"
+    member_email = None
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_create_package(self, data_read: dict, driver):
+        """
+        鍒涘缓娴嬭瘯鍖�
+        :param data_read: 璇诲彇鏁版嵁
+        :return:
+        """
+        # 鍒涘缓home椤甸潰鐨勫璞�
+        home_page = HomePage(driver)
+        # 鐐瑰嚮宸︿晶鑿滃崟杩涘叆椤甸潰
+        home_page.menu_select(data_read["menu"])
+        # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
+        test_package_list = TestPackageListPage(driver)
+        # 鍒涘缓娴嬭瘯鍖呭苟鎺ユ敹鍒涘缓鐨勬祴璇曞寘鍚嶇О
+        create_package_name = test_package_list.create_package(data_read["add"])
+        # 璧嬪�煎埌绫诲彉閲�
+        TestPackageList.test_package_name = create_package_name
+        time.sleep(5)
+        # 鍒ゆ柇鏄惁鎴愬姛鍒涘缓
+        assert test_package_list.is_create_success(create_package_name)
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_edit_package(self, data_read: dict, driver):
+        """
+        淇敼娴嬭瘯鍖�
+        :return:
+        """
+        # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
+        test_package_list = TestPackageListPage(driver)
+        # 鍕鹃�夋柊鍒涘缓鐨勬祴璇曞寘
+        test_package_list.select_package_checkbox(TestPackageList.test_package_name)
+        # 鐐瑰嚮淇敼鎸夐挳
+        test_package_list.click(test_package_list.es.edit_btn)
+        # 鑾峰彇淇敼鏁版嵁
+        edit_data = data_read["edit"]
+        # 淇敼娴嬭瘯鍖�
+        test_package_name = test_package_list.edit_package(edit_data)
+        TestPackageList.test_package_name = test_package_name
+        time.sleep(5)
+        # 鏍¢獙鏄惁淇敼鎴愬姛
+        flag = test_package_list.verify_edit_success(test_package_name, edit_data)
+        # 鍒囨崲鍒颁笂涓�灞俰frame
+        test_package_list.switch_parent_iframe()
+        # 鐐瑰嚮鍏抽棴鎸夐挳
+        test_package_list.click(test_package_list.es.edit_cancel_btn)
+        assert flag
+
+    @pytest.mark.parametrize('data_read', ["memberDetail"], indirect=True)
+    def test_add_member(self, data_read: dict, driver):
+        """
+        鏂板璇勬祴浜哄憳
+        :param data_read:
+        :param driver:
+        :return:
+        """
+        # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
+        test_package_list = TestPackageListPage(driver)
+        # 鐐瑰嚮娴嬭瘯鍖呭悕绉�
+        test_package_list.click_package_name(TestPackageList.test_package_name)
+        time.sleep(5)
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟椤甸潰瀵硅薄
+        member_detail = MemberDetailPage(driver)
+        # 鏂板娴嬭瘎浜哄憳
+        member_email = member_detail.add_member(data_read["add"])
+        TestPackageList.member_email = member_email
+        time.sleep(5)
+        # 鏍¢獙鏄惁鏂板鎴愬姛
+        assert member_detail.is_create_success(member_email)
+
+    @pytest.mark.parametrize('data_read', ["memberDetail"], indirect=True)
+    def test_edit_member(self, data_read: dict, driver):
+        """
+        淇敼娴嬭瘎浜哄憳
+        :param data_read:
+        :param driver:
+        :return:
+        """
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟椤甸潰瀵硅薄
+        member_detail = MemberDetailPage(driver)
+        # 淇敼娴嬭瘎浜哄憳
+        member_email = member_detail.edit_member(TestPackageList.member_email, data_read["edit"])
+        TestPackageList.member_email = member_email
+        time.sleep(5)
+        # 鏍¢獙鏄惁淇敼鎴愬姛
+        assert member_detail.is_edit_success(TestPackageList.member_email, data_read["edit"])
+
+
+
+    @pytest.mark.parametrize('data_read', ["memberDetail"], indirect=True)
+    def test_export_member(self, data_read: dict, driver):
+        """瀵煎嚭"""
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟椤甸潰瀵硅薄
+        member_detail = MemberDetailPage(driver)
+        # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
+        root_path = os.getcwd()
+        # 鎷兼帴涓嬭浇鏂囦欢鐩綍
+        dir_path = root_path + r"\download"
+        # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+        old_file_names = []
+        for filename in os.listdir(dir_path):
+            if os.path.isfile(os.path.join(dir_path, filename)):
+                old_file_names.append(filename)
+
+        # 鐐瑰嚮瀵煎嚭鎸夐挳
+        member_detail.click(member_detail.es.export_btn)
+        # 鐐瑰嚮纭妗嗙‘璁�
+        member_detail.click(member_detail.es.layer_confirm_btn, timeout=10)
+        i = 0
+        while i < data_read["downloadWaitTime"]:
+            # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+            new_file_names = []
+            for filename in os.listdir(dir_path):
+                if os.path.isfile(os.path.join(dir_path, filename)):
+                    new_file_names.append(filename)
+            # 鍒ゆ柇鏃ф枃浠剁殑鏁伴噺涓庢柊鏂囦欢鐨勬暟閲忔槸鍚︾浉鍚岋紝鐩稿悓鍒欑潯鐪犱竴绉�
+            if len(old_file_names) == len(new_file_names):
+                time.sleep(1)
+                i += 1
+                continue
+            else:
+                # 鍚﹀垯鐩存帴閫�鍑哄惊鐜�
+                break
+        else:
+            assert False
+        assert True
+
+    @pytest.mark.parametrize('data_read', ["memberDetail"], indirect=True)
+    def test_export_url(self, data_read: dict, driver):
+        """瀵煎嚭娴嬭瘯閾炬帴"""
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟椤甸潰瀵硅薄
+        member_detail = MemberDetailPage(driver)
+        # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
+        root_path = os.getcwd()
+        # 鎷兼帴涓嬭浇鏂囦欢鐩綍
+        dir_path = root_path + r"\download"
+        # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+        old_file_names = []
+        for filename in os.listdir(dir_path):
+            if os.path.isfile(os.path.join(dir_path, filename)):
+                old_file_names.append(filename)
+
+        # 鐐瑰嚮瀵煎嚭娴嬭瘯閾炬帴鎸夐挳
+        member_detail.click(member_detail.es.export_url_btn)
+        # 鐐瑰嚮纭妗嗙‘璁�
+        member_detail.click(member_detail.es.layer_confirm_btn, timeout=10)
+        i = 0
+        while i < data_read["downloadWaitTime"]:
+            # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+            new_file_names = []
+            for filename in os.listdir(dir_path):
+                if os.path.isfile(os.path.join(dir_path, filename)):
+                    new_file_names.append(filename)
+            # 鍒ゆ柇鏃ф枃浠剁殑鏁伴噺涓庢柊鏂囦欢鐨勬暟閲忔槸鍚︾浉鍚岋紝鐩稿悓鍒欑潯鐪犱竴绉�
+            if len(old_file_names) == len(new_file_names):
+                time.sleep(1)
+                i += 1
+                continue
+            else:
+                # 鍚﹀垯鐩存帴閫�鍑哄惊鐜�
+                break
+        else:
+            assert False
+        assert True
+
+    @pytest.mark.parametrize('data_read', ["memberDetail"], indirect=True)
+    def test_import(self, data_read: dict, driver):
+        """鎵归噺瀵煎叆"""
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟椤甸潰瀵硅薄
+        member_detail = MemberDetailPage(driver)
+        # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
+        root_path = os.getcwd()
+        # 鎷兼帴瀵煎叆鏂囦欢璺緞
+        file_path = root_path + r"\import\member_import.xlsx"
+        # 鐐瑰嚮鎵归噺瀵煎叆鎸夐挳
+        member_detail.click(member_detail.es.import_btn)
+        # 鍙戦�佹枃浠惰矾寰勫埌鏂囦欢涓婁紶杈撳叆妗�
+        member_detail.fill(member_detail.es.import_input, file_path)
+        time.sleep(2)
+        # 鐐瑰嚮瀵煎叆鎸夐挳
+        member_detail.click(member_detail.es.import_confirm_btn)
+        time.sleep(2)
+        # 鍒ゆ柇鏄惁瀵煎叆鎴愬姛
+        try:
+            member_detail.get_ele(member_detail.es.import_success_text, timeout=10)
+            # 鐐瑰嚮纭鎸夐挳
+            member_detail.click(member_detail.es.layer_confirm_btn)
+            assert True
+        except TimeoutException:
+            try:
+                # 鐐瑰嚮纭鎸夐挳锛屽鏋滀笉瀛樺湪鍒欎笉鐐瑰嚮
+                member_detail.click(member_detail.es.layer_confirm_btn, timeout=10)
+            except TimeoutException:
+                pass
+            assert False
+
+    @pytest.mark.parametrize('data_read', ["memberDetail"], indirect=True)
+    def test_send_email(self, data_read: dict, driver):
+        """鍙戦�侀偖浠�"""
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟椤甸潰瀵硅薄
+        member_detail = MemberDetailPage(driver)
+        # 鍕鹃�塼able澶村閫夋
+        member_detail.click(member_detail.es.table_thead_checkbox)
+        # 鍕鹃�変笉鍙戦�佺殑娴嬭瘎浜哄憳
+        member_detail.unselect_email_checkbox(TestPackageList.member_email)
+        # 鐐瑰嚮鍙戦�侀偖浠舵寜閽�
+        member_detail.click(member_detail.es.send_email_btn)
+        # 鐐瑰嚮纭鎸夐挳
+        member_detail.click(member_detail.es.layer_confirm_btn, timeout=10)
+        time.sleep(2)
+        # 鍐嶆鐐瑰嚮纭鎸夐挳
+        member_detail.click(member_detail.es.layer_confirm_btn, timeout=10)
+        # 鐐瑰嚮鏌ョ湅鍙戦�佺姸鎬佹寜閽�
+        member_detail.click(member_detail.es.send_status_btn)
+        time.sleep(5)
+        # 鍒囨崲鍒颁笂涓�灞俰frame
+        member_detail.switch_parent_iframe()
+        # 鍒囨崲鍒板彂閫佺姸鎬乮frame
+        member_detail.switch_iframe(member_detail.es.send_status_iframe)
+        # 鑾峰彇鍒版墍鏈塼r鍒楄〃
+        trs = member_detail.get_eles(member_detail.es.send_status_table_tr)
+        # 鍒ゆ柇鏁伴噺鏄惁澶т簬0
+        if len(trs) > 0:
+            assert True
+        else:
+            assert False
+        # 鍒犻櫎鍙戦�佷换鍔�
+        # 鍕鹃�夋墍鏈夎褰�
+        member_detail.click(member_detail.es.table_thead_checkbox)
+        # 鐐瑰嚮鍒犻櫎鎸夐挳
+        member_detail.click(member_detail.es.delete_btn)
+        # 鐐瑰嚮纭鎸夐挳
+        member_detail.click(member_detail.es.layer_confirm_btn, timeout=10)
+        # 鍏抽棴鏍囩
+        # 鍒涘缓home椤甸潰瀵硅薄
+        home = HomePage(driver)
+        # 鍏抽棴鍙戦�佺姸鎬侀〉闈�
+        home.close_tab(member_detail.es.tab_name_send_status)
+
+    @pytest.mark.parametrize('data_read', ["memberDetail"], indirect=True)
+    def test_send_sms(self, data_read: dict, driver):
+        """鍙戦�佺煭淇�"""
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟椤甸潰瀵硅薄
+        member_detail = MemberDetailPage(driver)
+        # 鍕鹃�塼able澶村閫夋
+        member_detail.click(member_detail.es.table_thead_checkbox)
+        # 鍕鹃�変笉鍙戦�佺殑娴嬭瘎浜哄憳
+        member_detail.unselect_email_checkbox(TestPackageList.member_email)
+        # 鐐瑰嚮鍙戦�侀偖浠舵寜閽�
+        member_detail.click(member_detail.es.send_sms_btn)
+        # 鐐瑰嚮纭鎸夐挳
+        member_detail.click(member_detail.es.layer_confirm_btn, timeout=10)
+        time.sleep(2)
+        # 鍐嶆鐐瑰嚮纭鎸夐挳
+        member_detail.click(member_detail.es.layer_confirm_btn, timeout=10)
+        # 鐐瑰嚮鏌ョ湅鍙戦�佺姸鎬佹寜閽�
+        member_detail.click(member_detail.es.send_status_btn)
+        time.sleep(5)
+        # 鍒囨崲鍒颁笂涓�灞俰frame
+        member_detail.switch_parent_iframe()
+        # 鍒囨崲鍒板彂閫佺姸鎬乮frame
+        member_detail.switch_iframe(member_detail.es.send_status_iframe)
+        # 鑾峰彇鍒版墍鏈塼r鍒楄〃
+        trs = member_detail.get_eles(member_detail.es.send_status_table_tr)
+        # 鍒ゆ柇鏁伴噺鏄惁澶т簬0
+        if len(trs) > 0:
+            assert True
+        else:
+            assert False
+        # 鍒犻櫎鍙戦�佷换鍔�
+        # 鍕鹃�夋墍鏈夎褰�
+        member_detail.click(member_detail.es.table_thead_checkbox)
+        # 鐐瑰嚮鍒犻櫎鎸夐挳
+        member_detail.click(member_detail.es.delete_btn)
+        # 鐐瑰嚮纭鎸夐挳
+        member_detail.click(member_detail.es.layer_confirm_btn, timeout=10)
+        # 鍏抽棴鏍囩
+        # 鍒涘缓home椤甸潰瀵硅薄
+        home = HomePage(driver)
+        # 鍏抽棴鍙戦�佺姸鎬侀〉闈�
+        home.close_tab(member_detail.es.tab_name_send_status)
+
+    @pytest.mark.parametrize('data_read', ["memberDetail"], indirect=True)
+    def test_skip_report(self, data_read: dict, driver):
+        """璺宠浆鏌ョ湅鎶ュ憡椤甸潰"""
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟椤甸潰瀵硅薄
+        member_detail = MemberDetailPage(driver)
+        # 鐐瑰嚮鏌ョ湅鎶ュ憡
+        member_detail.click(member_detail.es.table_report_btn)
+        time.sleep(5)
+        # 杩斿洖涓婁竴灞俰frame
+        member_detail.switch_parent_iframe()
+        # 鍒ゆ柇鏄惁瀛樺湪鏌ョ湅鎶ュ憡鐨刬frame
+        try:
+            member_detail.get_ele(member_detail.es.report_iframe, timeout=10)
+            # 鍏抽棴鏍囩
+            # 鍒涘缓home椤甸潰瀵硅薄
+            home = HomePage(driver)
+            # 鍏抽棴鍙戦�佺姸鎬侀〉闈�
+            home.close_tab(member_detail.es.tab_name_send_status)
+            assert True
+        except TimeoutException:
+            assert False
+
+    @pytest.mark.parametrize('data_read', ["memberDetail"], indirect=True)
+    def test_remove_member(self, data_read: dict, driver):
+        """
+        鍒犻櫎娴嬭瘎浜哄憳
+        :param data_read:
+        :param driver:
+        :return:
+        """
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟椤甸潰瀵硅薄
+        member_detail = MemberDetailPage(driver)
+        # 鍕鹃�塼able澶村閫夋
+        member_detail.click(member_detail.es.table_thead_checkbox)
+        # 鍕鹃�変笉鍒犻櫎鐨勬祴璇勪汉鍛�
+        member_detail.unselect_email_checkbox(TestPackageList.member_email)
+        # 鐐瑰嚮鍒犻櫎鎸夐挳
+        member_detail.click(member_detail.es.delete_btn)
+        # 鐐瑰嚮鍒犻櫎纭鎸夐挳
+        member_detail.click(member_detail.es.layer_confirm_btn, timeout=10)
+        # 鍒ゆ柇鍒犻櫎鏄惁鎴愬姛
+        try:
+            member_detail.wait_visible(member_detail.es.operate_success_layer)
+            assert True
+        except TimeoutException:
+            assert False
+        # 鍒涘缓home椤甸潰瀵硅薄
+        home = HomePage(driver)
+        # 鍏抽棴褰撳墠椤甸潰
+        home.close_tab(member_detail.es.tab_name_member_detail)
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_edit_prompt(self, data_read: dict, driver):
+        """浜嬩腑鎻愮ず璇慨鏀�"""
+        # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
+        test_package_list = TestPackageListPage(driver)
+        # 鍕鹃�夋柊鍒涘缓鐨勬祴璇曞寘
+        test_package_list.select_package_checkbox(TestPackageList.test_package_name)
+        # 鐐瑰嚮浜嬩腑鎻愮ず璇寜閽�
+        test_package_list.click(test_package_list.es.hint_btn)
+        # 鍒囨崲鍒癷frame
+        test_package_list.switch_iframe(test_package_list.es.hint_iframe)
+        # 鐐瑰嚮绗洓涓緭鍏ユ
+        test_package_list.click(test_package_list.es.hint_textarea)
+        # 淇敼鍐呭
+        test_package_list.fill(test_package_list.es.hint_modal_span, data_read["hint"])
+        # 鐐瑰嚮淇濆瓨
+        test_package_list.click(test_package_list.es.hint_modal_save_btn)
+        # 杩斿洖涓婁竴灞�
+        test_package_list.switch_parent_iframe()
+        # 鐐瑰嚮纭鎸夐挳
+        test_package_list.click(test_package_list.es.layer_confirm_btn)
+        # 鍒ゆ柇鎿嶄綔鎴愬姛寮圭獥鏄惁瀛樺湪
+        flag = True
+        try:
+            test_package_list.get_ele(test_package_list.es.operate_success_layer, timeout=20)
+        except TimeoutException:
+            flag = False
+
+        if flag:
+            time.sleep(2)
+            # 鑾峰彇鍒板垎浜摼鎺�
+            url = test_package_list.get_share_url(TestPackageList.test_package_name)
+            # 鎵撳紑鏂版爣绛鹃〉鍔犺浇url
+            test_package_list.goto_new_table(url)
+            # 鍒涘缓鍒嗕韩椤甸潰瀵硅薄
+            share_add = ShareAddPage(driver)
+            # 濉啓淇℃伅鎻愪氦骞惰幏鍙栨祴璇曢摼鎺�
+            test_url = share_add.get_test_url(data_read["name"], data_read["email"])
+            # 褰撳墠椤甸潰鎵撳紑閾炬帴
+            share_add.goto(test_url)
+            # 鐐瑰嚮鎻愪氦鎸夐挳
+            share_add.click(share_add.es.submit_btn, timeout=10)
+            # 鑾峰彇鏁版嵁
+            info = data_read["info"]
+            # 濉啓鍩烘湰淇℃伅骞舵彁浜�
+            share_add.fill_info(data_read["email"], info["position"], info["dept"])
+            # 鍒涘缓answer瀵硅薄
+            answer_page = MAQAnswerPage(driver)
+            # 寮�濮嬬瓟棰�
+            flag = answer_page.answer(hint=data_read["hint"], question=data_read["question"]["MAQ"])
+            # 绛斿畬棰樺叧闂綋鍓嶆爣绛鹃〉
+            driver.close()
+            # 鍒囨崲鍒扮涓�涓爣绛鹃〉
+            answer_page.switch_window(0)
+            # 缃戠粶寮傚父閲嶆柊绛旈
+            if flag == "缃戠粶寮傚父":
+                # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
+                test_package_list = TestPackageListPage(driver)
+                # 鍕鹃�夋柊鍒涘缓鐨勬祴璇曞寘
+                test_package_list.select_package_checkbox(TestPackageList.test_package_name)
+                # 鑾峰彇鍒板垎浜摼鎺�
+                url = test_package_list.get_share_url(TestPackageList.test_package_name)
+                # 鎵撳紑鏂版爣绛鹃〉鍔犺浇url
+                test_package_list.goto_new_table(url)
+                # 鍒涘缓鍒嗕韩椤甸潰瀵硅薄
+                share_add = ShareAddPage(driver)
+                # 濉啓淇℃伅鎻愪氦骞惰幏鍙栨祴璇曢摼鎺�
+                test_url = share_add.get_test_url(data_read["name"], data_read["email"])
+                # 褰撳墠椤甸潰鎵撳紑閾炬帴
+                share_add.goto(test_url)
+                # 鐐瑰嚮鎻愪氦鎸夐挳
+                share_add.click(share_add.es.submit_btn, timeout=10)
+                # 鑾峰彇鏁版嵁
+                info = data_read["info"]
+                # 濉啓鍩烘湰淇℃伅骞舵彁浜�
+                share_add.fill_info(data_read["email"], info["position"], info["dept"])
+                # 鍒涘缓answer瀵硅薄
+                answer_page = MAQAnswerPage(driver)
+                # 寮�濮嬬瓟棰�
+                flag = answer_page.answer(hint=data_read["hint"], question=data_read["question"]["MAQ"])
+                # 绛斿畬棰樺叧闂綋鍓嶆爣绛鹃〉
+                driver.close()
+                # 鍒囨崲鍒扮涓�涓爣绛鹃〉
+                answer_page.switch_window(0)
+            if flag is not None or not flag:
+                assert flag
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_verify_member_status(self, data_read: dict, driver):
+        """楠岃瘉娴嬭瘎浜哄憳鐘舵��"""
+        # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
+        test_package_list = TestPackageListPage(driver)
+        # 鐐瑰嚮娴嬭瘯鍖呭悕绉�
+        test_package_list.click_package_name(TestPackageList.test_package_name)
+        time.sleep(5)
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟椤甸潰瀵硅薄
+        member_detail = MemberDetailPage(driver)
+        # 鑾峰彇鍒楄〃
+        tr = member_detail.get_eles(member_detail.es.table_data_tr)[0]
+        # 鑾峰彇褰撳墠鏃ユ湡
+        now = datetime.now()
+        # 鎻愬彇骞淬�佹湀銆佹棩
+        year = now.year
+        month = now.month
+        if month < 10:
+            month = "0" + str(month)
+        day = now.day
+        if day < 10:
+            day = "0" + str(day)
+        # 鎷兼帴鏃ユ湡
+        date = f"{year}-{month}-{day}"
+        # 鑾峰彇绛旈寮�濮嬫椂闂�
+        start_time = tr.find_element(By.XPATH, "td[6]").text
+        # 鑾峰彇绛旈缁撴潫鏃堕棿
+        end_time = tr.find_element(By.XPATH, "td[7]").text
+        # 鑾峰彇鐘舵��
+        status = tr.find_element(By.XPATH, "td[12]/span").text
+        # 楠岃瘉
+        if date in start_time and date in end_time and status == "瀹屾垚":
+            assert True
+        else:
+            assert False
+        # 鍒涘缓home椤甸潰瀵硅薄
+        home = HomePage(driver)
+        # 鍏抽棴鍙戦�佺姸鎬侀〉闈�
+        home.close_tab(member_detail.es.tab_name_member_detail)
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_generate_export_report(self, data_read: dict, driver):
+        """閲嶆柊鐢熸垚骞跺鍑烘姤鍛�"""
+        # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
+        test_package_list = TestPackageListPage(driver)
+        # 鍕鹃�夋祴璇曞寘
+        test_package_list.select_package_checkbox(TestPackageList.test_package_name)
+        # 鐐瑰嚮璇勬祴鎶ュ憡鎸夐挳
+        test_package_list.click(test_package_list.es.report_btn)
+        time.sleep(5)
+        # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
+        root_path = os.getcwd()
+        # 鎷兼帴涓嬭浇鏂囦欢鐩綍
+        dir_path = root_path + r"\download"
+        # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+        old_file_names = []
+        for filename in os.listdir(dir_path):
+            if os.path.isfile(os.path.join(dir_path, filename)):
+                old_file_names.append(filename)
+
+        # 鍒涘缓report椤甸潰瀵硅薄
+        report = ReportPage(driver)
+        # 鍕鹃�夋墍鏈夎褰�
+        report.click(report.es.table_thead_checkbox)
+        # 鐐瑰嚮閲嶆柊鐢熸垚鎶ュ憡骞跺鍑�
+        report.click(report.es.generate_export_btn)
+        time.sleep(2)
+        while True:
+            try:
+                # 鍔犺浇妗嗗瓨鍦ㄧ潯鐪犱竴绉�
+                report.get_ele(report.es.layer_reload)
+                time.sleep(1)
+            except NoSuchElementException:
+                # 涓嶅瓨鍦ㄨ烦鍑哄惊鐜�
+                break
+
+        i = 0
+        while i < data_read["downloadWaitTime"]:
+            # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+            new_file_names = []
+            for filename in os.listdir(dir_path):
+                if os.path.isfile(os.path.join(dir_path, filename)):
+                    new_file_names.append(filename)
+            # 鍒ゆ柇鏃ф枃浠剁殑鏁伴噺涓庢柊鏂囦欢鐨勬暟閲忔槸鍚︾浉鍚岋紝鐩稿悓鍒欑潯鐪犱竴绉�
+            if len(old_file_names) == len(new_file_names):
+                time.sleep(1)
+                i += 1
+                continue
+            else:
+                # 鍚﹀垯鐩存帴閫�鍑哄惊鐜�
+                break
+        else:
+            assert False
+        assert True
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_download_report(self, data_read: dict, driver):
+        """涓嬭浇宸茬敓鎴愭姤鍛�"""
+        # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
+        root_path = os.getcwd()
+        # 鎷兼帴涓嬭浇鏂囦欢鐩綍
+        dir_path = root_path + r"\download"
+        # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+        old_file_names = []
+        for filename in os.listdir(dir_path):
+            if os.path.isfile(os.path.join(dir_path, filename)):
+                old_file_names.append(filename)
+
+        # 鍒涘缓report椤甸潰瀵硅薄
+        report = ReportPage(driver)
+        # 鐐瑰嚮涓嬭浇宸茬敓鎴愭姤鍛�
+        report.click(report.es.download_report_btn)
+        time.sleep(2)
+        while True:
+            try:
+                # 鍔犺浇妗嗗瓨鍦ㄧ潯鐪犱竴绉�
+                report.get_ele(report.es.layer_reload)
+                time.sleep(1)
+            except NoSuchElementException:
+                # 涓嶅瓨鍦ㄨ烦鍑哄惊鐜�
+                break
+
+        i = 0
+        while i < data_read["downloadWaitTime"]:
+            # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+            new_file_names = []
+            for filename in os.listdir(dir_path):
+                if os.path.isfile(os.path.join(dir_path, filename)):
+                    new_file_names.append(filename)
+            # 鍒ゆ柇鏃ф枃浠剁殑鏁伴噺涓庢柊鏂囦欢鐨勬暟閲忔槸鍚︾浉鍚岋紝鐩稿悓鍒欑潯鐪犱竴绉�
+            if len(old_file_names) == len(new_file_names):
+                time.sleep(1)
+                i += 1
+                continue
+            else:
+                # 鍚﹀垯鐩存帴閫�鍑哄惊鐜�
+                break
+        else:
+            assert False
+        assert True
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_export_report(self, data_read: dict, driver):
+        """瀵煎嚭鎶ュ憡"""
+        # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
+        root_path = os.getcwd()
+        # 鎷兼帴涓嬭浇鏂囦欢鐩綍
+        dir_path = root_path + r"\download"
+        # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+        old_file_names = listdir(dir_path)
+        # 鍒涘缓report椤甸潰瀵硅薄
+        report = ReportPage(driver)
+        # 鐐瑰嚮涓嬭浇宸茬敓鎴愭姤鍛�
+        report.click(report.es.export_btn)
+        time.sleep(2)
+
+        # 绛夊緟鍔犺浇妗嗘秷澶�
+        report.wait_layer_reload_hide()
+
+        i = 0
+        while i < data_read["downloadWaitTime"]:
+            # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+            new_file_names = listdir(dir_path)
+            # 鍒ゆ柇鏃ф枃浠剁殑鏁伴噺涓庢柊鏂囦欢鐨勬暟閲忔槸鍚︾浉鍚岋紝鐩稿悓鍒欑潯鐪犱竴绉�
+            if len(old_file_names) == len(new_file_names):
+                time.sleep(1)
+                i += 1
+                continue
+            else:
+                # 鍚﹀垯鐩存帴閫�鍑哄惊鐜�
+                break
+        else:
+            assert False
+        assert True
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_export_data(self, data_read: dict, driver):
+        """瀵煎嚭娴嬭瘯鏁版嵁"""
+        # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
+        root_path = os.getcwd()
+        # 鎷兼帴涓嬭浇鏂囦欢鐩綍
+        dir_path = root_path + r"\download"
+        # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+        old_file_names = listdir(dir_path)
+        # 鍒涘缓report椤甸潰瀵硅薄
+        report = ReportPage(driver)
+        # 鐐瑰嚮瀵煎嚭娴嬭瘯鏁版嵁鎸夐挳
+        report.click(report.es.export_data_btn)
+        time.sleep(2)
+
+        # 绛夊緟鍔犺浇妗嗘秷澶�
+        report.wait_layer_reload_hide()
+
+        new_file_names = []
+
+        i = 0
+        while i < data_read["downloadWaitTime"]:
+            # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+            new_file_names = listdir(dir_path)
+            # 鍒ゆ柇鏃ф枃浠剁殑鏁伴噺涓庢柊鏂囦欢鐨勬暟閲忔槸鍚︾浉鍚岋紝鐩稿悓鍒欑潯鐪犱竴绉�
+            if len(old_file_names) == len(new_file_names):
+                time.sleep(1)
+                i += 1
+                continue
+            else:
+                # 鍒ゆ柇鏂扮殑鏂囦欢鍚嶆槸鍚﹀寘鍚湭纭
+                for file_name in new_file_names:
+                    if "鏈‘璁�" in file_name:
+                        new_file_names = listdir(dir_path)
+                        break
+                else:
+                    # 鍚﹀垯鐩存帴閫�鍑哄惊鐜�
+                    break
+        else:
+            assert False
+
+        # 鑾峰彇涓や釜鍒楄〃涓殑宸泦
+        result = set(old_file_names).symmetric_difference(set(new_file_names))
+        result_list = list(result)
+        file_name = dir_path + "\\" + result_list[0]
+        # 璇诲彇鏂囦欢鏁版嵁
+        data_list = read_excel(file_name, "Sheet1")
+        # 瀵煎嚭鐨勬暟鎹�
+        excel_data = data_list[3]
+        # 绛旈鐨勬暟鎹�
+        answer_data: dict = data_read["question"]["MAQ"]
+        # 瀵规瘮鏁版嵁
+        for key in answer_data.keys():
+            if str(excel_data[key]) != str(excel_data[key]):
+                print(key + "鏁版嵁閿欒")
+                # 鍒涘缓report椤甸潰瀵硅薄
+                report = ReportPage(driver)
+                home = HomePage(driver)
+                # 鍏抽棴鏍囩椤�
+                home.close_tab(report.es.tab_name_report)
+                assert False
+        # 鍒涘缓report椤甸潰瀵硅薄
+        report = ReportPage(driver)
+        home = HomePage(driver)
+        # 鍏抽棴鏍囩椤�
+        home.close_tab(report.es.tab_name_report)
+        assert True
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_hr_resend(self, data_read: dict, driver):
+        """HR閭欢琛ュ彂"""
+        # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
+        test_package_list = TestPackageListPage(driver)
+        # 鐐瑰嚮娴嬭瘯鍖呭悕绉�
+        test_package_list.click_package_name(TestPackageList.test_package_name)
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟瀵硅薄
+        member = MemberDetailPage(driver)
+        # 鐐瑰嚮鏌ョ湅鎶ュ憡閭欢鍙戦�佽褰�
+        member.click(member.es.report_send_log_btn)
+        time.sleep(5)
+        member.switch_parent_iframe()
+        # 鍒囨崲iframe
+        member.switch_iframe(member.es.report_send_log_iframe)
+        # 鑾峰彇琛ュ彂涔嬪墠鐨勯噸璇曟鏁�
+        before_resend_number = int(member.get_ele(member.es.resend_number_text).text)
+        # 鐐瑰嚮鍏ㄩ�夋寜閽�
+        member.click(member.es.table_thead_checkbox)
+        # 鐐瑰嚮HR閭欢琛ュ彂鎸夐挳
+        member.click(member.es.hr_resend_btn)
+        # 鐐瑰嚮纭鎸夐挳
+        member.click(member.es.layer_confirm_btn)
+        time.sleep(2)
+        # 绛夊緟鍔犺浇瀹屾垚
+        while True:
+            try:
+                # 鍔犺浇妗嗗瓨鍦ㄧ潯鐪犱竴绉�
+                member.get_ele(member.es.layer_reload)
+                time.sleep(1)
+            except NoSuchElementException:
+                # 涓嶅瓨鍦ㄨ烦鍑哄惊鐜�
+                break
+        time.sleep(2)
+        # 鑾峰彇琛ュ彂涔嬪悗鐨勯噸璇曟鏁�
+        after_resend_number = int(member.get_ele(member.es.resend_number_text).text)
+        # 姣旇緝涓ゆ
+        if before_resend_number + 1 == after_resend_number:
+            assert True
+        else:
+            assert False
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_member_resend(self, data_read: dict, driver):
+        """娴嬭瘯鑰呴偖浠惰ˉ鍙�"""
+        # 鍒涘缓娴嬭瘎浜哄憳鍚嶅崟瀵硅薄
+        member = MemberDetailPage(driver)
+        member.switch_parent_iframe()
+        # 鍒囨崲iframe
+        member.switch_iframe(member.es.report_send_log_iframe)
+        # 鑾峰彇琛ュ彂涔嬪墠鐨勯噸璇曟鏁�
+        before_resend_number = int(member.get_ele(member.es.resend_number_text).text)
+        # 鐐瑰嚮鍏ㄩ�夋寜閽�
+        member.click(member.es.table_thead_checkbox)
+        # 鐐瑰嚮娴嬭瘯鑰呴偖浠惰ˉ鍙戞寜閽�
+        member.click(member.es.member_resend_btn)
+        # 鐐瑰嚮纭鎸夐挳
+        member.click(member.es.layer_confirm_btn)
+        time.sleep(2)
+        # 绛夊緟鍔犺浇瀹屾垚
+        while True:
+            try:
+                # 鍔犺浇妗嗗瓨鍦ㄧ潯鐪犱竴绉�
+                member.get_ele(member.es.layer_reload)
+                time.sleep(1)
+            except NoSuchElementException:
+                # 涓嶅瓨鍦ㄨ烦鍑哄惊鐜�
+                break
+        time.sleep(2)
+        # 鑾峰彇琛ュ彂涔嬪悗鐨勯噸璇曟鏁�
+        after_resend_number = int(member.get_ele(member.es.resend_number_text).text)
+        # 姣旇緝涓ゆ
+        if before_resend_number + 1 == after_resend_number:
+            assert True
+        else:
+            assert False
+        home = HomePage(driver)
+        # 鍏抽棴鏍囩椤�
+        home.close_tab(member.es.tab_name_report_send_log)
+        home.close_tab(member.es.tab_name_member_detail)
+
+    # @pytest.mark.parametrize('data_read', ["memberDetail"], indirect=True)
+    # def test_recover_package(self, data_read: dict, driver):
+    #     # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
+    #     test_package_list = TestPackageListPage(driver)
+    #     # 鐐瑰嚮鍥炴敹娴嬭瘯鍖呮寜閽�
+    #     test_package_list.click(test_package_list.es.recover_btn)
+    #     # 鐐瑰嚮纭鎸夐挳
+    #     test_package_list.click(test_package_list.es.layer_confirm_btn)
+    #     time.sleep(2)
+    #     # 鍐嶆鐐瑰嚮纭鎸夐挳
+    #     test_package_list.click(test_package_list.es.layer_confirm_btn)
+    #     # 鑾峰彇鍒板垎浜摼鎺�
+    #     url = test_package_list.get_share_url(TestPackageList.test_package_name)
+    #     # 鎵撳紑鏂版爣绛鹃〉鍔犺浇url
+    #     test_package_list.goto_new_table(url)
+    #     # 鍒涘缓鍒嗕韩椤甸潰瀵硅薄
+    #     share_add = ShareAddPage(driver)
+    #     # 濉啓淇℃伅鎻愪氦骞惰幏鍙栨祴璇曢摼鎺�
+    #     test_url = share_add.get_test_url(data_read["edit"]["name"], data_read["edit"]["email"])
+    #     # 褰撳墠椤甸潰鎵撳紑閾炬帴
+    #     share_add.goto(test_url)
+    #     # 鍒ゆ柇鏄惁鑳藉鑾峰彇鍒版彁浜ゆ寜閽�
+    #     try:
+    #         share_add.get_ele(share_add.es.submit_btn, timeout=10)
+    #         assert False
+    #     except TimeoutException:
+    #         assert True
+    #
+    #     # 鍏抽棴褰撳墠鏍囩椤�
+    #     driver.close()
+    #     # 鍒囨崲鍒扮涓�涓爣绛鹃〉
+    #     share_add.switch_window(0)
+
+
+
+
+
+if __name__ == '__main__':
+    pytest.main(["-s", __file__])
+
+
+
+
+
+
+
+
+
+
diff --git a/testcase/test_3export_test_data.py b/testcase/test_3export_test_data.py
new file mode 100644
index 0000000..ad11842
--- /dev/null
+++ b/testcase/test_3export_test_data.py
@@ -0,0 +1,124 @@
+import os
+from datetime import datetime
+import time
+from selenium.webdriver.common.by import By
+from selenium.common.exceptions import TimeoutException
+from selenium.common.exceptions import NoSuchElementException
+
+import pytest
+from comm.comm import *
+from comm.read_data import *
+from comm.write_data import *
+from selenium import webdriver
+from po.login_page import LoginPage
+from po.home_page import HomePage
+from po.export_test_data_page import ExportTestDataPage
+from po.member_detail_page import MemberDetailPage
+from po.report_page import ReportPage
+from po.share_add_page import ShareAddPage
+from po.maq_answer_page import MAQAnswerPage
+from po.caq_answer_page import CAQAnswerPage
+from comm.my_random import *
+
+
+class TestPackageList:
+    driver = None
+    test_package_name = "MAQV2鑷姩娴嬭瘯鍖�-20230727155906"
+    member_email = None
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_export_test_data(self, data_read: dict, driver):
+        home = HomePage(driver)
+        home.menu_select("娴嬭瘯鍖呯鐞�/瀵煎嚭娴嬭瘯鏁版嵁")
+        time.sleep(5)
+        export = ExportTestDataPage(driver)
+        # 閫夋嫨浜у搧鍖�
+        export.select(export.es.product_select, export.es.product_option, data_read["edit"]["product"])
+
+        # 鑾峰彇褰撳墠鏃ユ湡
+        now = datetime.now()
+        # 鎻愬彇骞淬�佹湀銆佹棩
+        year = now.year
+        month = now.month
+        if month < 10:
+            month = "0" + str(month)
+        day = now.day
+        if day < 10:
+            day = "0" + str(day)
+        # 鎷兼帴鏃ユ湡
+        date = f"{year}-{month}-{day}"
+        # 杈撳叆瀹屾垚鏃堕棿
+        export.fill(export.es.test_begin_time_input, date)
+        export.fill(export.es.test_end_time_input, date)
+        # 鐐瑰嚮鎼滅储鎸夐挳
+        export.click(export.es.search_btn)
+        time.sleep(5)
+
+        # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
+        root_path = os.getcwd()
+        # 鎷兼帴涓嬭浇鏂囦欢鐩綍
+        dir_path = root_path + r"\download"
+        # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+        old_file_names = listdir(dir_path)
+
+        # 鍕鹃��
+        export.click(export.es.table_thead_checkbox)
+        # 鐐瑰嚮瀵煎嚭
+        export.click(export.es.export_test_data_btn)
+
+        # 绛夊緟鍔犺浇妗嗘秷澶�
+        export.wait_layer_reload_hide()
+
+        new_file_names = []
+
+        i = 0
+        while i < data_read["downloadWaitTime"]:
+            # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+            new_file_names = listdir(dir_path)
+            # 鍒ゆ柇鏃ф枃浠剁殑鏁伴噺涓庢柊鏂囦欢鐨勬暟閲忔槸鍚︾浉鍚岋紝鐩稿悓鍒欑潯鐪犱竴绉�
+            if len(old_file_names) == len(new_file_names):
+                time.sleep(1)
+                i += 1
+                continue
+            else:
+                # 鍒ゆ柇鏂扮殑鏂囦欢鍚嶆槸鍚﹀寘鍚湭纭
+                for file_name in new_file_names:
+                    if "鏈‘璁�" in file_name:
+                        new_file_names = listdir(dir_path)
+                        break
+                else:
+                    # 鍚﹀垯鐩存帴閫�鍑哄惊鐜�
+                    break
+        else:
+            assert False
+
+        # 鑾峰彇涓や釜鍒楄〃涓殑宸泦
+        result = set(old_file_names).symmetric_difference(set(new_file_names))
+        result_list = list(result)
+        file_name = dir_path + "\\" + result_list[0]
+        # 璇诲彇鏂囦欢鏁版嵁
+        data_list = read_excel(file_name, "Sheet1")
+        # 瀵煎嚭鐨勬暟鎹�
+        excel_data = data_list[3]
+        # 绛旈鐨勬暟鎹�
+        answer_data: dict = data_read["question"]["MAQ"]
+        # 瀵规瘮鏁版嵁
+        for key in answer_data.keys():
+            if excel_data[key] != answer_data[key]["answer"]:
+                print(key + "鏁版嵁閿欒")
+                assert False
+        assert True
+
+
+if __name__ == '__main__':
+    pytest.main(["-s", __file__])
+
+
+
+
+
+
+
+
+
+
diff --git a/testcase/test_caq.py b/testcase/test_caq.py
index cd7bf3c..30cac35 100644
--- a/testcase/test_caq.py
+++ b/testcase/test_caq.py
@@ -1,6 +1,7 @@
 from datetime import datetime
 import time
 from selenium.webdriver.common.by import By
+from selenium.common.exceptions import TimeoutException
 
 import pytest
 from selenium import webdriver
@@ -16,149 +17,57 @@
     driver = None
     test_package_name = "CAQ鑷姩娴嬭瘯鍖�-20230718101350"
 
-    @pytest.mark.parametrize('data_read', ["login"], indirect=True)
-    def test_login(self, data_read: dict):
-        """
-        鎵撳紑椤甸潰骞惰繘琛岀櫥褰曟祴璇�
-        :param data_read: 鎵ц鏁版嵁璇诲彇鐨勫嚱鏁板苟鑾峰彇鍒拌繑鍥炲��
-        :return:
-        """
-        TestCAQ.driver = webdriver.Chrome()
-        driver = TestCAQ.driver
-        login_page = LoginPage(driver)
-        try:
-            # 鎵撳紑閾炬帴
-            driver.get(data_read["url"])
-        except:
-            # 閾炬帴鎵撳紑鍑虹幇寮傚父璇存槑閾炬帴鏃犳硶璁块棶,鎹曡幏寮傚父浣嗕笉鍋氬鐞�
-            pass
-
-        # 娴忚鍣ㄧ獥鍙f渶澶у寲
-        driver.maximize_window()
-        # 鑾峰彇鍒板埛鏂版寜閽苟姣�10绉掔偣鍑讳竴娆�,鐭ラ亾鍒锋柊鎸夐挳娑堝け
-        while True:
-            try:
-                # 鍒ゆ柇鎵撳紑鐨勯〉闈㈡槸鍚﹀瓨鍦ㄥ埛鏂版寜閽�
-                reload_btn = login_page.get_element((By.XPATH, "//div[@id='buttons']/div/button[@id='reload-button']"))
-                # 鐐瑰嚮鍒锋柊鎸夐挳
-                reload_btn.click()
-                time.sleep(10)
-            except:
-                # 鍑虹幇寮傚父琛ㄧず涓嶅瓨鍦ㄥ埛鏂版寜閽�
-                # 鎺ョ潃鍒ゆ柇鏄惁瀛樺湪nginx error!
-                try:
-                    nginx_error = login_page.get_element((By.XPATH, "//strong[text() = 'nginx error!']"))
-                    # 瀛樺湪鍒欑潯鐪�10绉�
-                    time.sleep(10)
-                except:
-                    break
-
-        login_page.login(data_read["username"], data_read["password"], data_read["code"])
-        time.sleep(2)
-        assert login_page.is_login_success()
-
     @pytest.mark.parametrize('data_read', ["CAQ"], indirect=True)
-    def test_create_package(self, data_read: dict):
+    def test_create_package(self, data_read: dict, driver):
         """
         鍒涘缓娴嬭瘯鍖�
         :param data_read: 璇诲彇鏁版嵁
         :return:
         """
-        # 鑾峰彇driver
-        driver = TestCAQ.driver
         # 鍒涘缓home椤甸潰鐨勫璞�
         home_page = HomePage(driver)
         # 鐐瑰嚮宸︿晶鑿滃崟杩涘叆椤甸潰
         home_page.menu_select(data_read["menu"])
         # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
         test_package_list = TestPackageListPage(driver)
-        # 鐐瑰嚮鍒涘缓鎸夐挳
-        test_package_list.create_btn()
-        # 鑾峰彇褰撳墠鏃堕棿
-        current_time = datetime.now()
-        # 杞崲涓哄瓧绗︿覆
-        time_str = current_time.strftime("%Y%m%d%H%M%S")
-        # 鍒涘缓娴嬭瘯鍖呭~鍐欑殑鍙傛暟
-        # 娴嬭瘯鍖呭悕绉�
-        test_package_name = "CAQ鑷姩娴嬭瘯鍖�-" + time_str
-        # 璁剧疆娴嬭瘯鍖呭悕绉颁负绫诲彉閲�
-        TestCAQ.test_package_name = test_package_name
-        # 鑾峰彇鍒涘缓娴嬭瘯鍖呯殑鏁版嵁
-        create_data = data_read["add"]
-        # 濉啓娴嬭瘯鍖呭悕绉�
-        test_package_list.testPackageName_input(test_package_name)
-        # 濉啓鎶ュ憡浼佷笟鍚嶇О
-        test_package_list.reportCompanyName_input(create_data["company"])
-        # 閫夋嫨娴嬭瘯鍖呯被鍨�
-        test_package_list.testPackageType_select(create_data["type"])
-        # 閫夋嫨浜у搧鍖�
-        test_package_list.prodTree_select(create_data["product"])
-        # 杈撳叆hr閭
-        test_package_list.hrReportEmail_input(create_data["hrEmail"])
-        # 杈撳叆鏈夋晥鏈�
-        test_package_list.invalidTime_input(create_data["invalid"])
-        # 閫夋嫨閭�璇烽偖浠惰瑷�绫诲瀷
-        test_package_list.testTemplateLangType_select(create_data["memberLang"])
-        # 閫夋嫨HR閭欢璇█绫诲瀷
-        test_package_list.hrTemplateLangType_select(create_data["hrReportLang"])
-        # 閫夋嫨鎶ュ憡妯℃澘
-        test_package_list.reportTemplate_select(create_data["reportTemplate"])
-        # 鐐瑰嚮娴嬭瘯鑰呮帴鏀舵姤鍛�
-        test_package_list.autoSendReport_checkbox()
-        # 閫夋嫨娴嬭瘯鑰呮姤鍛婇偖绠辫瑷�绫诲瀷
-        test_package_list.memberReportLangType_select(create_data["memberReportLang"])
-        # 鐐瑰嚮纭鎸夐挳
-        test_package_list.add_confirm()
-        time.sleep(2)
-        # 鍒ゆ柇鏄惁鎴愬姛鍒涘缓
-        assert test_package_list.is_create_success(test_package_name)
+        # 鍒涘缓娴嬭瘯鍖呭苟鎺ユ敹鍒涘缓鐨勬祴璇曞寘鍚嶇О
+        create_package_name = test_package_list.create_package(data_read["add"])
+        # 璧嬪�煎埌绫诲彉閲�
+        TestCAQ.test_package_name = create_package_name
         time.sleep(5)
+        # 鍒ゆ柇鏄惁鎴愬姛鍒涘缓
+        assert test_package_list.is_create_success(create_package_name)
 
     @pytest.mark.parametrize('data_read', ["CAQ"], indirect=True)
-    def test_open_url(self, data_read: dict):
+    def test_open_url(self, data_read: dict, driver):
         """
         鎵撳紑鍒嗕韩閾炬帴
         :return:
         """
-        # 鑾峰彇driver
-        driver = TestCAQ.driver
-        #     # 鍒涘缓home椤甸潰鐨勫璞�
-        #     home_page = HomePage(driver)
-        #     # 鐐瑰嚮宸︿晶鑿滃崟杩涘叆椤甸潰
-        #     home_page.menu_select(data_read["menu"])
         # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
         test_package_list = TestPackageListPage(driver)
-        # 鍕鹃�夋柊鍒涘缓鐨勬祴璇曞寘
-        test_package_list.click_package_checkbox(TestCAQ.test_package_name)
-        # 鐐瑰嚮鐢熸垚鍒嗕韩閾炬帴鎸夐挳
-        test_package_list.click_share_1_btn()
-        # 鑾峰彇鍒皍rl
-        url = test_package_list.get_share_url()
+        # 鑾峰彇鍒板垎浜摼鎺�
+        url = test_package_list.get_share_url(TestCAQ.test_package_name)
         # 鎵撳紑鏂版爣绛鹃〉鍔犺浇url
-        test_package_list.open_new_table_to_url(url)
+        test_package_list.goto_new_table(url)
         # 鍒涘缓鍒嗕韩椤甸潰瀵硅薄
         share_add = ShareAddPage(driver)
         # 濉啓淇℃伅鎻愪氦骞惰幏鍙栨祴璇曢摼鎺�
         name = random_string(8)
         email = name + "@gmail.com"
-        test_url = share_add.page_default_operation(name, email)
+        test_url = share_add.get_test_url(name, email)
         # 褰撳墠椤甸潰鎵撳紑閾炬帴
-        driver.get(test_url)
+        share_add.goto(test_url)
         # 鐐瑰嚮鎻愪氦鎸夐挳
-        share_add.submit_btn()
+        share_add.click(share_add.es.submit_btn, timeout=10)
         # 鑾峰彇鏁版嵁
         info = data_read["info"]
         # 濉啓鍩烘湰淇℃伅骞舵彁浜�
         share_add.fill_info(email, info["position"], info["dept"])
-        time.sleep(5)
 
-    def test_answer(self):
-        # 鑾峰彇driver
-        driver = TestCAQ.driver
+    def test_answer(self, driver):
         # 鍒涘缓answer瀵硅薄
         answer_page = CAQAnswerPage(driver)
-        # 鐐瑰嚮寮�濮嬫祴璇�
-        answer_page.start_btn()
         # 寮�濮嬬瓟棰�
         flag = answer_page.answer()
         # 绛斿畬棰樺叧闂綋鍓嶆爣绛鹃〉
@@ -169,14 +78,17 @@
             assert flag
             return
 
-    def test_delete_package(self):
-        # 鑾峰彇driver
-        driver = TestCAQ.driver
+    def test_delete_package(self, driver):
         # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
         test_package_list = TestPackageListPage(driver)
         # 鍒犻櫎娴嬭瘯鍖�
-        test_package_list.delete_package()
-        time.sleep(5)
+        test_package_list.delete_package(TestCAQ.test_package_name)
+        # 鍒ゆ柇鍒犻櫎鏄惁鎴愬姛
+        try:
+            test_package_list.wait_visible(test_package_list.es.operate_success_layer)
+            assert True
+        except TimeoutException:
+            assert False
         # 鍏抽棴
         driver.quit()
 
diff --git a/testcase/test_group_report.py b/testcase/test_group_report.py
new file mode 100644
index 0000000..dd365d2
--- /dev/null
+++ b/testcase/test_group_report.py
@@ -0,0 +1,147 @@
+import os
+from datetime import datetime
+import time
+from selenium.webdriver.common.by import By
+from selenium.common.exceptions import TimeoutException
+from selenium.common.exceptions import NoSuchElementException
+
+import pytest
+from comm.comm import *
+from comm.read_data import *
+from comm.write_data import *
+from selenium import webdriver
+from po.login_page import LoginPage
+from po.home_page import HomePage
+from po.group_report_page import GroupReportPage
+from po.member_detail_page import MemberDetailPage
+from po.report_page import ReportPage
+from po.share_add_page import ShareAddPage
+from po.maq_answer_page import MAQAnswerPage
+from po.caq_answer_page import CAQAnswerPage
+from comm.my_random import *
+
+
+class TestGroupReport:
+    driver = None
+    name = "MAQV2鑷姩娴嬭瘯鍖�-20230727155906"
+    member_email = None
+
+    @pytest.mark.parametrize('data_read', ["groupReport"], indirect=True)
+    def test_add(self, data_read: dict, driver):
+        home = HomePage(driver)
+        home.menu_select("娴嬭瘯鍖呯鐞�/缁勫埆鎶ュ憡")
+        group = GroupReportPage(driver)
+        # 鐐瑰嚮鏂板鎸夐挳
+        group.click(group.es.add_btn)
+        # 鍒囨崲iframe
+        group.switch_iframe(group.es.add_iframe)
+        # 鑾峰彇闅忔満鍚嶇О
+        name = "缁勫埆鎶ュ憡-" + random_string(8)
+        TestGroupReport.name = name
+        # 杈撳叆鍚嶇О
+        group.fill(group.es.add_name_input, name)
+        # 鏂囦欢璺緞
+        # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
+        root_path = os.getcwd()
+        # 鎷兼帴鏂囦欢璺緞
+        if "\\testcase" in root_path:
+            root_path = root_path[0:root_path.rfind("\\testcase")]
+        file_path = root_path + r"\data\MAQ_group_data.xlsx"
+        # 浼犲叆鏂囦欢
+        group.fill(group.es.add_load_file_input, file_path)
+        # 鍒囨崲iframe
+        group.switch_parent_iframe()
+        # 鐐瑰嚮纭鎸夐挳
+        group.click(group.es.layer_confirm_btn)
+        time.sleep(10)
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_group_data(self, data_read: dict, driver):
+        group = GroupReportPage(driver)
+        # 杈撳叆鍚嶇О
+        group.fill(group.es.add_name_input, TestGroupReport.name)
+        # 鐐瑰嚮鎼滅储鎸夐挳
+        group.click(group.es.search_btn)
+
+        # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
+        root_path = os.getcwd()
+        # 鎷兼帴涓嬭浇鏂囦欢鐩綍
+        if "\\testcase" in root_path:
+            root_path = root_path[0:root_path.rfind("\\testcase")]
+        dir_path = root_path + r"\download"
+        # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+        old_file_names = []
+        for filename in os.listdir(dir_path):
+            if os.path.isfile(os.path.join(dir_path, filename)):
+                old_file_names.append(filename)
+
+        # 鐐瑰嚮缁勫埆鏁版嵁
+        group.click(group.es.group_data_btn)
+
+        i = 0
+        while i < data_read["downloadWaitTime"]:
+            # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+            new_file_names = []
+            for filename in os.listdir(dir_path):
+                if os.path.isfile(os.path.join(dir_path, filename)):
+                    new_file_names.append(filename)
+            # 鍒ゆ柇鏃ф枃浠剁殑鏁伴噺涓庢柊鏂囦欢鐨勬暟閲忔槸鍚︾浉鍚岋紝鐩稿悓鍒欑潯鐪犱竴绉�
+            if len(old_file_names) == len(new_file_names):
+                time.sleep(1)
+                i += 1
+                continue
+            else:
+                # 鍚﹀垯鐩存帴閫�鍑哄惊鐜�
+                break
+        else:
+            assert False
+
+    @pytest.mark.parametrize('data_read', ["testPackageList"], indirect=True)
+    def test_group_report(self, data_read: dict, driver):
+        group = GroupReportPage(driver)
+        # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰�
+        root_path = os.getcwd()
+        # 鎷兼帴涓嬭浇鏂囦欢鐩綍
+        if "\\testcase" in root_path:
+            root_path = root_path[0:root_path.rfind("\\testcase")]
+        dir_path = root_path + r"\download"
+        # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+        old_file_names = []
+        for filename in os.listdir(dir_path):
+            if os.path.isfile(os.path.join(dir_path, filename)):
+                old_file_names.append(filename)
+
+        # 鐐瑰嚮缁勫埆鏁版嵁
+        group.click(group.es.group_report_btn)
+
+        i = 0
+        while i < data_read["downloadWaitTime"]:
+            # 鑾峰彇鐩綍涓嬫墍鏈夋枃浠�
+            new_file_names = []
+            for filename in os.listdir(dir_path):
+                if os.path.isfile(os.path.join(dir_path, filename)):
+                    new_file_names.append(filename)
+            # 鍒ゆ柇鏃ф枃浠剁殑鏁伴噺涓庢柊鏂囦欢鐨勬暟閲忔槸鍚︾浉鍚岋紝鐩稿悓鍒欑潯鐪犱竴绉�
+            if len(old_file_names) == len(new_file_names):
+                time.sleep(1)
+                i += 1
+                continue
+            else:
+                # 鍚﹀垯鐩存帴閫�鍑哄惊鐜�
+                break
+        else:
+            assert False
+
+
+if __name__ == '__main__':
+    pytest.main(["-s", __file__])
+
+
+
+
+
+
+
+
+
+
diff --git a/testcase/test_login.py b/testcase/test_login.py
new file mode 100644
index 0000000..9391e68
--- /dev/null
+++ b/testcase/test_login.py
@@ -0,0 +1,53 @@
+from datetime import datetime
+import time
+from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
+
+import pytest
+from selenium import webdriver
+from po.login_page import LoginPage
+from po.home_page import HomePage
+from po.test_package_list_page import TestPackageListPage
+from po.share_add_page import ShareAddPage
+from po.maq_answer_page import MAQAnswerPage
+from comm.my_random import *
+
+
+class TestLogin:
+    driver = None
+
+    @pytest.mark.parametrize('data_read', ["login"], indirect=True)
+    def test_login(self, data_read: dict, driver):
+        """
+        鎵撳紑椤甸潰骞惰繘琛岀櫥褰曟祴璇�
+        :param data_read: 鎵ц鏁版嵁璇诲彇鐨勫嚱鏁板苟鑾峰彇鍒拌繑鍥炲��
+        :return:
+        """
+        login = LoginPage(driver)
+
+        # 鎵撳紑閾炬帴
+        login.goto(data_read["url"])
+        # 娴忚鍣ㄧ獥鍙f渶澶у寲
+        driver.maximize_window()
+        # 閫氳繃鏍囬鍒ゆ柇鏄惁璁块棶姝g‘
+        while True:
+            if driver.title == "OTS":
+                # 鏍囬绛変簬OTS閫�鍑哄惊鐜�
+                break
+            else:
+                # 鏍囬涓嶇瓑浜嶰TS浼戠湢
+                time.sleep(5)
+        # 鐧诲綍
+        login.login(data_read["username"], data_read["password"], data_read["code"])
+        # 鏂█鐧诲綍鏄惁鎴愬姛
+        assert login.login_assert()
+
+    # def test_logout(self):
+    #     driver = TestLogin.driver
+    #     home = HomePage(driver)
+    #     # 鐧诲嚭
+    #     home.logout()
+
+
+if __name__ == '__main__':
+    pytest.main(["-s", __file__])
diff --git a/testcase/test_maq.py b/testcase/test_maq.py
index 37f5a75..c7123eb 100644
--- a/testcase/test_maq.py
+++ b/testcase/test_maq.py
@@ -1,6 +1,7 @@
 from datetime import datetime
 import time
 from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
 
 import pytest
 from selenium import webdriver
@@ -14,7 +15,7 @@
 
 class TestMAQ:
     driver = None
-    test_package_name = None
+    test_package_name = "MAQ鑷姩娴嬭瘯鍖�-20230720170011"
 
     @pytest.mark.parametrize('data_read', ["login"], indirect=True)
     def test_login(self, data_read: dict):
@@ -53,7 +54,14 @@
                 except:
                     break
 
-        login_page.login(data_read["username"], data_read["password"], data_read["code"])
+        # 杈撳叆鐢ㄦ埛鍚�
+        login_page.send_keys("username_ipt", data_read["username"])
+        # 杈撳叆瀵嗙爜
+        login_page.oper_elem("password_ipt", data_read["password"])
+        # 杈撳叆楠岃瘉鐮�
+        login_page.oper_elem("code_ipt", data_read["code"])
+        # 鐐瑰嚮鐧诲綍鎸夐挳
+        login_page.oper_elem("login_btn")
         time.sleep(2)
         assert login_page.is_login_success()
 
@@ -72,8 +80,13 @@
         home_page.menu_select(data_read["menu"])
         # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
         test_package_list = TestPackageListPage(driver)
+        # 鍒囨崲鍒版祴璇曞寘鍒楄〃椤甸潰iframe
+        test_package_list.oper_elem("this_iframe")
+        time.sleep(2)
         # 鐐瑰嚮鍒涘缓鎸夐挳
-        test_package_list.create_btn()
+        test_package_list.oper_elem("create_btn")
+        # 鍒囨崲鍒版坊鍔犵獥鍙g殑iframe
+        test_package_list.oper_elem("add_iframe")
         # 鑾峰彇褰撳墠鏃堕棿
         current_time = datetime.now()
         # 杞崲涓哄瓧绗︿覆
@@ -86,33 +99,43 @@
         # 鑾峰彇鍒涘缓娴嬭瘯鍖呯殑鏁版嵁
         create_data = data_read["add"]
         # 濉啓娴嬭瘯鍖呭悕绉�
-        test_package_list.testPackageName_input(test_package_name)
+        test_package_list.oper_elem("add_testPackageName_input", test_package_name)
         # 濉啓鎶ュ憡浼佷笟鍚嶇О
-        test_package_list.reportCompanyName_input(create_data["company"])
+        test_package_list.oper_elem("add_reportCompanyName_input", create_data["company"])
         # 閫夋嫨娴嬭瘯鍖呯被鍨�
-        test_package_list.testPackageType_select(create_data["type"])
+        test_package_list.oper_elem("add_testPackageType_select", create_data["type"])
+        # 鐐瑰嚮浜у搧鍖呮寜閽�
+        test_package_list.oper_elem("add_prodTree_btn")
+        # 鍒囨崲鍒皃rodTree鐨刬frame
+        test_package_list.oper_elem("prodTree_iframe")
         # 閫夋嫨浜у搧鍖�
-        test_package_list.prodTree_select(create_data["product"])
-        # 杈撳叆hr閭
-        test_package_list.hrReportEmail_input(create_data["hrEmail"])
-        # 杈撳叆鏈夋晥鏈�
-        test_package_list.invalidTime_input(create_data["invalid"])
-        # 閫夋嫨閭�璇烽偖浠惰瑷�绫诲瀷
-        test_package_list.testTemplateLangType_select(create_data["memberLang"])
-        # 閫夋嫨HR閭欢璇█绫诲瀷
-        test_package_list.hrTemplateLangType_select(create_data["hrReportLang"])
-        # 閫夋嫨鎶ュ憡妯℃澘
-        test_package_list.reportTemplate_select(create_data["reportTemplate"])
-        # 鐐瑰嚮娴嬭瘯鑰呮帴鏀舵姤鍛�
-        test_package_list.autoSendReport_checkbox()
-        # 閫夋嫨娴嬭瘯鑰呮姤鍛婇偖绠辫瑷�绫诲瀷
-        test_package_list.memberReportLangType_select(create_data["memberReportLang"])
+        test_package_list.oper_elem("prodTree_option", create_data["product"])
+        # 鍥炲埌涓婁竴灞俰frame
+        test_package_list.switch_parent_iframe()
         # 鐐瑰嚮纭鎸夐挳
-        test_package_list.add_confirm()
-        time.sleep(2)
+        test_package_list.oper_elem("prodTree_confirm_btn")
+        # 杈撳叆hr閭
+        test_package_list.oper_elem("add_hrEmail_input", create_data["hrEmail"])
+        # 杈撳叆鏈夋晥鏈熷苟鐐瑰嚮浠ュ彇娑堟棩鏈熼�夋嫨鍣ㄦ樉绀�
+        test_package_list.oper_elem("add_invalidTime_input", create_data["invalid"])
+        test_package_list.oper_elem("add_invalidTime_btn")
+        # 閫夋嫨閭�璇烽偖浠惰瑷�绫诲瀷
+        test_package_list.oper_elem("add_templateLangType_select", create_data["memberLang"])
+        # 閫夋嫨HR閭欢璇█绫诲瀷
+        test_package_list.oper_elem("add_hrTemplateLangType_select", create_data["hrReportLang"])
+        # 閫夋嫨鎶ュ憡妯℃澘
+        test_package_list.oper_elem("add_reportTemplateId_select", create_data["reportTemplate"])
+        # 鐐瑰嚮娴嬭瘯鑰呮帴鏀舵姤鍛�
+        test_package_list.oper_elem("add_autoSendReport_checkbox")
+        # 閫夋嫨娴嬭瘯鑰呮姤鍛婇偖绠辫瑷�绫诲瀷
+        test_package_list.oper_elem("add_memberTemplateLangType_select", create_data["memberReportLang"])
+        # 鍒囨崲鍒颁笂涓�灞俰frame
+        test_package_list.switch_parent_iframe()
+        # 鐐瑰嚮纭鎸夐挳
+        test_package_list.oper_elem("add_confirm_btn")
+        time.sleep(5)
         # 鍒ゆ柇鏄惁鎴愬姛鍒涘缓
         assert test_package_list.is_create_success(test_package_name)
-        time.sleep(5)
 
     @pytest.mark.parametrize('data_read', ["MAQ"], indirect=True)
     def test_open_url(self, data_read: dict):
@@ -127,9 +150,16 @@
         # 鍕鹃�夋柊鍒涘缓鐨勬祴璇曞寘
         test_package_list.click_package_checkbox(TestMAQ.test_package_name)
         # 鐐瑰嚮鐢熸垚鍒嗕韩閾炬帴鎸夐挳
-        test_package_list.click_share_1_btn()
+        test_package_list.oper_elem("share_1_btn")
+        # 鍒囨崲鍒板垎浜獥鍙g殑iframe
+        test_package_list.oper_elem("share_iframe")
         # 鑾峰彇鍒皍rl
-        url = test_package_list.get_share_url()
+        url = test_package_list.oper_elem("share_url_text")
+        # 鍒囨崲鍒颁笂涓�灞俰frame
+        test_package_list.switch_parent_iframe()
+        # 鐐瑰嚮鍏抽棴鎸夐挳
+        test_package_list.oper_elem("share_cancel_btn")
+        time.sleep(1)
         # 鎵撳紑鏂版爣绛鹃〉鍔犺浇url
         test_package_list.open_new_table_to_url(url)
         # 鍒涘缓鍒嗕韩椤甸潰瀵硅薄
@@ -137,16 +167,24 @@
         # 濉啓淇℃伅鎻愪氦骞惰幏鍙栨祴璇曢摼鎺�
         name = random_string(8)
         email = name + "@gmail.com"
-        test_url = share_add.page_default_operation(name, email)
+        # 濉啓閭鍜屽鍚嶅苟鎻愪氦
+        share_add.oper_elem("name_input", name)
+        share_add.oper_elem("email_input", email)
+        share_add.oper_elem("submit_btn")
+        # 鑾峰彇鍒版祴璇曢摼鎺�
+        test_url = share_add.oper_elem("test_url_text")
         # 褰撳墠椤甸潰鎵撳紑閾炬帴
         driver.get(test_url)
         # 鐐瑰嚮鎻愪氦鎸夐挳
-        share_add.submit_btn()
+        share_add.oper_elem("submit_btn")
         # 鑾峰彇鏁版嵁
         info = data_read["info"]
         # 濉啓鍩烘湰淇℃伅骞舵彁浜�
-        share_add.fill_info(email, info["position"], info["dept"])
-        time.sleep(5)
+        share_add.oper_elem("fill_email_input", email)
+        share_add.oper_elem("fill_position_input", info["position"])
+        share_add.oper_elem("fill_dept_input", info["dept"])
+        share_add.oper_elem("submit_btn")
+        time.sleep(3)
 
     def test_answer(self):
         # 鑾峰彇driver
@@ -154,13 +192,11 @@
         # 鍒涘缓answer瀵硅薄
         answer_page = MAQAnswerPage(driver)
         # 鐐瑰嚮寮�濮嬫祴璇�
-        answer_page.start_btn()
+        answer_page.oper_elem("start_btn")
         # 寮�濮嬬瓟棰�
         flag = answer_page.answer()
         # 绛斿畬棰樺叧闂綋鍓嶆爣绛鹃〉
         driver.close()
-        # 鍒囨崲鍒扮涓�涓爣绛鹃〉
-        answer_page.switch_window(0)
         if flag is not None or not flag:
             assert flag
             return
@@ -170,9 +206,13 @@
         driver = TestMAQ.driver
         # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
         test_package_list = TestPackageListPage(driver)
+        # 鍒囨崲鍒扮涓�涓爣绛鹃〉
+        test_package_list.switch_window(0)
+        test_package_list.oper_elem("this_iframe")
         # 鍒犻櫎娴嬭瘯鍖�
-        test_package_list.delete_package()
-        time.sleep(5)
+        test_package_list.oper_elem("delete_btn")
+        test_package_list.oper_elem("delete_confirm_btn")
+        time.sleep(3)
         # 鍏抽棴
         driver.quit()
 
diff --git a/testcase/test_product_accredit.py b/testcase/test_product_accredit.py
new file mode 100644
index 0000000..27ae295
--- /dev/null
+++ b/testcase/test_product_accredit.py
@@ -0,0 +1,78 @@
+from datetime import datetime
+import time
+from selenium.webdriver.common.by import By
+from selenium.common.exceptions import TimeoutException
+
+import pytest
+from selenium import webdriver
+from po.login_page import LoginPage
+from po.home_page import HomePage
+from po.product_accredit_page import ProductAccreditPage
+from po.test_package_list_page import TestPackageListPage
+from po.share_add_page import ShareAddPage
+from po.caq_answer_page import CAQAnswerPage
+from comm.my_random import *
+
+
+class TestProductAccredit:
+    driver = None
+    test_package_name = "CAQ鑷姩娴嬭瘯鍖�-20230718101350"
+
+    @pytest.mark.parametrize('data_read', ["productAccredit"], indirect=True)
+    def test_accredit(self, data_read: dict, driver):
+        """
+        浜у搧鍖呮巿鏉�
+        :param data_read: 璇诲彇鏁版嵁
+        :return:
+        """
+        # 鍒涘缓home椤甸潰鐨勫璞�
+        home_page = HomePage(driver)
+        # 鐐瑰嚮宸︿晶鑿滃崟杩涘叆椤甸潰
+        home_page.menu_select(data_read["menu"])
+        # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
+        product = ProductAccreditPage(driver)
+        # 鎼滅储妗嗚緭鍏ヨ处鍙�
+        product.fill(product.es.search_username_input, data_read["username"])
+        # 鐐瑰嚮鎼滅储鎸夐挳
+        product.click(product.es.search_btn)
+        time.sleep(2)
+        # 鐐瑰嚮浜у搧鍖呮巿鏉冩寜閽�
+        product.click(product.es.product_btn)
+        time.sleep(2)
+        # 鍒囨崲iframe
+        product.switch_iframe(product.es.accredit_iframe)
+        # 閫夋嫨浜у搧鍖�
+        product.select(product.es.accredit_product_select, product.es.accredit_product_option, data_read["product"])
+        product.click(product.es.accredit_temp_checkbox, timeout=10)
+        # 鐐瑰嚮浜у搧鍖呮巿鏉�
+        product.click(product.es.accredit_accredit_btn)
+        time.sleep(2)
+        product.switch_parent_iframe()
+        # 鐐瑰嚮纭鎸夐挳
+        product.click(product.es.layer_confirm_btn)
+        time.sleep(2)
+
+        # 閫�鍑虹櫥褰�
+        home = HomePage(driver)
+        home.logout()
+        time.sleep(5)
+        # 鐧诲綍
+        login = LoginPage(driver)
+        login.login(data_read["username"], data_read["password"], data_read["code"])
+        # 鐐瑰嚮鑿滃崟鏍�
+        home = HomePage(driver)
+        home.menu_select("娴嬭瘯鍖呯鐞�/娴嬭瘯鍖呭垪琛�")
+        # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄
+        test_package_list = TestPackageListPage(driver)
+        # 鍒涘缓娴嬭瘯鍖呭苟鎺ユ敹鍒涘缓鐨勬祴璇曞寘鍚嶇О
+        create_package_name = test_package_list.create_package(data_read["add"])
+        # 璧嬪�煎埌绫诲彉閲�
+        TestProductAccredit.test_package_name = create_package_name
+        time.sleep(5)
+        # 鍒ゆ柇鏄惁鎴愬姛鍒涘缓
+        assert test_package_list.is_create_success(create_package_name)
+
+
+
+if __name__ == '__main__':
+    pytest.main(["-s", __file__])
diff --git a/testcase/test_vaq.py b/testcase/test_vaq.py
index a1f0a78..b19c475 100644
--- a/testcase/test_vaq.py
+++ b/testcase/test_vaq.py
@@ -1,7 +1,7 @@
 from datetime import datetime
 import time
 from selenium.webdriver.common.by import By
-
+from selenium.webdriver.chrome.options import Options
 import pytest
 from selenium import webdriver
 from po.login_page import LoginPage
@@ -23,6 +23,8 @@
         :param data_read: 鎵ц鏁版嵁璇诲彇鐨勫嚱鏁板苟鑾峰彇鍒拌繑鍥炲��
         :return:
         """
+        chrome_options = Options()
+        chrome_options.add_argument("--headless")
         TestVAQ.driver = webdriver.Chrome()
         driver = TestVAQ.driver
         login_page = LoginPage(driver)

--
Gitblit v1.9.1