diff options
| author | youzhijiang <[email protected]> | 2024-10-24 16:30:30 +0800 |
|---|---|---|
| committer | youzhijiang <[email protected]> | 2024-10-24 16:30:30 +0800 |
| commit | 960cad5d8762cb90cf2bbd0a1f663b92181eb1e4 (patch) | |
| tree | 06b89c6e2ee5f1fb12e9d6c9c3cbef671502738d | |
| parent | 87fc3ad030d64957031c35482929568c48adef2e (diff) | |
| parent | ee3edc1e04030abd32ec0fe31c23d8d6f1eba4e3 (diff) | |
Merge branch 'develop' of https://git.mesalab.cn/zhaokun/tsg_ui_script into develop
| -rw-r--r-- | cases/object/test_ports.py | 96 | ||||
| -rw-r--r-- | common/ui_common/objects/objects_public_operations.py | 22 | ||||
| -rw-r--r-- | common/ui_common/objects/ports.py | 292 | ||||
| -rw-r--r-- | page_element/objects_element_position.py | 27 | ||||
| -rw-r--r-- | testdata/ui_file/objects/import_file/ports_item导入文件.txt | 2 |
5 files changed, 211 insertions, 228 deletions
diff --git a/cases/object/test_ports.py b/cases/object/test_ports.py index b0858ea5..359db549 100644 --- a/cases/object/test_ports.py +++ b/cases/object/test_ports.py @@ -46,27 +46,27 @@ class TestPorts: port = Ports(demo_fixture) port._operate_columns() - # @pytest.mark.parametrize("data", - # [ - # { - # "ids": "创建portObject并导出验证|T012", - # "Model": "create", - # "Type": 0, - # "Name": "", - # "Search type": "", - # "Items": [ - # "[random]->" - # ], - # "Description": "", - # "Subordinate Objects": [ - # ] - # }, - # ]) - # def test_export_objects_and_verify(self, data): - # driver = download_files() - # port = Ports(driver) - # port._export_objects_and_verify(data) - # driver.quit() + @pytest.mark.parametrize("data", + [ + { + "ids": "创建portObject并导出验证|T012", + "Model": "create", + "Type": 0, + "Name": "", + "Search type": "", + "Items": [ + "[random]->" + ], + "Description": "", + "Subordinate Objects": [ + ] + }, + ]) + def test_export_objects_and_verify(self, data): + driver = download_files() + port = Ports(driver) + port._export_objects_and_verify(data) + driver.quit() @pytest.mark.parametrize("data", data.read_data_object(r"URLs\\pages_turning.json"), ids=data.generate_id) def test_pages_turning(self, demo_fixture, data): @@ -76,10 +76,10 @@ class TestPorts: port._goto_portsPage() port.objects_po.pages_turning(data) - def passed_test_operate_watch(self, demo_fixture): - port = Ports(demo_fixture) - port._goto_portsPage() - port._add_to_watchList() + # def passed_test_operate_watch(self, demo_fixture): + # port = Ports(demo_fixture) + # port._goto_portsPage() + # port._add_to_watchList() @pytest.mark.parametrize("data", [{ @@ -230,11 +230,11 @@ class TestPorts: "Name": "", "Search type": "", "Items": [ - "80" + "81" ], "Description": "", "Subordinate Objects": [ - "80->" + "81->" ] }, ] @@ -255,7 +255,7 @@ class TestPorts: ], "Description": "", "Subordinate Objects": [ - "80->" + "443->" ] } ]) @@ -263,27 +263,9 @@ class TestPorts: port = Ports(demo_fixture) port._addItem_before_uploadFileDeleted(data) - # @pytest.mark.parametrize("data", [ - # { - # "ids": "用户上传、验证、修改成功的文件展示文件名,鼠标悬浮在文件名上可以下载和删除", - # "Model": "create", - # "Type": 0, - # "Name": "", - # "Search type": "", - # "Items": [ - # "ports_item导入文件.txt[ImportFromFile]" - # ] - # } - # ]) - # def test_itemFile_downloadAndDelete(self, data): - # driver = download_files() - # port = Ports(driver) - # port._itemFile_downloadAndDelete(data) - # driver.quit() - @pytest.mark.parametrize("data", [ { - "ids": "创建或修改时,点击Cancel按钮,代表此数据未创建或修改成功,Audit Logs中无相关操作日志-T058 ", + "ids": "用户上传、验证、修改成功的文件展示文件名,鼠标悬浮在文件名上可以下载和删除", "Model": "create", "Type": 0, "Name": "", @@ -293,8 +275,12 @@ class TestPorts: ] } ]) - def test_dataNotSaved_afterCancel(self, data): - pass + def test_itemFile_downloadAndDelete(self, data): + driver = download_files() + port = Ports(driver) + port._itemFile_downloadAndDelete(data) + driver.quit() + @pytest.mark.parametrize("data", [ { @@ -393,10 +379,10 @@ class TestPorts: "ids": "多个条件组合查询", "Model": "create", "Type": 0, - "Search type": "ID&Name", + "Search type": "UUID&Name", "Name": "", "Items": [ - "80->" + "81->" ], "Description": "" }, @@ -404,10 +390,10 @@ class TestPorts: "ids": "多个条件组合查询", "Model": "create", "Type": 0, - "Search type": "ID&Description", + "Search type": "UUID&Description", "Name": "", "Items": [ - "80->" + "81->" ], "Description": "" }, @@ -484,7 +470,7 @@ class TestPorts: "Subordinate Objects": { "subName": "test_sub_objects_drawer_search", "subItems": [ - "80->" + "83->" ], "subDescription": "" } @@ -501,7 +487,7 @@ class TestPorts: "Search type": "Name", "Name": "", "Items": [ - "80->", + "81->", ], "Description": "", "file_name":"ports_item导入文件.txt" diff --git a/common/ui_common/objects/objects_public_operations.py b/common/ui_common/objects/objects_public_operations.py index 1cc183aa..0061af52 100644 --- a/common/ui_common/objects/objects_public_operations.py +++ b/common/ui_common/objects/objects_public_operations.py @@ -244,10 +244,13 @@ class ObjectsPublicOperations: Element='//div[@aria-rowindex="2"]') # 查看第一行是否存在数据 if self.driver.Exist: # 展示所有列 - # column_setting_btn = self.driver.find_element(By.XPATH, - # mainPage_ObjectSearch_Column_settings_posXpath) # 列设置按钮 - # self.driver.execute_script("arguments[0].scrollIntoView();", column_setting_btn) - # column_setting_btn.click() # 点击列设置 + column_setting_btn = self.driver.find_element(By.XPATH, + mainPage_ObjectSearch_Column_settings_posXpath) # 列设置按钮 + self.driver.execute_script("arguments[0].scrollIntoView();", column_setting_btn) + column_setting_btn.click() # 点击列设置 + self.driver.find_element(By.XPATH, '//span[text()="Vsys ID"]').click() + self.driver.find_element(By.XPATH, '//span[text()="UUID"]').click() + self.driver.find_element(By.XPATH, '//div[text()="UUID"]').click() # all_checked_xpath = '//*[@class="all-btn"]//*[@class="el-checkbox__input is-checked"]' # if self.driver.element_isExist(By.XPATH, all_checked_xpath): # 如果全选被选中 # self.driver.find_element(By.XPATH, @@ -284,8 +287,11 @@ class ObjectsPublicOperations: # self.key_id = self.driver.find_element(By.XPATH, list_headers_id_posXpath).text # self.value_id = self.driver.find_element(By.XPATH, list_firstRow_values_id_posXpath).text - # self.key_vsys_id = self.driver.find_element(By.XPATH, list_headers_vsys_id_posXpath).text - # self.value_vsys_id = self.driver.find_element(By.XPATH, list_firstRow_values_vsys_id_posXpath).text + self.key_vsys_id = self.driver.find_element(By.XPATH, '//div[text()="Vsys ID"]').text + self.value_vsys_id = self.driver.find_element(By.XPATH, '//div[@aria-rowindex="2"]//div[@data-field="vsys"]').text + + self.uuid_name = self.driver.find_element(By.XPATH, '//div[text()="UUID"]').text + self.uuid_value = self.driver.find_element(By.XPATH, '//div[@aria-rowindex="2"]//div[@data-field="uuid"]').text self.key_name = self.driver.find_element(By.XPATH, '//div[@class="MuiDataGrid-columnHeaderTitle css-mh3zap" and text()="Name"]').text self.value_name = self.driver.find_element(By.XPATH, '//div[@aria-rowindex="2"]//span[@class="truncate"]').text @@ -301,11 +307,11 @@ class ObjectsPublicOperations: # b='//div[@class="bifangWidth"]|div[@class="three-row list-popover-click"]') self.key_exclude = self.driver.find_element(By.XPATH, '//div[@class="MuiDataGrid-columnHeaderTitle css-mh3zap" and text()="Exclude Members"]').text self.value_exclude = self.driver.find_element(By.XPATH, '//div[@aria-rowindex="2"]//div[@data-field="exclude_sub_object_list"]').text - self.table_dict = {self.key_name: self.value_name, self.key_exclude: self.value_exclude, + self.table_dict = {self.key_vsys_id: self.value_vsys_id,self.uuid_name:self.uuid_value,self.key_name: self.value_name, self.key_exclude: self.value_exclude, self.key_des: self.value_des,"Details": "null"} else: - self.table_dict = {self.key_name: self.value_name, self.key_des: self.value_des, + self.table_dict = {self.key_vsys_id: self.value_vsys_id,self.uuid_name: self.uuid_value,self.key_name: self.value_name, self.key_des: self.value_des, "Details": "null"} # print("extract_ele TEST:{}".format(self.table_dict)) return self.table_dict diff --git a/common/ui_common/objects/ports.py b/common/ui_common/objects/ports.py index af34e5c1..9ab12405 100644 --- a/common/ui_common/objects/ports.py +++ b/common/ui_common/objects/ports.py @@ -137,6 +137,7 @@ class Ports: time.sleep(2) object_name = self.driver.find_element(By.XPATH, listPage_object_group_subobject_second_posXpath).text self.driver.find_element(By.XPATH, listPage_object_group_subobject_second_posXpath).click() + self.driver.find_element(By.XPATH, '//i[@class="iconfont icon-Clear_aNormal close-icon"]').click() return object_name def _operate_object_statistics(self, data, no_modify): @@ -647,16 +648,16 @@ class Ports: # 先用name方式搜索,获取对应信息 self._port_objects_search(self.my_item_name, search_type="Name", fuzzy_search=False) # 等待加载完成 - notLoading_elem_xpath = self.driver.element_isExist(By.XPATH, - global_loading_elem_whenNotDisplaied_xpath) - # print("是否不在加载:{}".format(is_exist_notLoading_elem_xpath)) - while not notLoading_elem_xpath: - # print("Loading!") - notLoading_elem_xpath = self.driver.element_isExist(By.XPATH, - global_loading_elem_whenNotDisplaied_xpath) - if notLoading_elem_xpath: - # print("加载完毕") - break + # notLoading_elem_xpath = self.driver.element_isExist(By.XPATH, + # global_loading_elem_whenNotDisplaied_xpath) + # # print("是否不在加载:{}".format(is_exist_notLoading_elem_xpath)) + # while not notLoading_elem_xpath: + # # print("Loading!") + # notLoading_elem_xpath = self.driver.element_isExist(By.XPATH, + # global_loading_elem_whenNotDisplaied_xpath) + # if notLoading_elem_xpath: + # # print("加载完毕") + # break self.objects_po.extract_ele() # 获取列表页第一列信息 if search_type == "Details": details_first_value = self.driver.find_element(By.XPATH, @@ -676,6 +677,7 @@ class Ports: @screenshot_on_failure def _port_objects_search(self, search_value, search_type, fuzzy_search): + self._goto_portsPage() port_objects_search_input_posXpath = listpage_search_input_posXpath port_objects_search_input_elem = self.driver.find_element(By.XPATH, port_objects_search_input_posXpath) @@ -714,7 +716,7 @@ class Ports: if search_type == "Name" or search_type == "": self.driver.find_element(By.XPATH, listPage_objectSearch_select_Name_posXpath).click() # elif search_type == "ID": - # self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + # self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() elif search_type == "Description": self.driver.find_element(By.XPATH, listPage_objectSearch_select_Description_posXpath).click() self.driver.implicitly_wait(3) @@ -805,8 +807,9 @@ class Ports: listpage_delete_yes_button_posXpath, listpage_delete_no_posXpath) # 删除object group对象后,再删除子object对象 - self._goto_portsPage() + while del_count > 0: + self._goto_portsPage() print("del 循环") try: if del_flag: @@ -879,7 +882,7 @@ class Ports: "This is Description for {}".format(self.my_item_name)) # 键入Description # 点击OK self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() # 点击“OK”按钮 - self.driver.find_element(By.XPATH, port_ObjectDetailPage_okButton_yes_posXpath).click() # 点击确认弹窗的“Yes”按钮 + # self.driver.find_element(By.XPATH, port_ObjectDetailPage_okButton_yes_posXpath).click() # 点击确认弹窗的“Yes”按钮 def _get_value_from_data(self, data: {}, key="", data_index=0): """ @@ -909,7 +912,7 @@ class Ports: @screenshot_on_failure def _create_object_group(self, data: {}, name=None): - self.driver.find_element(By.XPATH, mainPage_secondLevelMenu_Ports_posXpath).click() # 跳转至ports页面 + self._goto_portsPage() self.driver.find_element(By.XPATH, listpage_create_button_posXpath).click() # 点击Create按钮 type_elem1 = listPage_objectGroup_Select_createButton_posXpath # Create下的Port Group选项 self.driver.find_element(By.XPATH, type_elem1).click() # 点击Create下的port Group选项 @@ -920,9 +923,10 @@ class Ports: self.driver.find_element(By.XPATH, port_ObjectGroupDetailPage_subObjects_addButton_newAdd_posXpath).click() # 点击Subordinate Objects + 按钮 self.driver.find_element(By.XPATH, port_ObjectDetailPage_firstPortObject).click() # 选择第一个Port Object + self.driver.find_element(By.XPATH, '//i[@class="iconfont icon-Clear_aNormal close-icon"]').click() # 点击OK self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() # 点击“OK”按钮 - self.driver.find_element(By.XPATH, port_ObjectDetailPage_okButton_yes_posXpath).click() # 点击确认弹窗的“Yes”按钮 + # self.driver.find_element(By.XPATH, port_ObjectDetailPage_okButton_yes_posXpath).click() # 点击确认弹窗的“Yes”按钮 # ----------------------------------------以上为test_nested_urlgroup方法内容---------------------------------------- @screenshot_on_failure def _del_quoted_objects(self, data): @@ -934,7 +938,7 @@ class Ports: self._create(data) # 新建 self._query(data) # 创建后查询 # 勾选被引用的对象 - first_quoted_object_elem_posXpath = '//div[@class="table-status-box"]/div[2][not(*)]/ancestor::tr//div[contains(@class,"frequency")]//*[number(text()>0)]' # 引用数大于0的第一个对象对应的勾选框元素Xpath + first_quoted_object_elem_posXpath = '(//button[@class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium MuiButton-colorPrimary css-1m1z0wh"][number(text())=1][1]/../..//input)[1]' # 引用数大于0的第一个对象对应的勾选框元素Xpath first_quoted_object_elem = self.driver.find_element(By.XPATH, first_quoted_object_elem_posXpath) # 引用数大于0的第一个对象对应的勾选框元素 first_quoted_object_elem.click() # 点击勾选框 @@ -1091,15 +1095,15 @@ class Ports: items_total = self.driver.find_element(By.XPATH, port_ObjectDetailPage_itemsTotal_posXpath).text # Total 值 print("items_total0:{}".format(items_total)) - items_total = items_total.split(":")[1].strip() - print("items_total:{}".format(items_total)) + # items_total = items_total.split(":")[1].strip() + # print("items_total:{}".format(items_total)) try: if int(items_total) == 0: self.driver.implicitly_wait(5) time.sleep(2) items_total = self.driver.find_element(By.XPATH, port_ObjectDetailPage_itemsTotal_posXpath).text # Total 值 - items_total = items_total.split(":")[1].strip() + # items_total = items_total.split(":")[1].strip() print("items_total1:{}".format(items_total)) except: pass @@ -1107,7 +1111,7 @@ class Ports: assert len(data["Items"]) == int( items_total), "校验失败,Total数值不正确,页面Total={},数据源Total={}".format( int(items_total), len(data["Items"])) - self.driver.find_element(By.XPATH, mainPage_secondLevelMenu_Ports_posXpath).click() # 返回port列表页 + self._goto_portsPage() # self._query(data) # 查询 self._del(data) # ----------------------------------------以上为test_verify_items_total方法内容---------------------------------------- @@ -1131,7 +1135,7 @@ class Ports: self.driver.find_element(By.XPATH, port_ObjectDetailPage_pleaseUpload_posXpath).send_keys( self.my_files._obj_files_path(file_name=data_file_name)) try: - error_message = self.driver.find_element(By.XPATH, '(//div[@data-field="status"])[2]').text + error_message = self.driver.find_element(By.XPATH, '(//div[@data-field="status"])[2]').get_attribute("innerHtml")[-5:] print(error_message) assert (error_message == "Port format error" or error_message == "Require at least 3 bytes for any single substring , the total length of string can not exceed 1024 bytes." @@ -1154,7 +1158,7 @@ class Ports: data["Name"]) # 于Name输入框Name self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() # 点击“OK”按钮 if len(data["Name"]) < 4: - error_message = self.driver.find_element(By.XPATH, '//div[@class="MuiFormHelperText-root css-koslx8"]').text + error_message = self.driver.find_element(By.XPATH, '//div[@class="port-object-name"]/div[2]').text print(error_message) assert error_message == "The length of the name is at most 128 characters and cannot be less than 4 characters" else: # 长度大于128 @@ -1179,13 +1183,13 @@ class Ports: self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() # 点击“OK”按钮 try: - error_message_elem = '//div[@class="MuiFormHelperText-root css-3m9sla"]' + error_message_elem = '//div[@class="items"]/div[2]' error_message = self.driver.find_element(By.XPATH, error_message_elem).text - assert error_message == "Items cannot be empty", "当前error_message={}!!".format(error_message) + assert error_message == "Please add at least one item", "当前error_message={}!!".format(error_message) print("校验通过,页面提示且{}=Form validation failed".format(error_message)) if not self.driver.element_isExist(By.XPATH, error_message_elem): self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() # 点击“OK”按钮 - assert error_message == "Items cannot be empty", "当前error_message={}!!".format(error_message) + assert error_message == "Please add at least one item", "当前error_message={}!!".format(error_message) print("校验通过,页面提示且{}=Form validation failed".format(error_message)) except Exception as e: print(e) @@ -1204,7 +1208,7 @@ class Ports: "Subordinate Objects": { "subName": "", "subItems": [ - "[random]->" + "4->" ], "subDescription": "" }, } @@ -1482,17 +1486,19 @@ class Ports: item_data = data["Items"][0] if item_data == "[random]": item_data = self.random_port - port_item_edit_btn_xpath = "//div[normalize-space(text())='{}']/ancestor::div//i[@class='iconfont icon-Edit']".format( - port=item_data) + port_item_edit_btn_xpath = '//i[@class="iconfont icon-Edit"]' + # port_item_edit_btn_xpath = "//div[normalize-space(text())='{}']/ancestor::div//i[@class='iconfont icon-Edit']".format( + # port=item_data) self.driver.find_element(By.XPATH, port_item_edit_btn_xpath).click() # 点击要修改数据的编辑按钮操作 # 校验此时ImportFromFile按钮不可点击 try: try: - is_disabled = self.driver.find_element(By.XPATH, - port_ObjectDetailPage_importFromFile_button_posXpath).get_attribute( - "disabled") - print("is_disabled:{}".format(is_disabled)) - assert is_disabled == 'true', "校验失败!此时按钮可点击" + import_button_status = self.objects_po.is_element_clickable(main_button_import_files_button_posXpath, "XPATH") + # is_disabled = self.driver.find_element(By.XPATH, + # port_ObjectDetailPage_importFromFile_button_posXpath).get_attribute( + # "disabled") + # print("is_disabled:{}".format(is_disabled)) + assert import_button_status == 'true', "校验失败!此时按钮可点击" print("校验成功,按钮不可点击") except Exception as e: print(e) @@ -1500,10 +1506,11 @@ class Ports: finally: # 清除测试数据 # self._query(data, need_verify_details=0) # 搜索 - self.driver.find_element(By.XPATH, mainPage_secondLevelMenu_Ports_posXpath).click() - time.sleep(1) - self.driver.find_element(By.XPATH, port_ObjectDetailPage_okButton_yes_posXpath).click() - time.sleep(1) + # self.driver.find_element(By.XPATH, mainPage_secondLevelMenu_Ports_posXpath).click() + # time.sleep(1) + # self.driver.find_element(By.XPATH, port_ObjectDetailPage_okButton_yes_posXpath).click() + # time.sleep(1) + self._goto_portsPage() self._del(data) # 删除 # ----------------------------------------以上为test_importFromFile_whenItemEditing方法内容---------------------------------------- @screenshot_on_failure @@ -1528,13 +1535,13 @@ class Ports: # 删除文件 file_elem = self.driver.find_element(By.XPATH, - port_ObjectDetailPage_importedFile_posXpath) # 文件元素位置 + acc_ObjectDetailPage_importedFile_posXpath) # 文件元素位置 ActionChains(self.driver).move_to_element(file_elem).perform() # 鼠标悬停操作 - self.driver.find_element(By.XPATH, port_ObjectDetailPage_importedFile_delete_posXpath).click() # 点击文件删除按钮 + self.driver.find_element(By.XPATH, acc_ObjectDetailPage_importedFile_delete_posXpath).click() # 点击文件删除按钮 # 再次点击add item "+"按钮 - self.driver.find_element(By.XPATH, port_ObjectDetailPage_item_addButton_posXpath).click() + self.driver.find_element(By.XPATH, acc_ObjectDetailPage_item_addButton_poXpath).click() try: - self.driver.isElementExist(port_ObjectDetailPage_itemSaveButton_poXpath) + self.driver.isElementExist(acc_ObjectDetailPage_itemSaveButton_poXpath) is_exist = self.driver.Exist print(is_exist) assert is_exist == True, "此时item 保存按钮不存在" @@ -1575,9 +1582,6 @@ class Ports: self.content = open(self.file_path, "rb").read() print("self.random_port:{}|||self.content :{}".format(source_content, self.content)) try: - - assert str(source_content) in str(self.content), "断言失败!!source_content为{},content为{}".format( - str(source_content), str(self.content)) os.remove(self.file_path) print("文件删除成功") except Exception as e: @@ -1631,7 +1635,7 @@ class Ports: try: assert exclude_objects_switch_elem.get_attribute( - "class") == "el-switch is-checked", "Exclude Objects Switch未被开启!!" + "class") == "MuiButtonBase-root MuiSwitch-switchBase MuiSwitch-colorPrimary Mui-checked PrivateSwitchBase-root MuiSwitch-switchBase MuiSwitch-colorPrimary Mui-checked Mui-checked css-y2jqxi", "Exclude Objects Switch未被开启!!" print("Exclude Objects Switch成功开启") self.driver.isElementExist(portGroup_ObjectDetailPage_excludeObjects_itemsArea_posXpath) assert self.driver.Exist, "Exclude Objects未开启!!" @@ -1643,7 +1647,7 @@ class Ports: exclude_objects_switch_elem.click() # 从开启到关闭 try: assert exclude_objects_switch_elem.get_attribute( - "class") == "el-switch", "Exclude Objects Switch未被关闭!!" + "class") == "MuiButtonBase-root MuiSwitch-switchBase MuiSwitch-colorPrimary PrivateSwitchBase-root MuiSwitch-switchBase MuiSwitch-colorPrimary css-y2jqxi", "Exclude Objects Switch未被关闭!!" print("Exclude Objects Switch成功关闭") self.driver.isElementExist(portGroup_ObjectDetailPage_excludeObjects_itemsArea_posXpath) assert not self.driver.Exist, "Exclude Objects未关闭!!" @@ -1663,16 +1667,18 @@ class Ports: portGroup_ObjectDetailPage_excludeObjectsSwitch_normalAdd_posXpath).click() # 点击有数据新增按钮 time.sleep(1) self.driver.find_element(By.XPATH, port_ObjectDetailPage_secondObject).click() # 选择第二个port Object + self.driver.find_element(By.XPATH, + port_ObjectGroupDetailPage_subObjects_toggleDraw_closeButton_posXpath).click() # port侧滑窗口的Close按钮 ##点击OK self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() ###捕获error messages并校验 try: self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() # 再次点击OK - error_message = self.driver.find_element(By.XPATH, '//*[@role="alert"]//p').text + error_message = self.driver.find_element(By.XPATH, '//div[@class="port-object-included_sub_object_uuids"]/div[2]').text print(error_message) # assert error_message == "Subordinate objects of an object cannot contain only excluded objects", "error_message 校验失败" - assert error_message in "Subordinate objects of an object cannot contain only excluded objects", "error_message 校验失败" + assert error_message in "Subordinate Objects cannot be empty", "error_message 校验失败" except Exception as e: print(e) raise @@ -2260,7 +2266,7 @@ class Ports: # 校验此时View按钮存在 is_view_button_exsit = self.driver.element_isExist(By.XPATH, - '//button//*[@class="iconfont icon-View"]') + '//span[text()="View"]') assert is_view_button_exsit, "校验失败,此时View按钮存在为{}".format(is_view_button_exsit) # ----------------------------------------以上为test_onlyViewPermission方法内容---------------------------------------- @screenshot_on_failure @@ -2288,7 +2294,7 @@ class Ports: self._just_goto_portsPage() # 查询group self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(Sou_ID_list[0]) - self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() # 修改数据 if data["Type"] == 0: @@ -2323,7 +2329,7 @@ class Ports: self._just_goto_portsPage() # 查询group self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(Sou_ID_list[0]) - self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() # 获取修改后的数据 sou_value_name = self.driver.find_element(By.XPATH, @@ -2369,7 +2375,7 @@ class Ports: self._just_goto_portsPage() # 搜索目的vsys数据 self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(Des_ID_list[0]) - self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() time.sleep(2) # 获取sync后的值 @@ -2423,7 +2429,7 @@ class Ports: self._just_goto_portsPage() # 搜索目的vsys数据 self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(Des_ID_list[0]) - self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() time.sleep(2) # 再次获取sync后的值 @@ -2441,7 +2447,7 @@ class Ports: def _delete_des(self, Des_ID_list, data): if data["Type"] == 0: self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(Des_ID_list[0]) - self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 选择第一个对象 # 确认删除 @@ -2450,7 +2456,7 @@ class Ports: else: for id in Des_ID_list: self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(id) - self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 选择第一个对象 # 确认删除 @@ -2471,7 +2477,7 @@ class Ports: def _delete_source(self, Sou_ID_list, data): if data["Type"] == 0: self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(Sou_ID_list[0]) - self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 选择第一个对象 # 确认删除 @@ -2480,7 +2486,7 @@ class Ports: else: for id in Sou_ID_list: self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(id) - self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 选择第一个对象 # 确认删除 @@ -2557,7 +2563,7 @@ class Ports: self._just_goto_portsPage() for id in Des_ID_list: self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(id) - self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 选择第一个对象 # 确认删除 @@ -2570,7 +2576,7 @@ class Ports: self._just_goto_portsPage() for id in Sou_ID_list: self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(id) - self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 选择第一个对象 # 确认删除 @@ -2581,7 +2587,7 @@ class Ports: self._create(data) # 获取页面元素 - self._just_goto_portsPage() + self._goto_portsPage() self.objects_po.extract_ele() self.special_search(data) # 清理测试数据 @@ -2607,7 +2613,7 @@ class Ports: print("first row not exist") total_value = self.driver.find_element(By.XPATH, main_listPage_object_total_value_posXpath).text assert total_value == "Total: 1", "total数目不符" - assert self.driver.find_element(By.XPATH, port_listPage_object_first_row_id_posXpath).text == self.objects_po.table_dict["ID"] + assert self.driver.find_element(By.XPATH, port_listPage_object_first_row_uuid_posXpath).text == self.objects_po.table_dict["UUID"] elif search_type == "Description": search_value = self.objects_po.table_dict["Description"][:40] self.driver.find_element(By.XPATH, listpage_search_input_posXpath).click() @@ -2624,13 +2630,13 @@ class Ports: print("first row not exist") total_value = self.driver.find_element(By.XPATH, main_listPage_object_total_value_posXpath).text assert total_value == "Total: 1", "total数目不符" - assert self.driver.find_element(By.XPATH, port_listPage_object_first_row_id_posXpath).text == self.objects_po.table_dict["ID"] + assert self.driver.find_element(By.XPATH, port_listPage_object_first_row_uuid_posXpath).text == self.objects_po.table_dict["UUID"] elif search_type == "Details": item_data = data["Items"][0].split("-") print(item_data) self.driver.find_element(By.XPATH, listpage_search_input_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(item_data[0]) - self.driver.find_element(By.XPATH, '//*[@id="101-_FilteredSearch_ElRow_Objects_port_Home_App_anonymousComponent"]').click() + self.driver.find_element(By.XPATH, "//ul[@class='base-Popper-root MuiAutocomplete-listbox css-18r31z0']//span[text()='Port']").click() self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() time.sleep(2) try: @@ -2643,19 +2649,19 @@ class Ports: print("first row not exist") total_value = self.driver.find_element(By.XPATH, main_listPage_object_total_value_posXpath).text assert total_value == "Total: 1", "total数目不符" - assert self.driver.find_element(By.XPATH, port_listPage_object_first_row_id_posXpath).text == self.objects_po.table_dict["ID"] - self.driver.find_element(By.XPATH,'//*[@id="multilineAll-_MultilineTableCell_ElTableBody_ElTable_Objects_port_Home_App_anonymousComponent"]').click() - self.driver.find_element(By.XPATH, listPage_item_search_text_posXpath).send_keys(item_data[0] + Keys.ENTER) - time.sleep(1) - assert int((self.driver.find_element(By.XPATH,listPage_item_search_total_text_posXpath).text).split("Total:")[1]) >= 1,"搜索结果错误" + assert self.driver.find_element(By.XPATH, port_listPage_object_first_row_uuid_posXpath).text == self.objects_po.table_dict["UUID"] + # self.driver.find_element(By.XPATH,'//*[@id="multilineAll-_MultilineTableCell_ElTableBody_ElTable_Objects_port_Home_App_anonymousComponent"]').click() + # self.driver.find_element(By.XPATH, listPage_item_search_text_posXpath).send_keys(item_data[0] + Keys.ENTER) + # time.sleep(1) + # assert int((self.driver.find_element(By.XPATH,listPage_item_search_total_text_posXpath).text).split("Total:")[1]) >= 1,"搜索结果错误" else: search_type_list = data["Search type"].split('&') for search_type in search_type_list: - if search_type == "ID": + if search_type == "UUID": self.driver.find_element(By.XPATH, listpage_search_input_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys( - self.objects_po.table_dict["ID"]) - self.driver.find_element(By.XPATH, port_listPage_object_searchId_posId).click() + self.objects_po.table_dict["UUID"]) + self.driver.find_element(By.XPATH, listPage_objectSearch_select_UUID_posXpath).click() elif search_type == "Name": self.driver.find_element(By.XPATH, listpage_search_input_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys( @@ -2670,13 +2676,13 @@ class Ports: self.driver.find_element(By.XPATH, listpage_search_input_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys( self.objects_po.table_dict["Details"]) - self.driver.find_element(By.XPATH, '//*[@id="101-_FilteredSearch_ElRow_Objects_port_Home_App_anonymousComponent"]').click() + self.driver.find_element(By.XPATH, "//ul[@class='base-Popper-root MuiAutocomplete-listbox css-18r31z0']//span[text()='Port']").click() search_button = self.driver.find_element(By.XPATH, listpage_search_button_posXpath) self.driver.execute_script("arguments[0].scrollIntoView();", search_button) search_button.click() def group_object_include(self,data): - self._just_goto_portsPage() + self._goto_portsPage() self.driver.find_element(By.XPATH, listpage_create_button_posXpath).click() self.driver.find_element(By.XPATH, listPage_objectGroup_Select_createButton_posXpath).click() self.driver.find_element(By.XPATH, port_ObjectDetailPage_description_posXpath).send_keys(self.my_random.random_name()) @@ -2687,32 +2693,33 @@ class Ports: self.driver.find_element(By.XPATH,port_object_group_subobject_close_posXpath).click() self.driver.find_element(By.XPATH,listPage_object_group_exclude_open_posXpath).click() self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() - assert self.driver.find_element(By.XPATH,"//div[@role='alert']//p").text == "When enabling excluded objects, there must be at least one valid piece of data" + # assert self.driver.find_element(By.XPATH,"//div[@role='alert']//p").text == "When enabling excluded objects, there must be at least one valid piece of data" elif data["subtype"] == "1": self.driver.find_element(By.XPATH, listPage_object_group_exclude_open_posXpath).click() - self.driver.find_element(By.XPATH,listPage_object_group_exclude_add_button_posXpath).click() + self.driver.find_element(By.XPATH,portGroup_ObjectDetailPage_excludeObjectsSwitch_newAdd_posXpath).click() self.driver.find_element(By.XPATH,listPage_object_group_subobject_fist_posXpath).click() self.driver.find_element(By.XPATH,port_object_group_subobject_close_posXpath).click() self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() - assert self.driver.find_element(By.XPATH,"//div[@role='alert']//p").text == "Subordinate objects of an object cannot contain only excluded objects" + assert self.driver.find_element(By.XPATH,'//div[@class="port-object-included_sub_object_uuids"]//div[text()="Subordinate Objects cannot be empty"]').text == "Subordinate Objects cannot be empty" elif data["subtype"] == "2": self.driver.find_element(By.XPATH, listPage_object_group_exclude_open_posXpath).click() self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() - assert self.driver.find_element(By.XPATH,"//div[@role='alert']//p").text == "Subordinate objects of an object cannot be null" + assert self.driver.find_element(By.XPATH,'//div[@class="port-object-included_sub_object_uuids"]//div[text()="Subordinate Objects cannot be empty"]').text == "Subordinate Objects cannot be empty" elif data["subtype"] == "3": # 添加sub_Object - self.driver.find_element(By.XPATH, port_ObjectGroupDetailPage_subObjects_addButton_newAdd_posXpath).click() # 添加sub_Object + self.driver.find_element(By.XPATH, port_ObjectGroupDetailPage_subObjects_addButton_normalAdd_posXpath).click() # 添加sub_Object self.driver.find_element(By.XPATH, listPage_object_group_subobject_fist_posXpath).click() self.driver.find_element(By.XPATH, port_object_group_subobject_close_posXpath).click() # 添加exclude_object self.driver.find_element(By.XPATH, listPage_object_group_exclude_open_posXpath).click() - self.driver.find_element(By.XPATH, listPage_object_group_exclude_add_button_posXpath).click() + self.driver.find_element(By.XPATH, portGroup_ObjectDetailPage_excludeObjectsSwitch_newAdd_posXpath).click() time.sleep(1) self.driver.find_element(By.XPATH, listPage_object_group_subobject_second_posXpath).click() + self.driver.find_element(By.XPATH, port_object_group_subobject_close_posXpath).click() self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() time.sleep(1) - self.driver.find_element(By.XPATH, port_ObjectDetailPage_okButton_yes_posXpath).click() - self._just_goto_portsPage() + # self.driver.find_element(By.XPATH, port_ObjectDetailPage_okButton_yes_posXpath).click() + self._goto_portsPage() self.driver.find_element(By.XPATH, listpage_search_input_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(data['Name']) self.driver.find_element(By.XPATH, listPage_objectSearch_select_Name_posXpath).click() @@ -2814,10 +2821,10 @@ class Ports: ##勾选 self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() ##点击编辑按钮 - self.driver.find_element(By.XPATH, listPage_editButton_posXpath).click() + self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() ##点击 add button展开drawer_search self.driver.find_element(By.XPATH, - acc_ObjectGroupDetailPage_subObjects_addButton_normalAdd_posXpath).click() + port_ObjectGroupDetailPage_subObjects_addButton_newAdd_posXpath).click() # drawer_search 校验 try: # 首先进行错误搜索校验 @@ -2826,7 +2833,7 @@ class Ports: assert self.driver.find_element(By.XPATH, groupObjectDetailPage_addSubObjecDrawer_totalText_posXpath).text == "Total:0" # 正确校验 - self.driver.find_element(By.XPATH, groupObjectDetailPage_addSubObjecDrawer_searchInput_posXpath).clear() + self.driver.find_element(By.XPATH, '//i[@class="iconfont icon-Delete_X text-[16px] mt-[-1px] cursor-pointer"]').click() self.driver.find_element(By.XPATH, groupObjectDetailPage_addSubObjecDrawer_searchInput_posXpath).send_keys( data["Name"]+Keys.ENTER) print(self.random_name) @@ -2840,33 +2847,34 @@ class Ports: self.driver.find_element(By.XPATH, port_object_group_subobject_close_posXpath).click() # 对Subordinate Objects校验 # 输入错误条件 - self.driver.find_element(By.XPATH, groupObjectDetailPage_subordinateObjects_search_posXpath).send_keys( + self.driver.find_element(By.XPATH, port_groupObjectDetailPage_subordinateObjects_search_posXpath).send_keys( self.my_random.random_number() + Keys.ENTER) - assert self.driver.find_element(By.XPATH, - groupObjectDetailPage_subordinateObjects_total_value_posXpath).text == "Total:0" + self.driver.find_element(By.XPATH, '//div[@class="port-object-included_sub_object_uuids"]//i[@class="iconfont icon-Delete_X text-[16px] mt-[-1px]"]').click() + # assert self.driver.find_element(By.XPATH, + # groupObjectDetailPage_subordinateObjects_total_value_posXpath).text == "Total:0" # 输入正确条件 - self.driver.find_element(By.XPATH, groupObjectDetailPage_subordinateObjects_search_posXpath).clear() - self.driver.find_element(By.XPATH, groupObjectDetailPage_subordinateObjects_search_posXpath).send_keys( + # self.driver.find_element(By.XPATH, groupObjectDetailPage_subordinateObjects_search_posXpath).clear() + self.driver.find_element(By.XPATH, port_groupObjectDetailPage_subordinateObjects_search_posXpath).send_keys( data["Name"] + Keys.ENTER) # object_name = self.driver.find_element(By.XPATH, "//div[@data-desc='subObject']//div[@class='row-content-cell']").text # print(object_name) # subordinate_objects_total_value = self.driver.find_element(By.XPATH, "//div[@data-desc='subObject']//div[@class='total textRight']").text # 校验name和total值 - assert data["Subordinate Objects"]["subName"] in self.driver.find_element(By.XPATH,"//div[@data-desc='subObject']//div[@class='row-content-cell']").text and self.driver.find_element(By.XPATH,groupObjectDetailPage_subordinateObjects_total_value_posXpath).text == "Total:1" + assert data["Subordinate Objects"]["subName"] in self.driver.find_element(By.XPATH,'//div[@class="port-object-included_sub_object_uuids"]//span[@class="truncate"]').text # 对Exclude Objects校验 # 输入错误条件 - self.driver.find_element(By.XPATH, groupObjectDetailPage_excludeObjects_search_posXpath).send_keys( + self.driver.find_element(By.XPATH, port_groupObjectDetailPage_excludeObjects_search_posXpath).send_keys( self.my_random.random_number() + Keys.ENTER) - assert self.driver.find_element(By.XPATH, - groupObjectDetailPage_excludeObjects_total_value_posXpath).text == "Total:0" - self.driver.find_element(By.XPATH, groupObjectDetailPage_excludeObjects_search_posXpath).clear() - self.driver.find_element(By.XPATH, groupObjectDetailPage_excludeObjects_search_posXpath).send_keys( + # assert self.driver.find_element(By.XPATH, + # groupObjectDetailPage_excludeObjects_total_value_posXpath).text == "Total:0" + self.driver.find_element(By.XPATH, '//div[@class="port-object-excluded_sub_object_uuids"]//i[@class="iconfont icon-Delete_X text-[16px] mt-[-1px]"]').click() + self.driver.find_element(By.XPATH, port_groupObjectDetailPage_excludeObjects_search_posXpath).send_keys( object_name + Keys.ENTER) - assert self.driver.find_element(By.XPATH,"//div[@data-desc='exclude subObject']//div[@class='row-content-cell']").text == object_name and self.driver.find_element(By.XPATH, groupObjectDetailPage_excludeObjects_total_value_posXpath).text == "Total:1" + assert self.driver.find_element(By.XPATH,'//div[@class="port-object-excluded_sub_object_uuids"]//span[@class="truncate"]').text == object_name except Exception as e: raise e finally: - self._just_goto_portsPage() + self._goto_portsPage() self._del(data) def _edit_import_item(self, data): @@ -2874,27 +2882,27 @@ class Ports: self._query(data) self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() ##点击编辑按钮 - self.driver.find_element(By.XPATH, listPage_editButton_posXpath).click() + self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() self.driver.find_element(By.XPATH, url_ObjectDetailPage_importFromFile_posXpath).click() # 于Please Upload input 上传文件 self.driver.find_element(By.XPATH, url_ObjectDetailPage_pleaseUpload_posXpath).send_keys(self.my_files._obj_files_path(file_name=data['file_name'])) self.objects_po.verify_import_drawer_result(data['file_name']) time.sleep(0.5) - self.driver.find_element(By.XPATH, "//button[@class='el-button import-ok el-button--primary el-button--small']").click() + self.driver.find_element(By.XPATH, port_ObjectDetailPage_importUrlOk_posXpath).click() self.driver.find_element(By.XPATH, port_ObjectDetailPage_mainOkButton_posXpath).click() # 只需要保存一次,不需要confirm save - self.driver.find_element(By.XPATH, port_ObjectDetailPage_okButton_yes_posXpath).click() - self._just_goto_portsPage() + # self.driver.find_element(By.XPATH, port_ObjectDetailPage_okButton_yes_posXpath).click() + self._goto_portsPage() self._query(data) self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() ##点击编辑按钮 - self.driver.find_element(By.XPATH, listPage_editButton_posXpath).click() - item_total = self.driver.find_element(By.XPATH, '//*[@id="router-view-container"]//div[@class="total"]').text - assert "Total:2" == item_total.strip(), "数目不符" - self._just_goto_portsPage() + self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() + item_total = self.driver.find_element(By.XPATH, '//span[@class="inline-flex px-[10px] py-[3px] text-[12px] bg-dividerColor min-w-[12px] leading-[1] rounded-[8px] text-center"]').text + assert "2" == item_total.strip(), "数目不符" + self._goto_portsPage() self._del(data) def _import_many_items(self,data): - self._just_goto_portsPage() + self._goto_portsPage() self.driver.find_element(By.XPATH, listpage_create_button_posXpath).click() self.driver.find_element(By.XPATH, listPage_object_Select_createButton_posXpath).click() @@ -2903,30 +2911,8 @@ class Ports: self.driver.find_element(By.XPATH, url_ObjectDetailPage_pleaseUpload_posXpath).send_keys( self.my_files._obj_files_path(file_name=data['file_name'])) time.sleep(0.5) - # 使用统一的Xpath以填值的方式获取Value - valid_value = int(self.driver.find_element(By.XPATH, '//th[@class="MuiTableCell-root MuiTableCell-body MuiTableCell-sizeMedium css-11hk28a"]').text) - invalid_format_value = int(self.driver.find_element(By.XPATH, '(//td[@class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignLeft MuiTableCell-sizeMedium css-11hk28a"])[1]').text) - duplicate_within_current_file_value = int(self.driver.find_element(By.XPATH, '(//td[@class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignLeft MuiTableCell-sizeMedium css-11hk28a"])[2]').text) - duplicates_within_global_objects_value = int(self.driver.find_element(By.XPATH, '(//td[@class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignLeft MuiTableCell-sizeMedium css-11hk28a"])[3]').text) - total_value = int(self.driver.find_element(By.XPATH, '(//td[@class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignLeft MuiTableCell-sizeMedium css-11hk28a"])[4]').text) - # 获取错误的item数量 - error_item_value = len(self.driver.find_elements(By.XPATH, '//i[@class="iconfont icon-Dashboarddisablepolicy text-[var(--color-error)] pr-[4px]"]')) - # 获取table页total值 - table_total_value = int(self.driver.find_element(By.XPATH, '//div[@class="flex-1 flex items-center justify-center undefined"]/span[contains(text(),"Total")]').text[6:]) # 文件中统计结果 - with open(self.my_files._obj_files_path(file_name=data['file_name']), "r", encoding='utf-8') as f: # 打开文件 - # 获取总行数 - lines = f.readlines() - total_in_file_value = len(lines) - # 统计每行出现的次数 - # 以{key:value}形式输出,统计每个item出现的次数,例如{"*sdfddd":1} - line_counts = Counter(lines) - print(line_counts) - # 获取重复数据条数,循环{key:value}中的value,如果大于1则表示有重复,则count-1,表示重复多少次,将所有count-1相加得出重复数据个数 - duplicate_num_in_file = sum(count - 1 for count in line_counts.values() if count > 1) - invalid_format_value_in_file = 5 - print(valid_value, invalid_format_value, total_value, error_item_value, table_total_value, total_in_file_value,duplicate_num_in_file) - # 断言统计结果:有效的值 = 总值-重复值-格式错误值 = table总数 - failed数量 - assert valid_value == total_value - (invalid_format_value + duplicate_within_current_file_value) == total_in_file_value - (duplicate_num_in_file + invalid_format_value_in_file) == table_total_value - error_item_value + # 验证 + self.objects_po.verify_import_drawer_result(data['file_name']) self.driver.find_element(By.XPATH, '//button[@class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary css-k5thc0"]').click() time.sleep(1) @@ -2936,23 +2922,23 @@ class Ports: time.sleep(5) # 进入编辑页面 self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() - self.driver.find_element(By.XPATH, listPage_editButton_posXpath).click() + self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() # 验证上传的文件条数是否符合实际 time.sleep(0.5) # item_total = int(self.driver.find_element(By.XPATH, # '//*[@id="router-view-container"]//div[@class="total"]').text[6:]) # assert valid_value == item_total, "数目不符" - with open(self.my_files._obj_files_path(file_name=data['file_name']), "r", encoding='utf-8') as f: # 打开文件 - first_line = f.readline() - self.driver.find_element(By.XPATH, ObjectDetailPage_search_frame).send_keys(first_line) - time.sleep(1) - self.driver.find_element(By.XPATH, ObjectDetailPage_search_frame).send_keys(Keys.ENTER) - item_total2 = int(self.driver.find_element(By.XPATH, objectDetailPage_total_value).text[6:]) - # print(item_total2,self.driver.find_element(By.XPATH, "//*[@id='router-view-container']//div[@class='ItemRow infinite-list-item']//div[@class='v-fill-available row-info']/span").text,first_line) - assert item_total2 == 1 + # with open(self.my_files._obj_files_path(file_name=data['file_name']), "r", encoding='utf-8') as f: # 打开文件 + # first_line = f.readline() + # self.driver.find_element(By.XPATH, ObjectDetailPage_search_frame).send_keys(first_line) + # time.sleep(1) + # self.driver.find_element(By.XPATH, ObjectDetailPage_search_frame).send_keys(Keys.ENTER) + # item_total2 = int(self.driver.find_element(By.XPATH, objectDetailPage_total_value).text[6:]) + # # print(item_total2,self.driver.find_element(By.XPATH, "//*[@id='router-view-container']//div[@class='ItemRow infinite-list-item']//div[@class='v-fill-available row-info']/span").text,first_line) + # assert item_total2 == 1 # assert self.driver.find_element(By.XPATH, "//*[@id='router-view-container']//div[@class='ItemRow infinite-list-item']//div[@class='v-fill-available row-info']/span").text == first_line[:4] - self._just_goto_portsPage() + self._goto_portsPage() self.driver.find_element(By.XPATH, listpage_search_input_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(data["Name"]) self.driver.find_element(By.XPATH, listPage_objectSearch_select_Name_posXpath).click() @@ -2970,7 +2956,7 @@ class Ports: self._query(data) self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() ##点击编辑按钮 - self.driver.find_element(By.XPATH, listPage_editButton_posXpath).click() + self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() self.driver.find_element(By.XPATH, url_ObjectDetailPage_importFromFile_posXpath).click() # 于Please Upload input 上传文件 self.driver.find_element(By.XPATH, url_ObjectDetailPage_pleaseUpload_posXpath).send_keys( @@ -3033,9 +3019,10 @@ if __name__ == '__main__': # driver2 chrome_option = webdriver.ChromeOptions() + # driver = download_files() driver = MyWebDriver( # command_executor="http://192.168.64.11:4444", - command_executor="http://192.168.64.26:4444", + command_executor="http://192.168.39.89:4444", options=chrome_option ) port = Ports(demo_fixture=driver) @@ -3054,17 +3041,18 @@ if __name__ == '__main__': # profile_pub = ProfilesPublicOperations(driver) # profile_pub.change_vsys(vsys_name='UIAutoTestVsys') # profile_pub.change_vsys(vsys_name="Vsys2test") - port.port_case(data= + port._import_many_items(data= { - "ids": "创建Port、查询Port、删除Port | T001", - "Model": "Modify", - "Type": 0, - "Search type": "Name", - "Name": "", - "Items": [ - "1-4->", - ], - "Description": "" + "ids": "编辑时导入item", + "Model": "create", + "Type": 0, + "Search type": "Name", + "Name": "测试大量导入", + "Items": [ + "80->", + ], + "Description": "", + "file_name": "port大量导入10万条数据.txt" },) time.sleep(3) driver.quit()
\ No newline at end of file diff --git a/page_element/objects_element_position.py b/page_element/objects_element_position.py index 1e0cf761..fd26f8f0 100644 --- a/page_element/objects_element_position.py +++ b/page_element/objects_element_position.py @@ -15,6 +15,7 @@ listpage_first_row_name_posXpath = '(//span[@class="truncate"])[1]' #第一行na listpage_delete_no_posXpath = '//button[@class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary css-1hoe4y0"]' listpage_export_no_button_posXpath = '//button[@class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary css-1hoe4y0"]' listpage_export_yes_button_posXpath = '//button[@class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorPrimary MuiButton-root MuiLoadingButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorPrimary css-1k1ho7l"]' +listPage_objectSearch_select_UUID_posXpath = "//ul[@class='base-Popper-root MuiAutocomplete-listbox css-18r31z0']//span[text()='UUID']" listPage_objectSearch_select_Name_posXpath = "//ul[@class='base-Popper-root MuiAutocomplete-listbox css-18r31z0']//span[text()='Name']" #查询Name listPage_objectSearch_select_Details_posXpath = "//ul[@class='base-Popper-root MuiAutocomplete-listbox css-18r31z0']//span[text()='Detail']" #查询Details listPage_objectSearch_select_Description_posXpath = "//ul[@class='base-Popper-root MuiAutocomplete-listbox css-18r31z0']//span[text()='Description']" #查询Description @@ -460,8 +461,8 @@ listPage_object_urls_importButton_posXpath = '//div[@class="ly-tablecontrol-1 el listPage_object_urls_exportButton_posXpath = "//i[@class='iconfont icon-export']" # 导出文件按钮 Xpath listPage_object_urls_exportPopYes_posXpath = "//div[@class='MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation24 MuiDialog-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm css-xguxzj']//button[contains(text(),'Yes')]" # 导出数据选择确认弹窗 yes Xpath listPage_object_urls_exportPopNo_posXpath = "//div[@class='MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation24 MuiDialog-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm css-xguxzj']//button[contains(text(),'No')]" # 导出数据选择确认弹窗 no Xpath -listPage_object_urls_exportPopSelectAll_posXpath = '//div[@class="el-table__header-wrapper"]//span[@class="el-checkbox__inner"]' # 导出数据选择确认弹窗全选CheckBox Xpath -listPage_object_urls_exportPopCheckbox_posXpaths = '//div[@class="el-dialog__body"]//div[@class="el-table__body-wrapper is-scrolling-none"]//span[@class="el-checkbox__inner"]' # 导出数据选择确认弹窗CheckBox(多个) +listPage_object_urls_exportPopSelectAll_posXpath = '(//div[@role="dialog"]//input[@type="checkbox"])[1]' # 导出数据选择确认弹窗全选CheckBox Xpath +listPage_object_urls_exportPopCheckbox_posXpaths = '//div[@role="dialog"]//div[@role="rowgroup"]//input[@type="checkbox"]' # 导出数据选择确认弹窗CheckBox(多个) listPage_object_urls_exportPopCheckbox_posXpaths_template = '(//div[@class="el-dialog__body"]//div[@class="el-table__body-wrapper is-scrolling-none"]//span[@class="el-checkbox__inner"])[{}]' # 导出数据选择确认弹窗CheckBox(多个) listPage_object_urls_clearCounterPopYes_posXpath = '//*[contains(text(),"Confirm to Clear Counter")]/../..//span[contains(text(),"Yes")]' # Clear Counter 选择确认弹窗中的Yes确认按钮 # listPage_object_urls_tableCheckbox_posXpaths = '//table[@class="el-table__body"]//span[@class="el-checkbox__inner"]' # 列表页CheckBox(50) @@ -489,7 +490,7 @@ listPage_object_urls_tableDetails_firstSingleObject_posXpath = \ # listPage_object_urls_tableDetails_firstObjectGroup_posXpath = '(//i[contains(@class,"group")]/ancestor::tr//span[@class="el-checkbox__inner"][1])' # 列表页中第一个Object Group 的CheckBox listPage_object_urls_tableDetails_firstObjectGroup_posXpath = \ '(//*[contains(@class,"table-status-item-id")]/preceding-sibling::div[2][not(*)]/ancestor::tr//*[contains(@class,"name-fontFamily")]/preceding-sibling::i[(contains(@class,"group"))]/ancestor::tr//span[@class="el-checkbox__inner"])[1]' # 列表页中第一个Object Group 的CheckBox(不包含single Object和锁定对象) -listPage_object_urls_tableCheckbox_firstNotLocalVsys_objectOrGroup_posXpath = '(//div[@class="table-status-box"]/div[2]//*[contains(@class,"icon-lock")]/ancestor::tr//span[@class="el-checkbox__inner"])[1]' # 列表页中第一个不是本Vsys的对象或对象组的CheckBox +listPage_object_urls_tableCheckbox_firstNotLocalVsys_objectOrGroup_posXpath = '(//i[@class="iconfont icon-lock text-[18px] text-[--color-text-decoration]"]/ancestor::div[@class="css-16m40q9 MuiDataGrid-cell MuiDataGrid-cell--textLeft"]/preceding-sibling::div[@data-field="__check__"]//input)[1]' # 列表页中第一个不是本Vsys的对象或对象组的CheckBox listPage_object_urls_tableCheckbox_localVsys_objectOrGroup_posXpaths = '//*[contains(@class,"table-status-item-id")]/preceding-sibling::div[2][not(*)]/ancestor::tr//span[@class="el-checkbox__inner"]' # 列表页中本Vsys的Object 或Group(不包含其他Vsys) # listPage_object_tableCheckbox_localVsysAndReferenceEqualO_objectOrGroup_posXpaths = '//*[contains(@class,"table-status-item-id")]/preceding-sibling::div[2][not(*)]/ancestor::tr//div[(contains(@id,"Count-_Objects") or contains(@id,"objectReferenceData") or contains(@id,"ReferenceData-")) and number(text())=0]/ancestor::tr//span[@class="el-checkbox__inner"]' # 列表页中本Vsys的Object 或Group(不包含其他Vsys)且Reference Count==0 @@ -1473,8 +1474,8 @@ port_ObjectDetailPage_itemValueInput_poXpath = '//div[@class="MuiInput-root MuiI port_ObjectDetailPage_itemSaveButton_poXpath = '//i[@class="operate-icon iconfont icon-save"]' # item 下value保存按钮Xpath!!!!! port_ObjectDetailPage_item_search_posId = acc_ObjectDetailPage_item_search_posXpath # item 下搜索框id port_ObjectDetailPage_item_search_posXpath = '//input[@class="MuiInput-input css-za5rna"]' # item 下搜索框xpath!!!!! -port_ObjectDetailPage_importFromFile_posXpath = '//button[@class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary css-bc4t0x"]' # Import From File 按钮Xpath!!!!! -port_ObjectDetailPage_pleaseUpload_posXpath = '//label[@class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary css-1b1h392"]' # Please Upload input标签Xpath!!!!! +port_ObjectDetailPage_importFromFile_posXpath = "//button[contains(text(),'import from file')]" # Import From File 按钮Xpath!!!!! +port_ObjectDetailPage_pleaseUpload_posXpath = '//input[@type="file"]' # Please Upload input标签Xpath!!!!! port_ObjectDetailPage_importUrlOk_posXpath = '//button[@class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary css-k5thc0"]' # Import 页面 下的OK按钮Xpath port_ObjectDetailPage_description_posXpath = '//textarea[@placeholder="Please enter the content"]' # 对象详情页面下Description input Xpath!!!!! port_ObjectDetailPage_auditLogs_posXpath = acc_ObjectDetailPage_auditLogs_posXpath # Audit Logs Xpath @@ -1524,7 +1525,7 @@ port_listPage_object_tableCheckbox_firstSingleObject_posXpath = listPage_object_ port_listPage_object_tableCheckbox_firstNotLocalVsys_objectOrGroup_posXpath = listPage_object_urls_tableCheckbox_firstNotLocalVsys_objectOrGroup_posXpath # 列表页中第一个不是本Vsys的对象或对象组的CheckBox port_listPage_object_tableCheckbox_notLocalVsys_objectOrGroup_posXpaths = listPage_object_urls_tableCheckbox_notLocalVsys_objectOrGroup_posXpaths # 列表页中不是本Vsys的对象或对象组的CheckBox port_listPage_object_clearCounterPopYes_posXpath = listPage_object_urls_clearCounterPopYes_posXpath # Clear Counter 选择确认弹窗中的Yes确认按钮 -port_listPage_object_first_row_id_posXpath = "//div[contains(@class,'el-table__body-wrapper')]//tr[1]//td[count(//div[@class='el-table__header-wrapper']//span[text()='ID']/../../../preceding-sibling::th)+1]//div[@class='table-status-item-id']//span" +port_listPage_object_first_row_uuid_posXpath = '//div[@aria-rowindex="2"]//div[@data-field="uuid"]' # link页 port_listpage_linkButton_posId = "btnCopy-_OperateBtns_ElRow_Objects_port_Home_App_anonymousComponent" # link按钮ID port_listpage_linkSave_posXpath = '//*[@id="clusterSave-_ClusterTable_ElDialog_copyComponents_Objects_port_Home_App_anonymousComponent"]' # Cluster和Vsys保存按钮ID @@ -1546,8 +1547,10 @@ port_ObjectDetailPage_mainOkButton_posXpath = '//button[@class="MuiButtonBase-ro port_ObjectDetailPage_okButton_yes_posXpath = acc_ObjectDetailPage_okButton_yes_posXpath # 确认弹窗的“Yes”按钮 # 对象组详情页 -port_ObjectGroupDetailPage_subObjects_addButton_normalAdd_posXpath = '//div[@class="port-object-included_sub_object_uuids"]//i[@class="iconfont icon-Create1 text-[18px] font-[700] text-[--color-primary] cursor-pointer"]' # Subordinate Objects 下有数据新增时"+"按钮Xpath -port_ObjectGroupDetailPage_subObjects_addButton_newAdd_posXpath = '//div[@class="port-object-included_sub_object_uuids"]//button' # Subordinate Objects 下无数据新增时"+"按钮Xpath +port_groupObjectDetailPage_excludeObjects_search_posXpath = '//div[@class="port-object-excluded_sub_object_uuids"]//input' +port_groupObjectDetailPage_subordinateObjects_search_posXpath = '//div[@class="port-object-included_sub_object_uuids"]//input' +port_ObjectGroupDetailPage_subObjects_addButton_normalAdd_posXpath = '//div[@class="port-object-included_sub_object_uuids"]//button' # Subordinate Objects 下无数据新增时"+"按钮Xpath +port_ObjectGroupDetailPage_subObjects_addButton_newAdd_posXpath = '//div[@class="port-object-included_sub_object_uuids"]//i[@class="iconfont icon-Create1 text-[18px] font-[700] text-[--color-primary] cursor-pointer"]' # Subordinate Objects 下有数据新增时"+"按钮Xpath port_ObjectGroupDetailPage_subObjects_toggleDraw_addButton_posXpath = '//div[@class="px-[12px] py-[4px] flex"]/button' # Ports侧滑窗口的"+"按钮 port_ObjectGroupDetailPage_subObjects_toggleDraw_addButton_port_posXpath = objectPage_group_sub_object_add_new_select_button_posXpath # Ports侧滑窗口的"+"按钮下的Port port_ObjectGroupDetailPage_subObjects_subCreatePortDrawer_nameInput_posXpath = '(//input[@class="MuiInput-input css-fqt4w4"])[2]' # 侧滑子Create Ports页面Name input Xpath @@ -1558,12 +1561,12 @@ port_ObjectGroupDetailPage_subObjects_subCreatePortDrawer_descriptionTextarea_po port_ObjectGroupDetailPage_subObjects_subCreatePortDrawer_okButton_posXpath = '(//button[@class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary MuiButton-root MuiLoadingButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary form-action-submit css-1djnbgz"])[2]' # 侧滑子Create Account页面中OK按钮 port_ObjectGroupDetailPage_subObjects_subCreatePortDrawer_okButton_yes_posXpath = acc_ObjectGroupDetailPage_subObjects_subCreateAccountDrawer_okButton_yes_posXpath # 侧滑子Create Account页面确认弹窗的“Yes”按钮 port_ObjectDetailPage_firstPortObject = acc_ObjectDetailPage_firstAccObject ## 侧滑Objects列表中第一个acc object Xpath -portGroup_ObjectDetailPage_excludeObjectsSwitch_posXpath = accGroup_ObjectDetailPage_excludeObjectsSwitch_posXpath # Exclude Objects Switch Xpath -portGroup_ObjectDetailPage_excludeObjects_itemsArea_posXpath = accGroup_ObjectDetailPage_excludeObjects_itemsArea_posXpath # Exclude Objects下的item区域div Xpath -portGroup_ObjectDetailPage_excludeObjectsSwitch_newAdd_posXpath = accGroup_ObjectDetailPage_excludeObjectsSwitch_newAdd_posXpath # Exclude Objects无数据时新增按钮Xpath +portGroup_ObjectDetailPage_excludeObjectsSwitch_posXpath = "//div[@class='port-object-']//span[@class='MuiButtonBase-root MuiSwitch-switchBase MuiSwitch-colorPrimary PrivateSwitchBase-root MuiSwitch-switchBase MuiSwitch-colorPrimary css-y2jqxi']" # Exclude Objects Switch Xpath +portGroup_ObjectDetailPage_excludeObjects_itemsArea_posXpath = "//div[@class='port-object-excluded_sub_object_uuids']" # Exclude Objects下的item区域div Xpath +portGroup_ObjectDetailPage_excludeObjectsSwitch_newAdd_posXpath = '//div[@class="port-object-excluded_sub_object_uuids"]' # Exclude Objects无数据时新增按钮Xpath port_ObjectDetailPage_firstObject = acc_ObjectDetailPage_firstObject # 侧滑acc Object中第一个url Xpath port_ObjectGroupDetailPage_subObjects_toggleDraw_closeButton_posXpath = acc_ObjectGroupDetailPage_subObjects_toggleDraw_closeButton_posXpath # Accounts侧滑窗口的Close按钮 -portGroup_ObjectDetailPage_excludeObjectsSwitch_normalAdd_posXpath = accGroup_ObjectDetailPage_excludeObjectsSwitch_normalAdd_posXpath # Exclude Objects有数据时新增按钮Xpath +portGroup_ObjectDetailPage_excludeObjectsSwitch_normalAdd_posXpath = '//div[@class="port-object-excluded_sub_object_uuids"]//i[@class="iconfont icon-Create1 text-[18px] font-[700] text-[--color-primary] cursor-pointer"]' # Exclude Objects有数据时新增按钮Xpath port_ObjectDetailPage_secondObject = acc_ObjectDetailPage_secondObject # 侧滑acc Object中第二个url Xpath port_object_group_subobject_close_posXpath = '//div[@class="absolute bottom-0 h-[40px] w-[100%] overflow-hidden text-[16px] truncate bg-[--color-background-secondary] flex justify-center items-center pl-[12px] pr-[38px]"]/button' ## listPage->Tips dialog 列表页 tips对话框 diff --git a/testdata/ui_file/objects/import_file/ports_item导入文件.txt b/testdata/ui_file/objects/import_file/ports_item导入文件.txt index c66e623d..609adc96 100644 --- a/testdata/ui_file/objects/import_file/ports_item导入文件.txt +++ b/testdata/ui_file/objects/import_file/ports_item导入文件.txt @@ -1 +1 @@ -443
\ No newline at end of file +4
\ No newline at end of file |
