summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryouzhijiang <[email protected]>2024-10-24 16:30:30 +0800
committeryouzhijiang <[email protected]>2024-10-24 16:30:30 +0800
commit960cad5d8762cb90cf2bbd0a1f663b92181eb1e4 (patch)
tree06b89c6e2ee5f1fb12e9d6c9c3cbef671502738d
parent87fc3ad030d64957031c35482929568c48adef2e (diff)
parentee3edc1e04030abd32ec0fe31c23d8d6f1eba4e3 (diff)
Merge branch 'develop' of https://git.mesalab.cn/zhaokun/tsg_ui_script into develop
-rw-r--r--cases/object/test_ports.py96
-rw-r--r--common/ui_common/objects/objects_public_operations.py22
-rw-r--r--common/ui_common/objects/ports.py292
-rw-r--r--page_element/objects_element_position.py27
-rw-r--r--testdata/ui_file/objects/import_file/ports_item导入文件.txt2
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