# from selenium.common import NoSuchElementException import uuid from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from common.ui_common.login_logout.loginout import LogInOut from common.ui_common.profiles.profiles_public_operations import ProfilesPublicOperations _author_ ='lina' import time from selenium import webdriver #from selenium.webdriver import Keys from selenium.webdriver.common.by import By from cases.conftest import my_driver from common.driver_common.mywebdriver import MyWebDriver from common.driver_common.random_name import RandomName from common.driver_common.screenshot import screenshot_on_failure from common.ui_common.objects.objects_public_operations import ObjectsPublicOperations from config.workpath import workdir from page_element.objects_element_position import * from page_element.ln_objects_element_position import * import random import configparser import os from config.workpath import workdir from page_element.policies_element_position import * class AppGroup: def __init__(self, demo_fixture: MyWebDriver): self.workdir = workdir self.my_random = RandomName() self.driver = demo_fixture self.wait = WebDriverWait(self.driver, 10) self.objects_po=ObjectsPublicOperations(self.driver) self.loginout_parse = configparser.ConfigParser() loginout_parse_dir = os.path.join(workdir, "config", "loginout.ini") self.loginout_parse.read(loginout_parse_dir, encoding="utf-8") self.profile_pub = ProfilesPublicOperations(self.driver) # time.sleep(1.5) # try: # element = self.driver.find_element(By.XPATH, '//*[@class="iconfont icon-Delete_X"]') # element.click() # except NoSuchElementException: # pass #screenshot_on_failure是一个装饰器,可以在方法执行失败时自动截图 @screenshot_on_failure def AppGroups_case(self, data: {}):#接受一个data的参数,类型为字典 self.driver.implicitly_wait(10) self._create(data) self._modify(data) self._delete(data) @screenshot_on_failure def _goto_subObjectPage(self): # 菜单操作 跳转到appgroup页面 #self.driver.find_element(By.CSS_SELECTOR, mainPage_navigationBar_logo_posCss).click() self.driver.isElementExist(Element='//li[@class="MuiListItem-root MuiListItem-gutters Mui-selected menu-object css-1cpzmuh"]/div[@class="MuiCollapse-root MuiCollapse-vertical MuiCollapse-entered css-c4sutr"]') if self.driver.Exist: self.driver.find_element(By.XPATH, '//div[@class="MuiListItem-root MuiListItem-gutters Mui-selected menu-app-group css-1l56wwh"]').click() else: self.driver.find_element(By.XPATH, mainPage_firstLevelMenu_Objects_posXpath).click() self.driver.find_element(By.XPATH, mainPage_secondLevelMenu_Application_appGroups_posXpath).click() # 获取total # total_value = self.driver.find_element(By.XPATH, main_listPage_object_total_value_posXpath).text # assert total_value != "Total: 0", "total数目不符" # try: # element = WebDriverWait(self.driver, 10).until( # EC.presence_of_element_located((By.XPATH, object_page_First_object_posXpath)) # ) # print("first row exist") # except TimeoutError: # # 元素在10秒内没有被找到 # print("first row not exist") def search_by_id(self,data): self._create(data) data["Search_type"]="ID" self._delete(data) def create_app(self): # 跳转到App列表页 self.random_name = self.my_random.random_name() #创建App,点击Create self.driver.find_element(By.XPATH, appgroup_slide_app_name).send_keys(self.random_name) # input name self.driver.find_element(By.XPATH, '(//input[@class="MuiInput-input css-fqt4w4"])[3]').send_keys(self.random_name) # input long name self.driver.find_element(By.XPATH, '(//textarea[@placeholder="Please enter the content"])[2]').send_keys("Your description") # input description # select the must self.driver.find_element(By.XPATH, application_select_category_dropwmn_posXpath).click() # category self.driver.find_element(By.XPATH, application_category_businesystem_xpath).click() # self.driver.find_element(By.XPATH, application_select_subcategory_dropwmn_posXpath).click() # subcategory self.driver.find_element(By.XPATH, application_subcategory_authservice_xpath).click() # self.driver.find_element(By.XPATH, application_select_content_dropwmn_posXpath).click() # content self.driver.find_element(By.XPATH, application_content_voicecall_xpath).click() # self.driver.find_element(By.XPATH, application_select_risk_dropwmn_posXpath).click() # risk 0 self.driver.find_element(By.XPATH, appgroup_slide_risk).click() self.driver.find_element(By.XPATH,appgroup_slide_app_add_signature_button ).click() # risk 0 self.driver.find_element(By.XPATH, appgroup_slide_app_list_first_one).click() # save App self.driver.find_element(By.XPATH, appgroup_slide_app_ok).click() # 点击OK self.driver.find_element(By.XPATH, appgroup_slide_app_confirm_ok).click() # 点击confirm ok @screenshot_on_failure def _create(self, data: {}): # 跳转到appgroup列表页 self._goto_subObjectPage() self.random_name = self.my_random.random_name() #创建appgroup,点击Create self.driver.find_element(By.XPATH, listpage_create_button_posXpath).click() # Create按鈕 self.driver.find_element(By.XPATH, appgroup_inputname_xpath).send_keys(data["Name"]) # 输入名字 self.driver.find_element(By.XPATH, application_select_box_xpath).click() # 点击Application选择框 self.driver.find_element(By.XPATH, http_selection_xpath).click() # 选择http self.driver.find_element(By.XPATH, '//i[@class="iconfont icon-Clear_aNormal close-icon"]').click() #1、新建App if data["type"] == "New": self.driver.find_element(By.XPATH,appgroup_slide_create_app_button_posXpath).click() self.create_app() self.driver.find_element(By.XPATH, appgroup_exclude_app_switch_xpath).click() # 点击Exclude App开启框 self.driver.find_element(By.XPATH, appgroup_exclude_app_selection_xpath).click() # 选择Exclude App time.sleep(0.5) self.driver.find_element(By.XPATH, ssl_selection_xpath).click() # 选择ssl self.driver.find_element(By.XPATH, '//i[@class="iconfont icon-Clear_aNormal close-icon"]').click() #2.新建Exclude App if data["type"] == "New": self.driver.find_element(By.XPATH, appgroup_slide_create_app_button_posXpath).click() self.create_app() time.sleep(1) self.driver.find_element(By.XPATH, appgroup_description_input_xpath).send_keys("Your description") # 输入描述 # 保存appgroup self.driver.find_element(By.XPATH, appgroup_ok_button_posXpath).click() # 点击OK # self.driver.find_element(By.XPATH, appgroup_confirm_ok_button_xpath).click() # 点击confirm ok time.sleep(3) self.objects_po.extract_ele_userdefinedAttributesAndSignatures()## 提取ID、Name def create_input_name_test(self,data): # 跳转到appgroup列表页 self._goto_subObjectPage() # 创建appgroup,点击Create self.driver.find_element(By.XPATH, listpage_create_button_posXpath).click() # Create按鈕 long_name = "testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest" multi_char_name = '1!@#$%^&*():"{}|?><,./中文русскийEnglish' if data["CheckName"] == "length": self.name = long_name elif data["CheckName"] == "multi": self.name = multi_char_name self.driver.find_element(By.XPATH, appgroup_inputname_xpath).send_keys(self.name) # 输入名字 self.driver.find_element(By.XPATH, application_select_box_xpath).click() # 点击Application选择框 self.driver.find_element(By.XPATH, http_selection_xpath).click() # 选择http self.driver.find_element(By.XPATH, '//i[@class="iconfont icon-Clear_aNormal close-icon"]').click() time.sleep(1) self.driver.find_element(By.XPATH, appgroup_description_input_xpath).send_keys("Your description") # 输入描述 # 保存appgroup self.driver.find_element(By.XPATH, appgroup_ok_button_posXpath).click() # 点击OK # self.driver.find_element(By.XPATH, appgroup_confirm_ok_button_xpath).click() # 点击confirm ok data["Search_type"]="Name" if data["CheckName"] == "length": data["Name"] = long_name elif data["CheckName"] == "multi": data["Name"] = multi_char_name self._search(data) def input_name_test(self,data): self.create_input_name_test(data) time.sleep(3) self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 选择第一个对象 self.driver.find_element(By.XPATH, listpage_delete_button_posXpath).click() # del self.driver.find_element(By.XPATH, listpage_delete_yes_button_posXpath).click() # del yes def _search(self, data:{}): self._goto_subObjectPage() if "fuzzy" in data["Search_type"]: search_type = data["Search_type"].split('->')[1] if search_type == "Name": search_value = self.objects_po.table_dict1["Name"][:10] self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() # 选中查询框 self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(search_value) # 输入Name self.driver.find_element(By.XPATH, listPage_objectSearch_select_Name_posXpath).click() # 选中Name self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() time.sleep(2) total_value = self.driver.find_element(By.XPATH, main_listPage_object_total_value_posXpath).text assert total_value == "Total: 1", "total数目不符" else: # search_type = data["Search_type"].split('&') # for search_type in search_type: # # if search_type == "ID": # # self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() # 选中查询框 # # self.driver.find_element(By.XPATH, listPage_objectSearch_app_group_select_Id_posXpath).click() # 选中ID # # self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(self.objects_po.table_dict1['ID']) # 输入ID # # self.driver.find_element(By.XPATH, "//div[normalize-space(text())='Name']").click() # # self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() # 查询按钮 # elif search_type == "Name": self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() # 选中查询框 self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(data["Name"]) # 输入Name self.driver.find_element(By.XPATH, listPage_objectSearch_select_Name_posXpath).click() # 选中Name # self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() # 查询按钮 # 不支持全局查询 self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() def _modify(self, data: {}): self._goto_subObjectPage() self._search(data) self.random_name = self.my_random.random_name() # 重新生成一个random_name # 查询后EditName time.sleep(2)#需要时间等待 self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 第一行数据前的复选框 self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() # edit按钮 time.sleep(3) self.objects_po.clear_Name(path=appgroup_description_input_xpath) # 清除description self.objects_po.clear_Name(path=appgroup_inputname_xpath) self.driver.find_element(By.XPATH, appgroup_inputname_xpath).send_keys(self.random_name) # 重新输入name self.driver.find_element(By.XPATH, appgroup_description_input_xpath).send_keys("Modify description") # 输入描述 # self.driver.find_element(By.XPATH, application_select_little_plus_xpath).click() # 点击Application选择框 # self.driver.find_element(By.XPATH, ftp_selection_xpath).click() # 选择ftp # 确认修改 self.driver.find_element(By.XPATH, appgroup_ok_button_posXpath).click() # self.driver.find_element(By.XPATH, appgroup_confirm_ok_button_xpath).click() #如果修改的是Name这里需要重新用ID搜索下,搜索完后将Search_type改为“ID” # if data["Search_type"] == "Name": # self.driver.find_element(By.XPATH, listPage_objectSearch_Attributes_buttonClear_posId).click() # 清空查询框 # self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() # 选中查询框 # self.driver.find_element(By.XPATH, listPage_objectSearch_app_group_select_Id_posXpath).click() # 选中ID # self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(self.objects_po.table_dict1['ID']) # 输入ID # self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() # 查询按钮 #time.sleep(3) #self.objects_po.assert_ele_userdefined_attributes_and_signatures() # # 断言修改Name是否生效 #assert self.random_name == self.objects_po.edit_table_dict1['Name'], "校验修改Name是否生效" return self.random_name def audit_modify(self, data: {}): self._goto_subObjectPage() self._search(data) # 查询后EditName time.sleep(2)#需要时间等待 self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 第一行数据前的复选框 self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() # edit按钮 time.sleep(3) self.objects_po.clear_Name(path=appgroup_description_input_xpath) # 清除description self.driver.find_element(By.XPATH, appgroup_description_input_xpath).send_keys("Modify description") # 输入描述 # self.driver.find_element(By.XPATH, application_select_little_plus_xpath).click() # 点击Application选择框 # self.driver.find_element(By.XPATH, ftp_selection_xpath).click() # 选择ftp # 确认修改 self.driver.find_element(By.XPATH, appgroup_ok_button_posXpath).click() # self.driver.find_element(By.XPATH, appgroup_confirm_ok_button_xpath).click() #如果修改的是Name这里需要重新用ID搜索下,搜索完后将Search_type改为“ID” # if data["Search_type"] == "Name": # self.driver.find_element(By.XPATH, listPage_objectSearch_Attributes_buttonClear_posId).click() # 清空查询框 # self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() # 选中查询框 # self.driver.find_element(By.XPATH, listPage_objectSearch_app_group_select_Id_posXpath).click() # 选中ID # self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(self.objects_po.table_dict1['ID']) # 输入ID # self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() # 查询按钮 #time.sleep(3) #self.objects_po.assert_ele_userdefined_attributes_and_signatures() # # 断言修改Name是否生效 #assert self.random_name == self.objects_po.edit_table_dict1['Name'], "校验修改Name是否生效" return self.random_name def _delete(self, data: {}): self._goto_subObjectPage() self._search(data) time.sleep(3) self.driver.find_element(By.XPATH,listPage_select_first_object_posXpath).click() # 选择第一个对象 self.driver.find_element(By.XPATH, listpage_delete_button_posXpath).click() #del self.driver.find_element(By.XPATH, listpage_delete_yes_button_posXpath).click() #del yes time.sleep(3) # self.Page_Tips = self.driver.find_element(By.XPATH,list_page_no_data_app_group).text # assert self.Page_Tips == "No Data", "校验删除是否成功,是否提示No Data" #列设置 def group_column_settings_case(self): self.driver.implicitly_wait(10) self._goto_subObjectPage() #description定位在App Group上同样可以定位到 self.objects_po.Column_settings(Column=listPage_object_urls_columnSetting_descriptionOption_posXpath) self.objects_po.Column_ele_ex(Column_text=self.objects_po.Column_text) assert self.objects_po.result #Audit Logs def _verify_audit_logs(self,data): self._create(data) self._search(data) self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 第一行数据前的复选框 self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() # edit按钮 self.objects_po.audit_log_check("Application Object", "Create") self._goto_subObjectPage() self._modify(data) self._goto_subObjectPage() self._search(data) self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 第一行数据前的复选框 self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() # edit按钮 self.objects_po.audit_log_check("Application Object", "Edit") self._delete(data) #Audit Logs需要的函数 def select_first_row_data_and_edit(self): self._goto_subObjectPage() self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 第一行数据前的复选框 self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() # edit按钮 def _vsys_case(self,data:{}): if "vsys_operate" in data.keys(): self.vsys_opearte = data["vsys_operate"] #{"step1": "Tvsys1->create", "step2": "Tvsys3->search"} self.vsys2="null" for i in range(1,len(self.vsys_opearte.keys())+1): self.step = "step" + str(i) #step1 self.step_operation = self.vsys_opearte[self.step].split("->") #[Tvsys1,create] if i==1: self.vsys1 = self.step_operation[0] #Tvsys1 self.operation1 = self.step_operation[1] #create self.objects_po.Switch_vsys(vsys_id=self.vsys1) elif i==2: self.vsys2 = self.step_operation[0] #Tvsys3 self.operation2 = self.step_operation[1] #search if self.vsys1 == self.vsys2: if self.operation2 == "security_quote": data["delete_mode"] = "security" # elif self.operation2 == "intercept_quote": # data["delete_mode"] = "intercept" else: self.objects_po.Switch_vsys(vsys_id=self.vsys2) self.objects_po.compare_vsys(vsys1=self.vsys1,vsys2=self.vsys2) # self._query = 0 self.appGroup_vsys_operate(operate=self.step_operation[1],data=data) #Tvsys1 create self._clear_appGroup_vsys_create(data) def appGroup_vsys_operate(self,operate,data:{}): if operate == "create": self._create(data) elif operate == "search": self._search(data) elif operate == "security_quote": self.new_security_policy_appGroup(data) else: pass def _clear_appGroup_vsys_create(self,data): if self.operation1 == "create": if self.operation2 == "security_quote" and data["delete_mode"] == "security": self.objects_po.Switch_vsys(vsys_id=self.vsys2) self.objects_po._del_policy(data) time.sleep(5) self._delete(data) else: self.objects_po.Switch_vsys(vsys_id=self.vsys1) self._delete(data) pass def new_security_policy_appGroup(self, data: {}): # 跳转到安全策略创建页面 self.driver.find_element(By.XPATH, mainPage_firstLevelMenu_Policy_posXpath).click() self.driver.find_element(By.XPATH, mainPage_secondLevelMenu_Security_posXpath).click() # 添加appGroup self.driver.find_element(By.XPATH, listpage_create_button_posXpath).click() self.driver.find_element(By.XPATH, security_create_Name_input_frame_PosXpath).send_keys(data["Name"]) self.driver.find_element(By.XPATH, security_create_add_application_button_click_posXpath).click() # app +按钮 self.driver.find_element(By.XPATH, security_first_add_App_Group_right_top_click_PosXpath).click() #选择app group # 如tunnel存在则创建 time.sleep(2) self.driver.find_element(By.XPATH, '(//*[@id="object_ip_search"])[2]').send_keys(self.objects_po.table_dict1['Name']+ Keys.ENTER) self.driver.isElementExist(Element=security_first_app_group_inlist_click_PosXpath) # if self.driver.Exist: # 如果存在,就进行创建 assert self.driver.Exist == True print('正常找到Object,正常进行引用创建') self.driver.find_element(By.XPATH, security_first_app_group_inlist_click_PosXpath).click() self.driver.find_element(By.XPATH, security_create_ok_click_posXpath).click() self.driver.find_element(By.XPATH, security_create_Warn_ok_click_posXpath).click() else: # 不存在就跳过 assert self.driver.Exist == False # 未找到元素 print('未找到Object,无法进行引用创建') pass def _quoted_object_test(self,data:{}): #1.reference count不为空能否删除 self._create(data) self.new_security_policy_appGroup(data) # 调用消除右上提示弹窗 self._goto_subObjectPage() #first_quoted_tunnel_elem_posXpath = '(//*[@class="obj-charts-btn pro-port cursorPointer textCenter" and text() != 0])[1]/parent::div/parent::div/parent::td' #self.driver.find_element(By.XPATH,listPage_select_first_object_posXpath).click() # #todo 改为通过id/name查询? self._search(data) time.sleep(2) self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() del_button_elem = listpage_delete_button_posXpath del_button_elem_clickable = self.objects_po.is_element_clickable(del_button_elem,"ID") print("当前元素是否可点击:{}".format(del_button_elem_clickable)) assert del_button_elem_clickable == False,"删除按钮不可点击" #2.获取到的元素值是否等于1 self.driver.find_element(By.XPATH, listPage_object_APNs_reference_count_posXpath).click()#可以通用 element = self.driver.find_elements(By.XPATH, value=apn_reference_count_list_xpath) num_of_positions = len(element) # 获取该元素的定位列表的值 assert num_of_positions == 1, "校验reference count是否相等" self.objects_po._del_policy(data) self._delete(data) def item_input_frame_reverse_test(self): # 跳转到APN列表页 self._goto_subObjectPage() # Create APN Object self.driver.find_element(By.XPATH, listpage_create_button_posXpath).click()#Create # 1、name不输入内容 2、Name输入123 # item不输入内容的情况 error_length_name1 = " " error_length_name2 = "tt" self.driver.find_element(By.XPATH, appgroup_inputname_xpath).send_keys(error_length_name1) # 不输入名字 # 点击页面其他区域 self.driver.find_element(By.XPATH, appgroup_description_input_xpath).click() # name_error_message = self.driver.find_element(By.XPATH, '//div[@class="app-group-name"]/div[text()="The length of the name is at most 128 characters and cannot be less than 4 characters"]').text # 输入名字长度为0时的提示信息 name_actual_message = 'The length of the name is at most 128 characters and cannot be less than 4 characters' assert name_actual_message == name_error_message.strip() # 校验输入name不足四个字符时的提示信息 self.driver.find_element(By.XPATH, appgroup_inputname_xpath).send_keys(error_length_name2) # # 点击页面其他区域 self.driver.find_element(By.XPATH, appgroup_description_input_xpath).click() # name_error_message = self.driver.find_element(By.XPATH, '//div[@class="app-group-name"]/div[text()="The length of the name is at most 128 characters and cannot be less than 4 characters"]').text # 输入不足四个字符时的提示信息 name_actual_message = 'The length of the name is at most 128 characters and cannot be less than 4 characters' assert name_actual_message == name_error_message.strip() # 校验输入name不足四个字符时的提示 self.driver.find_element(By.XPATH,appgroup_inputname_xpath).send_keys("appgroupTest") # 输入合法长度的名字,不选择application时 self.driver.find_element(By.XPATH,appgroup_ok_button_posXpath).click() # 点击OK input_error_message = self.driver.find_element(By.XPATH,'//div[text()="Subordinate Objects cannot be empty"]').text # input_actual_message = 'Subordinate Objects cannot be empty' assert input_actual_message == input_error_message.strip() # @screenshot_on_failure def _verify_items_total(self, data): self._create(data) # 新建后已经查询了 self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 勾选第一行元素 self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() # 点击edit按钮 # 进入编辑页面 items_total = self.driver.find_element(By.XPATH, appgroup_total_1).text # Total 值 print("items_total0:{}".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,appgroup_total_1).text # Total 值 items_total = items_total.split(":")[1].strip() print("items_total1:{}".format(items_total)) except: pass finally: assert 1 == int(items_total) self.driver.find_element(By.XPATH, mainPage_secondLevelMenu_Application_appGroups_posXpath).click() # 返回acc列表页 # self._query(data) # 查询 self._delete(data) def item_search_verify(self): # 跳转到apn列表页 # 跳转到appgroup列表页 self._goto_subObjectPage() self.random_name = self.my_random.random_name() # 创建appgroup,点击Create self.driver.find_element(By.XPATH, listpage_create_button_posXpath).click() # Create按鈕 self.driver.find_element(By.XPATH, appgroup_inputname_xpath).send_keys("校验编辑页面查询功能") # 输入名字 self.driver.find_element(By.XPATH, application_select_box_xpath).click() # 点击Application选择框 self.driver.find_element(By.XPATH, http_selection_xpath).click() # 选择http # self.driver.find_element(By.XPATH, appgroup_exclude_app_switch_xpath).click() # 点击Exclude App开启框 # self.driver.find_element(By.XPATH, appgroup_exclude_app_selection_xpath).click() # 选择Exclude App # time.sleep(0.5) # self.driver.find_element(By.XPATH, ssl_selection_xpath).click() # 选择ssl self.driver.find_element(By.XPATH, appgroup_item_search_frame).send_keys("http" + Keys.ENTER) find_content1 = self.driver.find_element(By.XPATH, appgroup_first_row_item_in_app).text print(find_content1) assert find_content1 == "http", f"Expected 'http', but got '{find_content1}'" self.objects_po.clear_Name(path=appgroup_item_search_frame) # 清除name self.driver.find_element(By.XPATH, appgroup_item_search_frame).send_keys("1.1" + Keys.ENTER) try: find_content2 = self.driver.find_element(By.XPATH, '//div[@class="app-group-included_sub_object_uuids"]/div').text #此处不能使用之前的元素定位,定位不到 except NoSuchElementException: find_content2 = "null" print("i want is:" + find_content2) assert find_content2 == '', f"Expected '', but got '{find_content2}'" self.driver.find_element(By.XPATH,appgroup_cancel_button_posXpath).click() # Cancel def test_ClearCounter(self,data): """ 测试点: # 列表页 ##单选Object ##多选Object ##多选Object 和Object Group ##单选非本Vsys Object # 详情页 ##Object详情页 ##Object Group详情页 ##非本Vsys的Object详情页 :return: """ # 于data中获取数据 page_flag, selected_object_type, selected_objects_number, detail_type, selected_data_number = data["page_flag"], \ data["selected_object_type"], data["selected_objects"], data["detail_type"], data["selected_data"] print(page_flag, selected_object_type, selected_objects_number, detail_type) obj_data = {"Model": "create", "Type": 1, "Name": "test_ui 4 Clear Counter", "Items": [], "Description": "", "Subordinate Objects": { "subName": "", "subItems": [ "[random]->" ], "subDescription": "" }, } # 判断当前页是否有符合条件的测试数据 create_data_flag = 0 try: self._just_goto_tunnelPage() # 页面跳转 self.driver.implicitly_wait(5) is_firstObjectGroup_exist = self.driver.element_isExist(By.XPATH,acc_listPage_object_tableCheckbox_firstObjectGroup_posXpath) is_firstSingleObject_exist = self.driver.element_isExist(By.XPATH,acc_listPage_object_tableCheckbox_firstSingleObject_posXpath) if is_firstObjectGroup_exist == False or is_firstSingleObject_exist == False: # 创建测试数据 self._create(data=obj_data) create_data_flag = 1 else: firstSingleObject = self.driver.find_element(By.XPATH,acc_listPage_object_tableCheckbox_firstSingleObject_posXpath) firstObjectGroup = self.driver.find_element(By.XPATH, acc_listPage_object_tableCheckbox_firstObjectGroup_posXpath) firstNotLocalVsysObjectOrGroup = self.driver.find_element(By.XPATH,acc_listPage_object_tableCheckbox_firstNotLocalVsys_objectOrGroup_posXpath) if firstSingleObject == firstNotLocalVsysObjectOrGroup or firstObjectGroup == firstNotLocalVsysObjectOrGroup: # 创建测试数据 self._create(data=obj_data) create_data_flag = 1 else: pass except Exception as e: print(e) if page_flag == 0: # 列表页 self._pure_operate_checkbox(selected_object_type, selected_objects_number) # 列表页选择操作 self._verify_clear_counter(page_flag, selected_object_type, selected_objects_number, selected_data_number, detail_type) else: # 详情页 # 判断进入何种类型的Object的详情页 self._judge_whitch_page(detail_type) self._verify_clear_counter(page_flag, selected_object_type, selected_objects_number, selected_data_number, detail_type) # 页面跳转 self.driver.refresh() self._just_goto_tunnelPage() # 清除测试数据 if create_data_flag == 1: # 已新建数据 self._del(obj_data, search_value="test_ui", del_flag=1) elif self.create_other_vsys_data_flag == 1: # 已创建其他Vsys数据 # 切换Vsys至Vsys3 vsys_name = self.loginout_parse.get("vsys3", "vsys_name") # 登录后vsys切换为UIAutoTestVsys profile_pub = ProfilesPublicOperations(self.driver) profile_pub.change_vsys(vsys_name=vsys_name) # # 页面跳转 # self._just_goto_accountsPage() # 清除测试数据 self._del(obj_data, search_value="test_ui", del_flag=1) def _just_goto_tunnelPage(self): self.driver.find_element(By.XPATH, mainPage_firstLevelMenu_Objects_posXpath).click() self.driver.implicitly_wait(2) self.driver.find_element(By.XPATH, mainPage_secondLevelMenu_Application_appGroups_posXpath).click() @screenshot_on_failure def _judge_whitch_page(self, detail_type): """ #判断进入何种类型的Object的详情页 :param detail_type: :return: """ self.create_other_vsys_data_flag = 0 if detail_type == 0: # Object详情页 # 选中第一个Object并进入其详情页 self.driver.find_element(By.XPATH, acc_listPage_object_tableCheckbox_firstSingleObject_posXpath).click() self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() # 点击edit按钮 elif detail_type == 1: # Object Group详情页 # 选中第一个Object Group并进入其详情页 self.driver.find_element(By.XPATH, acc_listPage_object_tableCheckbox_firstObjectGroup_posXpath).click() self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() # 点击edit按钮 else: # etail_type=2--非本Vsys的Object详情页 # 判断当前页有无非本Vsys的对象 is_firstNotLocalVsys_exist = self.driver.element_isExist(By.XPATH, acc_listPage_object_tableCheckbox_firstNotLocalVsys_objectOrGroup_posXpath) try: if is_firstNotLocalVsys_exist == True: pass else: # 创建测试数据 obj_data = {"Model": "create", "Type": 1, "Name": "test_ui 4 Clear Counter", "Items": [], "Description": "", "Subordinate Objects": { "subName": "", "subItems": [ "[random]->" ], "subDescription": "" }, } # 切换Vsys至Vsys3 vsys_name = self.loginout_parse.get("vsys3", "vsys_name") # # profile_pub = ProfilesPublicOperations(driver) self.profile_pub.change_vsys(vsys_name=vsys_name) self._create(data=obj_data) ui_vsys_name = self.loginout_parse.get("vsys", "vsys_name") # 切换为UIAutoTestVsys self.profile_pub.change_vsys(vsys_name=ui_vsys_name) self.create_other_vsys_data_flag = 1 except Exception as e: print(e) # 选中第一个非本Vsys的Object Group或Object并进入其详情页 self.driver.find_element(By.XPATH, acc_listPage_object_tableCheckbox_firstNotLocalVsys_objectOrGroup_posXpath).click() self.driver.find_element(By.XPATH, acc_listPage_editButton_posId).click() # 点击edit按钮 @screenshot_on_failure def _pure_operate_checkbox(self, selected_object_type, selected_objects_number): """ :param selected_object_type: 上层传入, selected items Type=0选中对象, selected items Type=1则选中对象组, selected items Type=2则选中对象和对象组, selected items Type=3则任意非本Vsys的对象", :return: """ self.verify_selected_objects_number0 = 0 self.create_other_vsys_data_flag = 0 if selected_object_type == 0: # 选中对象 object_checkbox_elems = self.driver.find_elements(By.XPATH, acc_listPage_object_tableCheckbox_singleObject_posXpaths) # 定位所有single object对应的CheckBox object_not_local_vsys_checkbox_elems = self.driver.find_elements(By.XPATH, acc_listPage_object_tableCheckbox_notLocalVsys_objectOrGroup_posXpaths) # 列表页中不是本Vsys的对象或对象组的CheckBox # 处理object_checkbox_elems,将不是本Vsys的checkbox元素剔除 local_vsys_object_checkbox_elems = self._operate_webelmet_group(object_checkbox_elems, object_not_local_vsys_checkbox_elems) if selected_objects_number == 0: # 选中个数为0 self.verify_selected_objects_number0 = 1 else: # 选中头selected_objects 个对象 if selected_objects_number == -1: # 选中个数为随机 if len(local_vsys_object_checkbox_elems) == 1: self.random_selected_objects_number = 1 # elif len(local_vsys_object_checkbox_elems) == 0: # selected_objects_number = 1 else: self.random_selected_objects_number = random.randint(1, len(local_vsys_object_checkbox_elems)) selected_objects_number = self.random_selected_objects_number else: # 采用用例中的数值 selected_objects_number = selected_objects_number for i in local_vsys_object_checkbox_elems: if selected_objects_number < 1: break else: i.click() selected_objects_number -= 1 elif selected_object_type == 1: # 1则选中对象组 # 定位对象组 object_group_checkbox_elems = self.driver.find_elements(By.XPATH, acc_listPage_object_tableCheckbox_objectGroup_posXpaths) object_not_local_vsys_checkbox_elems = self.driver.find_elements(By.XPATH, acc_listPage_object_tableCheckbox_notLocalVsys_objectOrGroup_posXpaths) # 列表页中不是本Vsys的对象或对象组的CheckBox # 处理object_checkbox_elems,将不是本Vsys的checkbox元素剔除 local_vsys_object_group_checkbox_elems = self._operate_webelmet_group(object_group_checkbox_elems, object_not_local_vsys_checkbox_elems) if selected_objects_number == 0: # 选中个数为0 self.verify_selected_objects_number0 = 1 # pass else: # 选中头selected_objects 个对象 if selected_objects_number == -1: # 选中个数为随机 self.random_selected_objects_number = random.randint(1, len(local_vsys_object_group_checkbox_elems)) selected_objects_number = self.random_selected_objects_number else: # 选中个数为确切值 if selected_objects_number > len(local_vsys_object_group_checkbox_elems): # 用例中参数大于实际页面展示的数目 selected_objects_number = len(local_vsys_object_group_checkbox_elems) else: # 采用用例中的数值 selected_objects_number = selected_objects_number for i in local_vsys_object_group_checkbox_elems: if selected_objects_number < 1: break else: i.click() selected_objects_number -= 1 elif selected_object_type == 2: # 2则选中对象和对象组 # 定位所有single object对应的CheckBox object_checkbox_elems = self.driver.find_elements(By.XPATH, acc_listPage_object_tableCheckbox_singleObject_posXpaths) # 定位对象组 object_group_checkbox_elems = self.driver.find_elements(By.XPATH, acc_listPage_object_tableCheckbox_objectGroup_posXpaths) object_not_local_vsys_checkbox_elems = self.driver.find_elements(By.XPATH, acc_listPage_object_tableCheckbox_notLocalVsys_objectOrGroup_posXpaths) # 列表页中不是本Vsys的对象或对象组的CheckBox # 处理object_checkbox_elems,将不是本Vsys的checkbox元素剔除 local_vsys_object_checkbox_elems = self._operate_webelmet_group(object_checkbox_elems, object_not_local_vsys_checkbox_elems) local_vsys_object_group_checkbox_elems = self._operate_webelmet_group(object_group_checkbox_elems, object_not_local_vsys_checkbox_elems) if selected_objects_number == 0: # 选中个数为0 # pass self.verify_selected_objects_number0 = 1 else: # 选中头selected_objects 个对象 if selected_objects_number == -1: # 选中个数为随机 self.random_selected_objects_number = random.randint(1, len(local_vsys_object_group_checkbox_elems) + len( local_vsys_object_checkbox_elems)) selected_objects_number = self.random_selected_objects_number else: # 选中个数为确切值 if selected_objects_number > len(local_vsys_object_group_checkbox_elems) + len( local_vsys_object_checkbox_elems): # 用例中参数大于实际页面展示的数目 selected_objects_number = len(local_vsys_object_group_checkbox_elems) + len( local_vsys_object_checkbox_elems) else: # 采用用例中的数值 selected_objects_number = selected_objects_number for i in local_vsys_object_group_checkbox_elems: if selected_objects_number == 1: # 剩余一个,用于勾选单独对象 break else: i.click() print("i.click()") selected_objects_number -= 1 for j in local_vsys_object_checkbox_elems: if selected_objects_number < 1: break else: j.click() print("j.click()") selected_objects_number -= 1 else: # 3则任意非本Vsys的对象 object_not_local_vsys_checkbox_elems = self.driver.find_elements(By.XPATH, acc_listPage_object_tableCheckbox_notLocalVsys_objectOrGroup_posXpaths) # 列表页中不是本Vsys的对象或对象组的CheckBox if len(object_not_local_vsys_checkbox_elems) == 0: # 无则新建测试数据 # 创建测试数据 obj_data = {"Model": "create", "Type": 1, "Name": "test_ui 4 Clear Counter", "Items": [], "Description": "", "Subordinate Objects": { "subName": "", "subItems": [ "[random]->" ], "subDescription": "" }, } # 切换Vsys # 切换Vsys至Vsys3 vsys_name = self.loginout_parse.get("vsys3", "vsys_name") # 登录后vsys切换为UIAutoTestVsys profile_pub = ProfilesPublicOperations(a) profile_pub.change_vsys(vsys_name=vsys_name) self._create(data=obj_data) self.create_other_vsys_data_flag = 1 if selected_objects_number == 0: # 选中个数为0 # pass self.verify_selected_objects_number0 = 1 else: # 选中头selected_objects 个对象 if selected_objects_number == -1: # 选中个数为随机 self.random_selected_objects_number = random.randint(1, len(object_not_local_vsys_checkbox_elems)) selected_objects_number = self.random_selected_objects_number else: # 采用用例中的数值 selected_objects_number = selected_objects_number for i in object_not_local_vsys_checkbox_elems: if selected_objects_number < 1: break else: i.click() selected_objects_number -= 1 def _verify_clear_counter(self, page_flag, selected_object_type, selected_objects_number, selected_data_number, detail_type): """ page_flag =0时默认已勾选元素,page_flag =1默认已进入Object 详情页 :param page_flag: :return: """ if page_flag == 0: # 列表页操作与验证 if selected_object_type != 3: # 不是选择非本Vsys的数据 # 点击Clear Counter按钮 self.driver.find_element(By.XPATH, listPage_object_pages_clearCounter_button_poxXpath).click() if self.verify_selected_objects_number0 == 1: # 未选择任何数据 error_message_elem_isExist = self.driver.element_isExist(By.XPATH, '//div[@role="alert" and contains(@class,"el-message el-message--error")]') assert error_message_elem_isExist == True, "校验失败!无错误提示" else: # 处理二次确认弹窗 clickable_flag = self._select_objects_secondSelect(selected_objects_number, selected_data_number) if clickable_flag == 1: # 确认弹窗中的确认按钮可点击 try: is_disabled = self.driver.find_element(By.XPATH, acc_listPage_object_clearCounterPopYes_posXpath).get_attribute( "disabled") except: is_disabled = None pass assert is_disabled == None, "校验失败!此时按钮不可点击" else: # 确认弹窗中的确认按钮不可点击 try: is_disabled = self.driver.find_element(By.XPATH, acc_listPage_object_clearCounterPopYes_posXpath).get_attribute( "disabled") except: is_disabled = None pass assert is_disabled == 'disabled', "校验失败!此时按钮可点击" else: # 校验非本Vsys的数据 # is_clear_counter_clickable = self.objects_po.is_element_clickable( # listPage_object_pages_clearCounter_button_poxXpath, "XPATH") is_clear_counter_clickable = self.driver.find_element(By.XPATH, listPage_object_pages_clearCounter_button_poxXpath).get_attribute( "class") assert "notAllowed" in is_clear_counter_clickable, "is_clear_counter_clickable ={}".format( is_clear_counter_clickable) else: # page_flag =1: #详情页操作与验证 # Clear Counter按钮 is_clear_counter_clickable = self.driver.find_element(By.XPATH, acc_ObjectDetailPage_clearCounter_posXpath).get_attribute( "class") if detail_type != 2: # 不是非本Vsys的详情页 assert "not-allowed" not in is_clear_counter_clickable, "is_clear_counter_clickable = {}".format( is_clear_counter_clickable) else: # 非本Vsys的详情页 assert "not-allowed" in is_clear_counter_clickable, "is_clear_counter_clickable = {}".format( is_clear_counter_clickable) @screenshot_on_failure def _select_objects_secondSelect(self, selected_objects_number, selected_data_number): """ 处理列表页选择的二次确认弹窗 :param selected_data_number: 二次弹窗中要选择的数目 :param selected_object_type: 选择的类型 :return: """ # 处理二次确认弹窗 self.driver.find_element(By.XPATH, acc_listPage_object_exportPopSelectAll_posXpath).click() # 点击全选按钮,取消默认全选 data_checkbox_elems = self.driver.find_elements(By.XPATH, acc_listPage_object_exportPopCheckbox_posXpaths) # 导出弹窗数据CheckBox if selected_data_number != 0: if selected_data_number > 0: selected_data_number = selected_data_number elif selected_data_number == -1: # 随机数值 selected_data_number = random.randint(1, self.random_selected_objects_number) clickable_flag = 1 for i in data_checkbox_elems: if selected_data_number < 1: break else: i.click() selected_data_number -= 1 else: # selected_data_number = 0确认弹窗中不选择数据 clickable_flag = 0 return clickable_flag def _operate_webelmet_group(self, group1, group2): """ 处理WebElemet Group(将1中的2元素排除掉) :param group1: :param group2: :return: """ # 将group 转换为set 便于排除处理 set_group1 = set(group1) set_group2 = set(group2) # 使用集合差集来排除 elements_group2 中的元素 filtered_set = set_group1 - set_group2 # 将结果转换回列表 filtered_elements = list(filtered_set) return filtered_elements @screenshot_on_failure def _View_statistics_case(self, data): self._create(data) self.View_statistics(edit_element=listpage_edit_button_posXpath) self._delete(data) @screenshot_on_failure def View_statistics(self, edit_element): # 主界面View验证 self.driver.find_element(By.XPATH, '(//button[text()="View"])[1]').click() self.driver.isElementExist(Element="(//div[@class='ObjectStatisticSlider'])[1]") assert self.driver.Exist, "Statistics界面打开" self.driver.find_element(By.XPATH, "(//div[@class='ObjectStatisticSlider']//span[text()='Cancel'])[2]").click() # 详情界面Statistics验证 self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() self.driver.find_element(By.XPATH, edit_element).click() self.driver.find_element(By.XPATH, "//div[@class='paper-grid-right']//span[text()='Statistics']").click() self.driver.isElementExist(Element="(//div[@class='ObjectStatisticSlider'])[1]") assert self.driver.Exist, "Statistics界面打开" @screenshot_on_failure def check_link_case(self, data, link_list_dict): # link简单link校验测试 """ :param data: link_list_dict=[{"link_dst_cluster": "42.49-User4Link", "link_dst_vsys":"Vsys2test", "url": "http://192.168.42.49/#/login","username": "admin","passwd": "admin"}]) :param link_list_dict: :return: """ self._goto_subObjectPage() self._create(data) time.sleep(2) self.first_row_checkBox_element = self.driver.find_element(By.XPATH, "//div[@class='el-checkbox-group']//span[@class='el-checkbox__input']").click() # 勾选第一行元素 # 调用公共的link创建逻辑 Des_ID_list, Request_ID = self.objects_po.linkdata(link_list_dict, app_group_listpage_linkButton_posId, app_group_listpage_linkSave_posXpath, app_group_listpage_linkAdd_posXpath, app_group_listpage_linkOk_posXpath) profile_public = ProfilesPublicOperations(self.driver) profile_public.change_vsys(vsys_name="UIAutoTestVsys") self.driver.find_element(By.XPATH, mainPage_firstLevelMenu_Objects_posXpath).click() # 修改数据 sou_value = self._modify(data) # 调用公用的sync点击逻辑 Request_ID = self.objects_po.click_sync(Request_ID) time.sleep(3) # 删除其它目标link数据 Request_ID, compare_list = self._del_linkDstData(Des_ID_list, Request_ID, link_list_dict,data) # 删除policy links记录 self.objects_po._del_policy_links(Request_ID) # 删除源vsys数据 self._delete_sou(sou_value) # 列表去重 compare_list.append(sou_value) print(compare_list) res = [] for i in compare_list: if i not in res: res.append(i) assert len(res) == 1 @screenshot_on_failure def _del_linkDstData(self, Des_ID_list, Request_ID, link_list_dict,data): loginout = LogInOut(self.driver) loginout.logout() time.sleep(2) compare_list = [] for link_index in range(len(link_list_dict)): loginout.login_other(url=link_list_dict[link_index]["url"], username=link_list_dict[link_index]["username"], passwd=link_list_dict[link_index]["passwd"]) profile_public = ProfilesPublicOperations(self.driver) profile_public.change_vsys(vsys_name=link_list_dict[link_index]["link_dst_vsys"]) self._goto_subObjectPage() # 搜索目的vsys数据 self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() # 选中查询框 self.driver.find_element(By.XPATH, listPage_objectSearch_app_group_select_Id_posXpath).click() # 选中ID self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(Des_ID_list[0]) # 输入ID self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() # 查询按钮 time.sleep(2) # 获取sync后的值 des_value = self.driver.find_element(By.XPATH, '(//div[@data-field="name"])[1]').text compare_list.append(des_value) # 在目的vsys中修改 self.driver.find_element(By.XPATH,listPage_select_first_object_posXpath).click() # 第一行数据前的复选框 self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() # edit按钮 time.sleep(3) self.objects_po.clear_Name(path=appgroup_description_input_xpath) # 清除description self.driver.find_element(By.XPATH, appgroup_inputname_xpath).send_keys("abcde") # 重新输入name self.driver.find_element(By.XPATH, appgroup_ok_button_posXpath).click() # self.driver.find_element(By.XPATH, appgroup_confirm_ok_button_xpath).click() # 调用公用的sync点击逻辑 Request_ID = self.objects_po.click_sync(Request_ID) if data["cluster_id"] == 2: loginout.login_other(url=link_list_dict[link_index]["url"], username=link_list_dict[link_index]["username"], passwd=link_list_dict[link_index]["passwd"]) profile_public = ProfilesPublicOperations(self.driver) profile_public.change_vsys(vsys_name=link_list_dict[link_index]["link_dst_vsys"]) else: profile_public = ProfilesPublicOperations(self.driver) profile_public.change_vsys(vsys_name=link_list_dict[link_index]["link_dst_vsys"]) self._goto_subObjectPage() # 搜索目的vsys数据 self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() # 选中查询框 self.driver.find_element(By.XPATH, listPage_objectSearch_app_group_select_Id_posXpath).click() # 选中ID self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(Des_ID_list[0]) # 输入ID self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() # 查询按钮 time.sleep(2) # 再次获取sync后的值 second_des_value = self.driver.find_element(By.XPATH, "//div[contains(@class,'el-table__body-wrapper')]//tr[1]//td[count(//div[@class='el-table__header-wrapper']//span[text()='Name']/../../../preceding-sibling::th)+1]//div[@class='el-tooltip white-space table-hide item']").text compare_list.append(second_des_value) self._goto_subObjectPage() self._delete_des(Des_ID_list) # 删除数据 time.sleep(3) # # 退出账号 # loginout.logout() # time.sleep(1) # # 再次登录源tsg,测试退出使用 # loginout.login() return Request_ID, compare_list def _delete_des(self, Des_ID_list): self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() # 选中查询框 self.driver.find_element(By.XPATH, listPage_objectSearch_app_group_select_Id_posXpath).click() # 选中ID self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(Des_ID_list[0]) # 输入ID self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() # 查询按钮 time.sleep(2) self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 选择第一个对象 self.driver.find_element(By.XPATH, listpage_delete_button_posXpath).click() # del self.driver.find_element(By.XPATH, listpage_delete_yes_button_posXpath).click() # del yes time.sleep(3) def _delete_sou(self, sou_value): loginout = LogInOut(self.driver) loginout.logout() time.sleep(1) loginout.login_other(url="http://192.168.44.72/#/login", username="linktest", passwd="linktest123") # 删除数据 profile_public = ProfilesPublicOperations(self.driver) profile_public.change_vsys(vsys_name="UIAutoTestVsys") self._goto_subObjectPage() self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() # 选中查询框 self.driver.find_element(By.XPATH, listPage_objectSearch_select_Name_posXpath).click() # 选中Name self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(sou_value) # 输入Name self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() # 查询按钮 time.sleep(2) self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 选择第一个对象 self.driver.find_element(By.XPATH, listpage_delete_button_posXpath).click() # del self.driver.find_element(By.XPATH, listpage_delete_yes_button_posXpath).click() # del yes @screenshot_on_failure def link_many_objects(self, data, link_list_dict): # link简单link校验测试 """ :param data: link_list_dict=[{"link_dst_cluster": "42.49-User4Link", "link_dst_vsys":"Vsys2test", "url": "http://192.168.42.49/#/login","username": "admin","passwd": "admin"}]) :param link_list_dict: :return: """ self._goto_subObjectPage() for i in range(0, 3): self._create(data) time.sleep(3) # 搜索创建的数据 self._goto_subObjectPage() self._search(data) time.sleep(1) self.first_row_checkBox_element = self.driver.find_elements(By.XPATH, "//div[@class='el-checkbox-group']//span[@class='el-checkbox__input']") print(self.first_row_checkBox_element) sou_deatils_list = self.driver.find_elements(By.XPATH, "//div[contains(@class,'el-table__body-wrapper')]//tr[1]//td[count(//div[@class='el-table__header-wrapper']//span[text()='Applications']/../../../preceding-sibling::th)+1]//span//span[@class='list-popover-click']") print(sou_deatils_list) sou_result = [] for detail in sou_deatils_list: time.sleep(1) sou_result.append(detail.text) print(sou_result) # 全部选中 for checkbox in self.first_row_checkBox_element: checkbox.click() time.sleep(1) time.sleep(1) # 调用公共的link创建逻辑 Sou_ID_list, Des_ID_list = self.objects_po.only_linkdata(link_list_dict, app_group_listpage_linkButton_posId, app_group_listpage_linkSave_posXpath, app_group_listpage_linkAdd_posXpath, app_group_listpage_linkOk_posXpath) profile_pub = ProfilesPublicOperations(self.driver) profile_pub.change_vsys(vsys_name="UIAutoTestVsys") self._goto_subObjectPage() # 删除源vsys数据 time.sleep(3) self._only_del_linkSouData(Sou_ID_list) # 删除其它目标link数据逻辑 des_result = self._only_del_linkDstData(link_list_dict, Des_ID_list, data) assert des_result == sou_result @screenshot_on_failure def _only_del_linkDstData(self, link_list_dict, Des_ID_list, data): loginout = LogInOut(self.driver) loginout.logout() time.sleep(2) for link_index in range(len(link_list_dict)): loginout.login_other(url=link_list_dict[link_index]["url"], username=link_list_dict[link_index]["username"], passwd=link_list_dict[link_index]["passwd"]) profile_public = ProfilesPublicOperations(self.driver) profile_public.change_vsys(vsys_name=link_list_dict[link_index]["link_dst_vsys"]) self._goto_subObjectPage() self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() # 选中查询框 self.driver.find_element(By.XPATH, listPage_objectSearch_select_Name_posXpath).click() # 选中Name self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(data["Name"]) # 输入Name self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() time.sleep(2) des_deatils_list = self.driver.find_elements(By.XPATH, "//div[contains(@class,'el-table__body-wrapper')]//tr[1]//td[count(//div[@class='el-table__header-wrapper']//span[text()='Applications']/../../../preceding-sibling::th)+1]//span//span[@class='list-popover-click']") des_result = [] for detail in des_deatils_list: des_result.append(detail.text) print(des_result) self._goto_subObjectPage() for id in Des_ID_list[:3]: self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() self.driver.find_element(By.XPATH, listPage_objectSearch_app_group_select_Id_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(id) self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() self.driver.find_element(By.XPATH, listPage_first_row_checkBox_posXpath).click() # 选择第一个对象 # 确认删除 self.driver.find_element(By.XPATH, listpage_delete_button_posXpath ).click() self.driver.find_element(By.XPATH, listPage_object_Keywords_del_yes_Button_posXpath).click() self._goto_subObjectPage() return des_result def _only_del_linkSouData(self, Sou_ID_list): self._goto_subObjectPage() for id in Sou_ID_list[:3]: self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() self.driver.find_element(By.XPATH, listPage_objectSearch_app_group_select_Id_posXpath).click() self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(id) self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() self.driver.find_element(By.XPATH, listPage_first_row_checkBox_posXpath).click() # 选择第一个对象 # 确认删除 self.driver.find_element(By.XPATH, listpage_delete_button_posXpath ).click() self.driver.find_element(By.XPATH, listPage_object_Keywords_del_yes_Button_posXpath).click() self._goto_subObjectPage() def verify_search(self, data): self._create(data) self._search(data) total = self.driver.find_element(By.XPATH, "//span[contains(text(),'Total')]").text count = total.split("Total:") if int(count[1]) != 1: raise AssertionError("搜索结果错误,请查看") self._delete(data) def group_object_include(self,data): self._goto_subObjectPage() self.driver.find_element(By.XPATH, listpage_create_button_posXpath).click() self.driver.find_element(By.XPATH, appgroup_description_input_xpath).send_keys(self.my_random.random_name()) self.driver.find_element(By.XPATH, appgroup_inputname_xpath).send_keys(data["Name"]) if data["subtype"] == "0": self.driver.find_element(By.XPATH, application_select_box_xpath).click() # 添加sub_Object self.driver.find_element(By.XPATH,appgroup_object_group_subobject_fist_posXpath).click() self.driver.find_element(By.XPATH,appgroup_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, appgroup_ok_button_posXpath).click() # assert self.driver.find_element(By.XPATH,'//div[text()="Subordinate Objects cannot be empty"]').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_app_group_exclude_add_button_posXpath).click() self.driver.find_element(By.XPATH,appgroup_object_group_subobject_fist_posXpath).click() self.driver.find_element(By.XPATH,appgroup_object_group_subobject_close_posXpath).click() self.driver.find_element(By.XPATH, appgroup_ok_button_posXpath).click() assert self.driver.find_element(By.XPATH,'//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, appgroup_ok_button_posXpath).click() assert self.driver.find_element(By.XPATH,'//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, application_select_box_xpath).click() # 添加sub_Object self.driver.find_element(By.XPATH, appgroup_object_group_subobject_fist_posXpath).click() self.driver.find_element(By.XPATH, appgroup_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_app_group_exclude_add_button_posXpath).click() time.sleep(1) self.driver.find_element(By.XPATH, appgroup_object_group_subobject_second_posXpath).click() self.driver.find_element(By.XPATH, appgroup_object_group_subobject_close_posXpath).click() self.driver.find_element(By.XPATH, appgroup_ok_button_posXpath).click() # 点击OK # self.driver.find_element(By.XPATH, appgroup_confirm_ok_button_xpath).click() # 点击confirm ok self._goto_subObjectPage() self.driver.find_element(By.XPATH, listpage_search_box_posXpath).click() # 选中查询框 self.driver.find_element(By.XPATH, listpage_search_input_posXpath).send_keys(data["Name"]) # 输入Name self.driver.find_element(By.XPATH, listPage_objectSearch_select_Name_posXpath).click() # 选中Name self.driver.find_element(By.XPATH, listpage_search_button_posXpath).click() time.sleep(2) assert self.driver.find_element(By.XPATH, main_listPage_object_total_value_posXpath).text == "Total: 1", "total数目不符" self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() # 选择第一个对象 self.driver.find_element(By.XPATH, listpage_delete_button_posXpath).click() # del self.driver.find_element(By.XPATH, listpage_delete_yes_button_posXpath).click() # del yes def different_vsys_check(self,data): self._create(data) self.uiAutoTestVsys_object = dict(self.objects_po.table_dict1) # 切换Vsys至Vsys0 self.profile_pub.change_vsys(vsys_name="vsys0") self._create(data) self.vsys0_object = dict(self.objects_po.table_dict1) self._search(data) self.view_check("vsys0") self.profile_pub.change_vsys(vsys_name="PerformanceTestVsys") self._search(data) self.view_check("PerformanceTestVsys") self.profile_pub.change_vsys(vsys_name="UIAutoTestVsys") self._search(data) self.view_check("UIAutoTestVsys") self.profile_pub.change_vsys(vsys_name="vsys0") self._delete(data) def view_check(self, vsys_name): time.sleep(1) total = self.driver.find_element(By.XPATH, "//div[@class='page-box-containcheck']//span[contains(text(),'Total')]").text count = total.split("Total:") if vsys_name == "PerformanceTestVsys": # vsys3中仅可查看Vsys0中的数据,而无Vsys10的数据 assert int(count[1]) == 1 assert self.driver.find_element(By.XPATH, listPage_First_app_group_object_ID_posXpath).text == self.vsys0_object["ID"] elif vsys_name == "vsys0": # Vsys0中可查看Vsys0中的数据,与Vsys10的数据 assert int(count[1]) == 2 assert self.driver.find_element(By.XPATH, listPage_First_app_group_object_ID_posXpath).text == self.vsys0_object["ID"] assert self.driver.find_element(By.XPATH, listPage_Second_app_group_object_ID_posXpath).text == self.uiAutoTestVsys_object["ID"] self.driver.find_element(By.XPATH, listPage_second_row_checkBox_posXpat).click() # 选择第二行的checkbox(vsys10中创建的数据) self.driver.find_element(By.XPATH, listPage_viewButton_posXpath).click() # 点击View按钮 # 校验Vsys0下查看Vsys10的数据 assert len(self.driver.find_elements(By.XPATH, '//div[contains(@class,"IconBtn") and contains(@class," disabled-btn")]')) >= 3 is_ok_exist = self.driver.element_isExist(By.XPATH, ObjectDetailPage_mainOkButton_poXpath) assert is_ok_exist == False self.driver.find_element(By.XPATH, ObjectDetailPage_mainCancelButton_poXpath).click() # 点击Cancel 按钮 elif vsys_name == "UIAutoTestVsys": # Vsys10中可查看Vsys0中的数据,与Vsys10的数据 try: assert int(count[1]) == 2 assert self.driver.find_element(By.XPATH, listPage_First_app_group_object_ID_posXpath).text == self.vsys0_object["ID"] assert self.driver.find_element(By.XPATH, listPage_Second_app_group_object_ID_posXpath).text == self.uiAutoTestVsys_object["ID"] self.driver.find_element(By.XPATH, listPage_first_row_checkBox_posXpath).click() # 选择第一行的checkbox(vsys0中创建的数据) self.driver.find_element(By.XPATH, listPage_viewButton_posXpath).click() # 点击View按钮 add_item_disable = self.driver.element_isExist(by=By.XPATH, value='//div[contains(@class,"IconBtn") and contains(@class," disabled-btn")]') del_item_disable = self.driver.element_isExist(by=By.XPATH, value='//div[contains(@class,"IconBtn") and contains(@class," disabled-btn")][1]') assert add_item_disable == del_item_disable == True self.driver.isElementExist(ObjectDetailPage_mainOkButton_poXpath) assert self.driver.Exist == False except Exception as e: raise e finally: # 清理Vsys10中的测试数据 self.driver.find_element(By.XPATH, ObjectDetailPage_mainCancelButton_poXpath).click() # 点击Cancel 按钮返回列表页 self.driver.find_element(By.XPATH, listPage_second_row_checkBox_posXpat).click() # 选择第二行的checkbox(vsys10中创建的数据) self.driver.find_element(By.XPATH, listPage_deleteButton_posXpath).click() # 点击Delete按钮 self.driver.find_element(By.XPATH, listPage_object_FQDNs_del_yes_Button_posXpath).click() # 删除确认弹窗中确认 def _sub_objects_drawer_search(self, data): self._create(data) self._search(data) time.sleep(1) self.random_number = self.my_random.random_number() search_value = self.random_number # 进入drawer_search页面 ##勾选 self.driver.find_element(By.XPATH, listPage_select_first_object_posXpath).click() ##点击编辑按钮 self.driver.find_element(By.XPATH, listpage_edit_button_posXpath).click() ##点击 add button展开drawer_search self.driver.find_element(By.XPATH, '//i[@class="iconfont icon-Create1 text-[18px] font-[700] text-[--color-primary] cursor-pointer"]').click() # drawer_search 校验 try: # 首先进行错误搜索校验 self.driver.find_element(By.XPATH, groupObjectDetailPage_addSubObjecDrawer_searchInput_posXpath).send_keys( self.my_random.random_number() + Keys.ENTER) time.sleep(2) print(self.driver.find_element(By.XPATH, groupObjectDetailPage_addSubObjecDrawer_totalText_posXpath).text) assert self.driver.find_element(By.XPATH, groupObjectDetailPage_addSubObjecDrawer_totalText_posXpath).text == "Total:0" # 正确校验 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["Search_subordinate_value"]+Keys.ENTER) # resulte_text = self.driver.find_element(By.XPATH,"//div[@class='IpItems list-box']//ul[@class='row-container tableList']/li[1]/div").text # 等待查询结果加载 time.sleep(3) total_text = self.driver.find_element(By.XPATH, groupObjectDetailPage_addSubObjecDrawer_totalText_posXpath).text assert total_text == "Total:9", "搜索结果错误,此时获取到的文本为{}".format(total_text) # self.driver.find_element(By.XPATH,"//div[@class='IpItems list-box']//span[normalize-space(text())='Close']").click() # 关闭侧滑框 self.driver.find_element(By.XPATH, '//i[@class="iconfont icon-Clear_aNormal close-icon"]').click() # 对Subordinate Objects校验 # 输入错误条件 self.driver.find_element(By.XPATH, appgroupObjectDetailPage_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="app-group-included_sub_object_uuids"]//i[@class="iconfont icon-Delete_X text-[16px] mt-[-1px]"]').click() self.driver.find_element(By.XPATH, appgroupObjectDetailPage_subordinateObjects_search_posXpath).send_keys( data["Search_subordinate_value"] + 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 self.driver.find_element(By.XPATH,'//div[@class="app-group-included_sub_object_uuids"]//span[@class="truncate"]').text == data["Search_subordinate_value"] # 对Exclude Objects校验 # 输入错误条件 self.driver.find_element(By.XPATH, appgroupObjectDetailPage_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, '//div[@class="app-group-excluded_sub_object_uuids"]//i[@class="iconfont icon-Delete_X text-[16px] mt-[-1px]"]') self.driver.find_element(By.XPATH, appgroupObjectDetailPage_excludeObjects_search_posXpath).send_keys( data["Search_exclude_value"] + Keys.ENTER) assert self.driver.find_element(By.XPATH, '//div[@class="app-group-excluded_sub_object_uuids"]//span[@class="truncate"]').text == data["Search_exclude_value"] except Exception as e: raise e finally: self._goto_subObjectPage() self._delete(data) def mainPage_item_search(self, data): self._create(data) self._search(data) time.sleep(0.5) search_value = data["Search_value"] self.driver.find_element(By.XPATH,'(//div[@class="MuiDataGrid-virtualScrollerRenderZone css-1inm7gi"]//div[@data-field="include_sub_object_list"])[1]').click() self.driver.find_element(By.XPATH, listPage_item_search_text_posXpath).click() #首先进行错误搜索校验 self.driver.find_element(By.XPATH,listPage_item_search_text_posXpath).send_keys(self.my_random.random_number() + Keys.ENTER) assert self.driver.find_element(By.XPATH,listPage_item_search_total_text_posXpath).text == "Total:0" #正确校验 self.driver.find_element(By.XPATH,listPage_item_search_text_posXpath).clear() self.driver.find_element(By.XPATH, listPage_item_search_text_posXpath).send_keys(search_value + Keys.ENTER) # resulte_text = self.driver.find_element(By.XPATH,"//div[@class='IpItems list-box']//ul[@class='row-container tableList']/li[1]/div").text assert self.driver.find_element(By.XPATH,listPage_item_search_total_text_posXpath).text == "Total:1", "搜索结果错误" # self.driver.find_element(By.XPATH,"//div[@class='IpItems list-box']//span[normalize-space(text())='Close']").click() self._delete(data) def audit_log_all_operation(self,data): self._create(data) self._modify(data) self._delete(data) self.objects_po.audit_log_view("Application Object",import_verify=0,export_verify=0) def fuzzy_search(self, data): self._create(data) self._goto_subObjectPage() self._search(data) self._goto_subObjectPage() self._delete(data) def policy_reference_count_check(self, data): self.driver.implicitly_wait(10) policy_rule = ["Security", "Monitor", "Statistics", "DoS Protection", "Shaping", "Service Chaining"] policy_rule_element = { "Security": "Objects_ProxyInterception", "Monitor": "policy_monitor", "Statistics": "policy_statistics", "DoS Protection": "policy_DoSProtection", "Shaping": "policy_trafficShaping", "Service Chaining": "policy_ServiceChaining" } self._create(data) for rule in policy_rule: self.policy_create("applications", rule, policy_rule_element[rule]) self._goto_subObjectPage() self._search(data) self.driver.find_element(By.XPATH, "//div[@class='obj-charts-btn pro-port cursorPointer textCenter']").click() self.driver.find_element(By.XPATH, "//div[@class='box-content']/div").click() self.driver.find_element(By.XPATH, "//button[@id='objectEdit_slider']").click() self.driver.isElementExist("//i[@class='operate-icon row-edit iconfont icon-Create1']") assert self.driver.Exist, "Rule不可编辑" self.objects_po.policy_delete(policy_rule_element[rule]) self._goto_subObjectPage() self._delete(data) def policy_create(self, object_type, rule, rule_element): self.driver.implicitly_wait(5) try: self.driver.find_element(By.XPATH, rule_element).click() except: self.driver.find_element(By.XPATH, "//span[text()='Policies']").click() self.driver.find_element(By.XPATH, rule_element).click() self.driver.find_element(By.XPATH, "//div[@class='OperateBtns operation']//p[normalize-space(text())='Create']").click() self.driver.find_element(By.XPATH, "//div[@zs-label='Name']//input").send_keys("test_policy") self.get_policy_conditions() if rule == "Statistics": self.driver.find_element(By.XPATH, statistics_policy_template_add_button_posXpath).click() time.sleep(2) self.driver.find_element(By.XPATH, statistics_policy_template_first_template_posXpath).click() # self.driver.execute_script("arguments[0].click()", first_statistics_template) # self.driver.find_element(By.XPATH,"//div[@class='FlagList list-box']//span[normalize-space(text())='Close']").click() elif rule == "DoS Protection": self.driver.find_element(By.XPATH, "//label[text()='Request Per Period']//parent::*//input").send_keys( random.randint(1, 10000)) elif rule == "Shaping": self.driver.find_element(By.XPATH, shaping_policy_profile_add_button_posXpath).click() self.driver.find_element(By.XPATH, shaping_policy_profile_first).click() # self.driver.find_element(By.XPATH,"//div[@class='SFFList list-box']//span[normalize-space(text())='Close']").click() elif rule == "Service Chaining": self.driver.find_element(By.XPATH, service_chaining_policy_ssf_add_button_posID).click() self.driver.find_element(By.XPATH, service_chaining_policy_ssf_first).click() # self.driver.find_element(By.XPATH,"//div[@class='SFFList list-box']//span[normalize-space(text())='Close']").click() self.driver.find_element(By.XPATH, "//div[@zs-label='Enabled']//div[@role='switch']").click() self.driver.find_element(By.XPATH, "//button[@type='button']//span[normalize-space(text())='OK']").click() self.driver.find_element(By.XPATH, "//div[@class='el-message-box tsg-message el-message-box--center']//span[normalize-space(text())='Yes']").click() def get_policy_conditions(self): self.driver.find_element(By.XPATH, policy_button_add_application_posXpath).click() time.sleep(1) self.driver.find_element(By.XPATH, '//*[@id="tab-group"]').click() time.sleep(1) self.driver.find_element(By.XPATH, "//div[contains(@class,'CommonListDetail list-detail')]//input[@id='object_ip_search']").send_keys( self.objects_po.table_dict1["Name"] + Keys.ENTER) time.sleep(1) self.driver.find_element(By.XPATH, '(//*[@id="router-view-container"]//div[@class="reference-box el-popover__reference"]/div)[1]').click() create=_create query = _search delete = _delete if __name__ == '__main__': # driver2 chrome_option = webdriver.ChromeOptions() driver = MyWebDriver( # command_executor="http://192.168.64.11:4444", command_executor="http://192.168.39.89:4444", options=chrome_option ) a = AppGroup(demo_fixture=driver) # driver.implicitly_wait(5) driver.get("http://192.168.45.158") # driver.get("http://192.168.42.49") driver.maximize_window() # driver.find_element(By.NAME, 'username').send_keys("Gary") # driver.find_element(By.NAME, 'password').send_keys("4garyautoui") driver.find_element(By.XPATH, '//input[@placeholder="User name"]').send_keys("admin") driver.find_element(By.XPATH, '//input[@placeholder="Password"]').send_keys("admin") # driver.find_element(By.NAME, 'username').send_keys("User4Link") # driver.find_element(By.NAME, 'password').send_keys("User4Link") driver.find_element(By.XPATH, '//button[@class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeLarge MuiButton-containedSizeLarge MuiButton-colorPrimary MuiButton-root MuiLoadingButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeLarge MuiButton-containedSizeLarge MuiButton-colorPrimary !bg-[#4487d4] css-zeizzp"]').click() # 切换Vsys # profile_pub = ProfilesPublicOperations(driver) # profile_pub.change_vsys(vsys_name='UIAutoTestVsys') # profile_pub.change_vsys(vsys_name="Vsys2test") a.fuzzy_search(data= { "ids": "Name模糊搜索", "CreatType": "AppGroup", "Search_type": "fuzzy->Name", "Name": "test_fuzzy_name", "type": "Not", },) time.sleep(3) driver.quit()