# -*- coding: UTF-8 -*- import random import time from selenium.common.exceptions import NoSuchElementException from common.driver_common.mywebdriver import MyWebDriver from selenium.webdriver.common.by import By from config.workpath import workdir from page_element.policies_element_position import * from page_element.profiles_element_position import * from common.driver_common.screenshot import screenshot_on_failure from common.driver_common.random_name import RandomName from common.ui_common.profiles.profiles_public_operations import ProfilesPublicOperations import pytest_check import inspect import configparser import os from common.ui_common.login_logout.loginout import LogInOut from selenium import webdriver import copy from selenium.webdriver.common.keys import Keys import datetime class TcpProxyProfiles: def __init__(self, demo_fixture: MyWebDriver): self.workdir = workdir self.my_random = RandomName() self.driver = demo_fixture # 调用profiles公共方法操作、删除、查询, self.profiles_po = ProfilesPublicOperations(self.driver) try: if self.driver.element_isExist(By.XPATH, '//*[@class="iconfont icon-Delete_X"]'): element = self.driver.find_element(By.XPATH, '//*[@class="iconfont icon-Delete_X"]') element.click() except NoSuchElementException: pass def tcp_proxy_profiles_case(self, data:{}): self._create(data) # 创建 time.sleep(3) self._query(data, require_assertion=1, Name=self.random_name) # 创建后查询 time.sleep(1) if data["model"].strip().lower() == "modify": # 修改测试时,执行修改方法 self._modify(data) time.sleep(2) self._query(data, require_assertion=2, Name=self.random_name) self._del() @screenshot_on_failure def _goto_subProfilePage(self, vsys_name_2=""): # 菜单操作,定位到tcp_proxy_profiles列表页 self.driver.find_element(By.XPATH, mainpage_navigation_bar_logo_posxpath).click() self.profiles_po.change_vsys(vsys_name=vsys_name_2) self.driver.find_element(By.XPATH, mainpage_first_level_menu_profiles_posxpath).click() self.driver.find_element(By.XPATH, mainpage_second_level_menu_tcp_proxy_profiles_posxpath).click() def _goto_vsysPage(self, vsys_name_2=""): # 菜单操作,定位到不同的vsys self.profiles_po.change_vsys(vsys_name=vsys_name_2) @screenshot_on_failure def _create(self, data: {}, *source_name): #页面跳转 self._goto_subProfilePage() #创建 #点击create self.driver.find_element(By.XPATH, listpage_profile_tcp_proxy_profiles_create_button_posxpath).click() #在create 创建页面操作 # 页面其它选项操作 self._operate_page(data, operation_type="create") # Name if source_name: self.random_name = source_name[0] self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_name_posxpath).send_keys(self.random_name) else: self.random_name = self.my_random.random_name() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_name_posxpath).send_keys(self.random_name) self.driver.find_element(By.XPATH, "//label[text()='Name']") #点击OK self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_ok_posxpath).click() if self.driver.element_isExist(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss): if self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).is_displayed(): print(1) self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() elif int(data["c_ttl"].split("->")[0].strip()) == 0 or int(data["c_userTimeout"].split("->")[0].strip()) == 0: print("ttl=0") # 点击OK self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_ok_posxpath).click() pytest_check.equal( self.driver.find_element(By.XPATH, "//p[@class='el-message__content']").text.strip(), "Client-side Parameters cannot be empty", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() elif int(data["s_ttl"].split("->")[0].strip()) == 0 or int(data["s_userTimeout"].split("->")[0].strip()) == 0: print("s_ttl=0") pytest_check.equal( self.driver.find_element(By.XPATH, "//p[@class='el-message__content']").text.strip(), "Server-side Parameters cannot be empty", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() elif len(self.random_name) < 4: # name不符合要求 print("name") if self.driver.element_isExist(By.XPATH, "//label[text()='Name']/parent::div//div[@class='el-form-item__error']"): print("The length of the name is at most 128 characters and cannot be less than 4 characters") pytest_check.equal( self.driver.find_element(By.XPATH, "//div[@class='el-form-item__error']").text.strip(), "The length of the name is at most 128 characters and cannot be less than 4 characters", msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: print("name less than 4,no error message") # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() elif int(data["c_ttl"].split("->")[0].strip()) < 1 or int(data["c_ttl"].split("->")[0].strip()) > 255 or int(data["s_ttl"].split("->")[0].strip()) < 1 or int(data["s_ttl"].split("->")[0].strip()) > 255: print("ttl test") error_content = self.driver.find_element(By.XPATH, "//label[text()='TTL']/parent::div//div[@class='el-form-item__error']").text.strip() pytest_check.equal(error_content, "The TTL range:1-255", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() elif int(data["c_userTimeout"].split("->")[0].strip()) < 200 or int(data["c_userTimeout"].split("->")[0].strip()) > 60000 or int(data["s_userTimeout"].split("->")[0].strip()) < 200 or int(data["s_userTimeout"].split("->")[0].strip()) > 60000: print("user time test") # 点击OK self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() error_content = self.driver.find_element(By.XPATH, "//label[text()='User Timeout']/parent::div//div[@class='el-form-item__error']").text.strip() pytest_check.equal(error_content, "The User Timeout range:200-60000", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() elif data["c_override_MSS"].split("->")[0].strip() == "on": if int(data["c_overrideMSS"].split("->")[0].strip()) < 536 or int(data["c_overrideMSS"].split("->")[0].strip()) > 1460: print("overridemss") error_content = self.driver.find_element(By.XPATH, "//input[@placeholder='536-1460']/ancestor::div[@class='el-form-item__content']//div[@class='el-form-item__error']").text.strip() pytest_check.equal(error_content, "The MSS range:536-1460", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() elif data["s_override_MSS"].split("->")[0].strip() == "on": if int(data["s_overrideMSS"].split("->")[0].strip()) < 536 or int(data["s_overrideMSS"].split("->")[0].strip()) > 1460: print("s_overridemss") error_content = self.driver.find_element(By.XPATH, "//input[@placeholder='536-1460']/ancestor::div[@class='el-form-item__content']//div[@class='el-form-item__error']").text.strip() pytest_check.equal(error_content, "The MSS range:536-1460", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() elif data["c_keepalive"].split("->")[0].strip() == "on": if int(data["c_probe_number"].split("->")[0].strip()) < 1 or int(data["c_probe_number"].split("->")[0].strip()) > 222: print("c-pnumber") error_content = self.driver.find_element(By.XPATH, "//label[text()='Probe Number']/parent::div//div[@class='el-form-item__error']").text.strip() pytest_check.equal(error_content, "The Probe Number range: 1-222", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() if int(data["c_idle_time"].split("->")[0].strip()) < 30 or int(data["c_idle_time"].split("->")[0].strip()) > 7200: print("c_idletine") error_content = self.driver.find_element(By.XPATH, "//label[text()='Idle Time']/parent::div//div[@class='el-form-item__error']").text.strip() pytest_check.equal(error_content, "The Idle Time range:30-7200", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() if int(data["c_interval"].split("->")[0].strip()) < 15 or int(data["c_interval"].split("->")[0].strip()) > 75: print("c_interval") error_content = self.driver.find_element(By.XPATH, "//label[text()='Interval']/parent::div//div[@class='el-form-item__error']").text.strip() pytest_check.equal(error_content, "The Interval range:15-75", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() elif data["s_keepalive"].split("->")[0].strip() == "on": if int(data["s_probe_number"].split("->")[0].strip()) < 1 or int(data["s_probe_number"].split("->")[0].strip()) > 222: print("s_pnumber") error_content = self.driver.find_element(By.XPATH, "//label[text()='Probe Number']/parent::div//div[@class='el-form-item__error']").text.strip() pytest_check.equal(error_content, "The Probe Number range: 1-222", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() if int(data["s_idle_time"].split("->")[0].strip()) < 30 or int(data["s_idle_time"].split("->")[0].strip()) > 7200: print("s_idle") error_content = self.driver.find_element(By.XPATH, "//label[text()='Idle Time']/parent::div//div[@class='el-form-item__error']").text.strip() pytest_check.equal(error_content, "The Idle Time range:30-7200", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() if int(data["s_interval"].split("->")[0].strip()) < 15 or int(data["s_interval"].split("->")[0].strip()) > 75: print("s_interval") error_content = self.driver.find_element(By.XPATH, "//label[text()='Interval']/parent::div//div[@class='el-form-item__error']").text.strip() pytest_check.equal(error_content, "The Interval range:15-75", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击取消 self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_cancel_posxpath).click() self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() time.sleep(2) return self.random_name def _operate_page(self, data: {}, operation_type="create"): """ 除name的其它选项操作,供创建、修改逻辑调用 :param data: :param operation_type: create modify。创建 修改时调用 :return: """ no_modify = "不修改" if operation_type == "create": data_index = 0 #新增数据索引 else: data_index = -1 #编辑数据索引 #解析输入data数据的数据 #enable TCP Passthrough 开关操作 self._operate_switch(data, data_index=data_index, no_modify=no_modify, switch_name="enable_TCP_passthrough", element_position=f"{tcp_proxy_profiles_switch_enable_tcp_passthrough_posxpath}//span[@class='MuiSwitch-root MuiSwitch-sizeMedium css-l8jo8y']") #Client_side 开关操作 override MSS, no delay, keepalive self._operate_switch(data, data_index=data_index, no_modify=no_modify, switch_name="c_override_MSS", element_position=tcp_proxy_profiles_switch_client_override_mss_posxpath) # Client_side 输入操作 override MSS, ttl, user Timeout c_overrideMSS_test = self._get_value_from_data(data, key="c_override_MSS", data_index=data_index) if c_overrideMSS_test == "on" or c_overrideMSS_test == no_modify: c_overrideMSS = self._get_value_from_data(data, key="c_overrideMSS", data_index=data_index) if c_overrideMSS != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_override_mss_posxath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_override_mss_posxath).send_keys(c_overrideMSS) self.driver.find_element(By.XPATH, "//label[text()='Override MSS']").click() self._operate_switch(data, data_index=data_index, no_modify=no_modify, switch_name="c_no_delay", element_position=tcp_proxy_profiles_switch_client_nodelay_posxpath) c_ttl = self._get_value_from_data(data, key="c_ttl", data_index=data_index) if c_ttl != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_ttl_posxpath).send_keys(Keys.CONTROL + "a") self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_ttl_posxpath).send_keys(Keys.DELETE) self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_ttl_posxpath).send_keys(c_ttl) self.driver.find_element(By.XPATH, "//label[text()='TTL']").click() self._operate_switch(data, data_index=data_index, no_modify=no_modify, switch_name="c_keepalive", element_position=tcp_proxy_profiles_switch_client_keepalive_posxpath) c_keepalive_test = self._get_value_from_data(data, key="c_keepalive", data_index=data_index) if c_keepalive_test == "on": c_probe_number = self._get_value_from_data(data, key="c_probe_number", data_index=data_index) if c_probe_number != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_probe_number_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_probe_number_posxpath).send_keys(c_probe_number) self.driver.find_element(By.XPATH, "//label[text()='Probe Number']").click() c_idle_time = self._get_value_from_data(data, key="c_idle_time", data_index=data_index) if c_idle_time != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_idle_time_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_idle_time_posxpath).send_keys(c_idle_time) self.driver.find_element(By.XPATH, "//label[text()='Idle Time']").click() c_interval = self._get_value_from_data(data, key="c_interval", data_index=data_index) if c_interval != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_interval_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_interval_posxpath).send_keys(c_interval) self.driver.find_element(By.XPATH, "//label[text()='Interval']").click() self._operate_switch(data, data_index=data_index, no_modify=no_modify, switch_name="c_UserTimeout_switch", element_position=tcp_proxy_profiles_switch_client_user_timeout_posxpath) c_UserTimeout_test = self._get_value_from_data(data, key="c_UserTimeout_switch", data_index=data_index) if c_UserTimeout_test == "on" or c_overrideMSS_test == no_modify: c_userTimeout = self._get_value_from_data(data, key="c_userTimeout", data_index=data_index) if c_userTimeout != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_user_timeout_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_user_timeout_posxpath).send_keys(c_userTimeout) self.driver.find_element(By.XPATH, "//label[text()='User Timeout']").click() # Server_side 开关操作 override MSS, no delay, keepalive self._operate_switch(data, data_index=data_index, no_modify=no_modify, switch_name="s_override_MSS", element_position=tcp_proxy_profiles_switch_server_override_mss_posxpath) # Server_side 输入操作 override MSS, ttl, user Timeout s_overrideMSS_test = self._get_value_from_data(data, key="s_override_MSS", data_index=data_index) if s_overrideMSS_test == "on": s_overrideMSS = self._get_value_from_data(data, key="s_overrideMSS", data_index=data_index) if s_overrideMSS != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_override_mss_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_override_mss_posxpath).send_keys(s_overrideMSS) self.driver.find_element(By.XPATH, "//label[text()='Override MSS']").click() self._operate_switch(data, data_index=data_index, no_modify=no_modify, switch_name="s_no_delay", element_position=tcp_proxy_profiles_switch_server_nodelay_posxpath) s_ttl = self._get_value_from_data(data, key="s_ttl", data_index=data_index) if s_ttl != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_ttl_posxpath).send_keys( Keys.CONTROL + "a") self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_ttl_posxpath).send_keys(Keys.DELETE) self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_ttl_posxpath).send_keys(s_ttl) self.driver.find_element(By.XPATH, "//label[text()='TTL']").click() self._operate_switch(data, data_index=data_index, no_modify=no_modify, switch_name="s_keepalive", element_position=tcp_proxy_profiles_switch_server_keepalive_posxpath) s_keepalive_test = self._get_value_from_data(data, key="s_keepalive", data_index=data_index) if s_keepalive_test == "on": s_probe_number = self._get_value_from_data(data, key="s_probe_number", data_index=data_index) if s_probe_number != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_probe_number_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_probe_number_posxpath).send_keys(s_probe_number) self.driver.find_element(By.XPATH, "//label[text()='Probe Number']").click() s_idle_time = self._get_value_from_data(data, key="s_idle_time", data_index=data_index) if s_idle_time != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_idle_time_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_idle_time_posxpath).send_keys(s_idle_time) self.driver.find_element(By.XPATH, "//label[text()='Idle Time']").click() s_interval = self._get_value_from_data(data, key="s_interval", data_index=data_index) if s_interval != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_interval_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_interval_posxpath).send_keys(s_interval) self.driver.find_element(By.XPATH, "//label[text()='Interval']").click() self._operate_switch(data, data_index=data_index, no_modify=no_modify, switch_name="s_UserTimeout_switch", element_position=tcp_proxy_profiles_switch_server_user_timeout_posxpath) s_UserTimeout_test = self._get_value_from_data(data, key="s_UserTimeout_switch", data_index=data_index) if s_UserTimeout_test == "on": s_userTimeout = self._get_value_from_data(data, key="s_userTimeout", data_index=data_index) if s_userTimeout != no_modify: # 判断不修改时跳过操作 self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_user_timeout_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_user_timeout_posxpath).send_keys(s_userTimeout) self.driver.find_element(By.XPATH, "//label[text()='User Timeout']").click() def _operate_switch(self, data: {}, data_index=0, no_modify="不修改", switch_name="", element_position=""): """ 页面中,开关状态操作。 :param data: :param data_index: 0 -1来自上层 :param no_modify:"不修改" 来自上次调用 :param operation_type: create modify两个状态, :param switch_name: 数据中开关名称 :param elementPosition: 开关的定位 :return: """ #解析输入data数据的数据 switch_value: str = self._get_value_from_data(data, key=switch_name, data_index=data_index) #提取数据 # print("switch_value=", switch_value) if switch_value != no_modify: #编辑时,有不修改则不用执行 #先获取当前页面中开关状态 include_root_current_class : class="el-switch is-checked" 有is-checked当前状态为开,没有is-chedked当前状态为关 swith_current_class = self.driver.find_element(By.XPATH, f"{element_position}//span[contains(@class, 'MuiButtonBase-root')]").get_attribute("class") if "on" == switch_value: #数据中为开 if "Mui-checked" in swith_current_class: #页面当前为开,不用点击开关 pass else: #页面当前为关,需要点击开关 self.driver.find_element(By.XPATH, element_position).click() else: #用例输入为关 if "Mui-checked" in swith_current_class: #页面当前为开,需要点击开关 self.driver.find_element(By.XPATH, element_position).click() else: #页面当前为关,不用点击开关 pass def _get_value_from_data(self, data: {}, key="", data_index=0): """ 从data数据中,根据key提取值 :param data: :param key: :param data_index: 0 -1 :return: """ try: data_value: str = data[key].split("->")[data_index].strip().lower() #用例数据 except Exception as e: print(e) return data_value @screenshot_on_failure def _modify(self, data: {}, f_name=0): """ 修改数据,使用方法 f_name: 0---不修改Name; 1---修改Name :param data: :return: """ if data["model"].strip().lower() == "create": # 如果是create参数用例,则不用执行修改方法 return 0 # 点击勾选第一行选择框 self.first_row_checkBox_element.click() # 变量来自查询函数 time.sleep(1) self.driver.find_element(By.XPATH, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() time.sleep(2) # 校验数据是否丢失、不显示 if f_name == 1: current_name = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_name_posxpath).get_attribute("value") pytest_check.equal(current_name, self.random_name, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_ETP = self.driver.find_element(By.XPATH, f"{tcp_proxy_profiles_switch_enable_tcp_passthrough_posxpath}//span[contains(@class, 'MuiButtonBase-root')]").get_attribute("class") print(current_ETP) if self._get_value_from_data(data, key="enable_TCP_passthrough") == "on": pytest_check.is_in("Mui-checked", current_ETP, msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: pytest_check.is_not_in("Mui-checked", current_ETP, msg="所在行数{}".format(inspect.currentframe().f_lineno)) # client-side current_C_OMSS = self.driver.find_element(By.XPATH, f"{tcp_proxy_profiles_switch_server_override_mss_posxpath}//span[contains(@class, 'MuiButtonBase-root')]").get_attribute("class") if self._get_value_from_data(data, key="c_override_MSS") == "on": pytest_check.is_in("Mui-checked", current_C_OMSS, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_C_OMSS_value = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_override_mss_posxath).get_attribute("value") pytest_check.equal(current_C_OMSS_value, data["c_overrideMSS"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: pytest_check.is_not_in("Mui-checked", current_C_OMSS, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_C_Nodelay = self.driver.find_element(By.XPATH, f"{tcp_proxy_profiles_switch_client_nodelay_posxpath}//span[contains(@class, 'MuiButtonBase-root')]").get_attribute("class") if self._get_value_from_data(data, key="c_no_delay") == "on": pytest_check.is_in("Mui-checked", current_C_Nodelay, msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: pytest_check.is_not_in("Mui-checked", current_C_Nodelay, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_C_TTL = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_ttl_posxpath).get_attribute("value") pytest_check.equal(current_C_TTL, data["c_ttl"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_C_keepalive = self.driver.find_element(By.XPATH, f"{tcp_proxy_profiles_switch_client_keepalive_posxpath}//span[contains(@class, 'MuiButtonBase-root')]").get_attribute("class") if self._get_value_from_data(data, key="c_keepalive") == "on": pytest_check.is_in("Mui-checked", current_C_keepalive, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_C_Pnumber = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_probe_number_posxpath).get_attribute("value") current_C_idletime = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_idle_time_posxpath).get_attribute("value") current_C_interval = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_interval_posxpath).get_attribute("value") pytest_check.equal(current_C_Pnumber, data["c_probe_number"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) pytest_check.equal(current_C_idletime, data["c_idle_time"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) pytest_check.equal(current_C_interval, data["c_interval"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: pytest_check.is_not_in("Mui-checked", current_C_keepalive, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_C_UserTimeout_switch = self.driver.find_element(By.XPATH, f"{tcp_proxy_profiles_switch_client_user_timeout_posxpath}//span[contains(@class, 'MuiButtonBase-root')]").get_attribute("class") if self._get_value_from_data(data, key="c_UserTimeout_switch") == "on": pytest_check.is_in("Mui-checked", current_C_UserTimeout_switch, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_C_Utime = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_user_timeout_posxpath).get_attribute("value") pytest_check.equal(current_C_Utime, data["c_userTimeout"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: pytest_check.is_not_in("Mui-checked", current_C_UserTimeout_switch, msg="所在行数{}".format(inspect.currentframe().f_lineno)) # server-side current_S_OMSS = self.driver.find_element(By.XPATH, f"{tcp_proxy_profiles_switch_server_override_mss_posxpath}//span[contains(@class, 'MuiButtonBase-root')]").get_attribute("class") if self._get_value_from_data(data, key="s_override_MSS") == "on": pytest_check.is_in("Mui-checked", current_S_OMSS, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_S_OMSS_value = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_override_mss_posxpath).get_attribute("value") pytest_check.equal(current_S_OMSS_value, data["s_overrideMSS"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: pytest_check.is_not_in("Mui-checked", current_S_OMSS, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_S_Nodelay = self.driver.find_element(By.XPATH, f"{tcp_proxy_profiles_switch_server_nodelay_posxpath}//span[contains(@class, 'MuiButtonBase-root')]").get_attribute("class") if self._get_value_from_data(data, key="s_no_delay") == "on": pytest_check.is_in("Mui-checked", current_S_Nodelay, msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: pytest_check.is_not_in("Mui-checked", current_S_Nodelay, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_S_TTL = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_ttl_posxpath).get_attribute("value") pytest_check.equal(current_S_TTL, data["s_ttl"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_S_keepalive = self.driver.find_element(By.XPATH, f"{tcp_proxy_profiles_switch_server_keepalive_posxpath}//span[contains(@class, 'MuiButtonBase-root')]").get_attribute("class") if self._get_value_from_data(data, key="s_keepalive") == "on": pytest_check.is_in("Mui-checked", current_S_keepalive, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_S_Pnumber = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_probe_number_posxpath).get_attribute("value") current_S_idletime = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_idle_time_posxpath).get_attribute("value") current_S_interval = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_interval_posxpath).get_attribute("value") pytest_check.equal(current_S_Pnumber, data["s_probe_number"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) pytest_check.equal(current_S_idletime, data["s_idle_time"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) pytest_check.equal(current_S_interval, data["s_interval"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: pytest_check.is_not_in("Mui-checked", current_S_keepalive, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_S_UserTimeout_switch = self.driver.find_element(By.XPATH, f"{tcp_proxy_profiles_switch_server_user_timeout_posxpath}//span[contains(@class, 'MuiButtonBase-root')]").get_attribute("class") if self._get_value_from_data(data, key="s_UserTimeout_switch") == "on": pytest_check.is_in("Mui-checked", current_S_UserTimeout_switch, msg="所在行数{}".format(inspect.currentframe().f_lineno)) current_S_Utime = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_user_timeout_posxpath).get_attribute("value") pytest_check.equal(current_S_Utime, data["s_userTimeout"].split("->")[0].strip(), msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: pytest_check.is_not_in("Mui-checked", current_S_UserTimeout_switch, msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 解析修改数据 self._operate_page(data, operation_type="edit") # 修改Name if f_name == 1: new_Name = "(修改后)" self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_name_posxpath).send_keys(new_Name) self.random_name = self.random_name + new_Name # 点击ok self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_ok_posxpath).click() # if self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).is_displayed(): # self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() @screenshot_on_failure def _del(self, del_model=0): """ 默认删除查询到的第一个结果 :return: """ # 点击勾选第一行选择框 if del_model == 0: #点击勾选第一行选择框 self.first_row_checkBox_element.click() #变量来自查询函数 elif del_model == 1: # 勾选可以删除的选项,并删除;没有锁、没有被引用的对象 rows = self.driver.find_element(By.XPATH, listpage_profile_table_dns_records_table_tbody_posxpath).find_elements(By.XPATH, "./tr") if len(rows) == 0: # 没有数据,直接返回 return else: del_result = self.profiles_po.select_lock_and_referenceCount(rows) if del_result == 1: # 1表示没有删除对象,直接返回 return 0 # 调用profiles的功能删除方法 self.profiles_po.delete(listpage_profile_tcp_proxy_profiles_del_button_posxpath, listpage_dialog_tips_tcp_proxy_profiles_button_yes_posxpath, listpage_dialog_tips_tcp_proxy_profiles_button_no_posxpath) @screenshot_on_failure def _query(self, data: {}, vsys_name_2="", require_assertion=0, **kwargs): """ 查询函数,根据输入的类型查询 :param require_assertion: =0默认情况不需要断言,=1为创建后使用的断言预期,=2为编辑修改后使用的断言预期 :param kwargs: 例如 :可以查询使用的关键字,ID=None,Name=None, :return: """ # 打开该列表 self._goto_subProfilePage(vsys_name_2=vsys_name_2) # first_row查询到的第一行内容。map_header_className为需要使用的到字典,用来提取第一行的结果。 result = self.profiles_po.query(listpage_profile_search_tcp_proxy_profiles_select_label_posxpath, listPage_profileSearch_tcpProxyProfiles_dropDown_item_posXpath, listPage_profileSearch_tcpProxyProfiles_input_itemContent_posXpath, listpage_profile_search_tcp_proxy_profiles_button_search_posxpath, listPage_profilTable_tcpProxyProfiles_tableTbody_posXpath, listPage_profilTable_tcpProxyProfiles_tableHeader_posXpath, **kwargs) if result == [0, 0]: return 0 else: first_row, map_header_className = result # 第一行的勾选定位,给修改、删除使用 self.first_row_checkBox_element = self.driver.find_element(By.XPATH, "//div[contains(@class, 'MuiDataGrid-row--firstVisible')]//input[@class='PrivateSwitchBase-input css-1m9pwf3']") # self.first_row_ID_content = first_row.find_element(By.XPATH, "//div[@class='table-status-item-id']/span").text.strip() # print(map_header_className) # print("first_row=", first_row.text) # 需要提取ID、Name 信息 # first_row_id_content = first_row.find_element(By.XPATH, "//div[@class='table-status-item-id']//span").text.strip() #first_row_VsysID_class = map_header_className["Vsys ID"] #first_row_VsysID_content = first_row.find_element(By.XPATH, f"//td[contains(@class, '{first_row_VsysID_class}')]//div").text.strip() first_row_Name_content = self.driver.find_element(By.XPATH, "//div[contains(@class, 'MuiDataGrid-row--firstVisible')]//div[@data-field='name']").text.strip() search_dict = {"Name": first_row_Name_content} print("first_row=", search_dict) search_key = list(kwargs.keys())[0] pytest_check.is_in(kwargs[search_key], search_dict[search_key], msg="所在行数{}".format(inspect.currentframe().f_lineno)) # # 不同操作后的断言,创建后、修改后、无断言 if require_assertion == 1: # 直接创建后,使用的断言 pytest_check.equal(first_row_Name_content, self.random_name, msg="所在行数{}".format(inspect.currentframe().f_lineno)) elif require_assertion == 2 and data["model"].strip().lower() == "modify": # 修改数据后,使用的断言 pytest_check.equal(first_row_Name_content, self.random_name, msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: # 不适用断言 pass # 强制点击清空查询按钮 # element_clear = self.driver.find_element(By.XPATH, listPage_profileSearch_tcpProxyProfiles_buttonClear_posId) # self.driver.execute_script("arguments[0].click()", element_clear) # 强制点击 return search_dict def _column_setting(self, column: (), column_flags=0): """ 列设置函数, column_flags: 0---保持当前状态 1---仅显示默认列 2---显示所有列 3---显示自定义列 :param column_flags: :param kwargs: :return: """ # 打开该列表 self._goto_subProfilePage() profiles = "advanced" column_click = column[1:] current_column = self.profiles_po.column_setting(mainpage_profile_column_setting_posxpath, listpage_profile_column_tcp_proxy_profiles_button_column_all_posxpath, profiles, column_flags, column_click) pytest_check.equal(current_column, column, msg="所在行数{}".format(inspect.currentframe().f_lineno)) def _turn_pages(self, pages): """ 翻页 pages:当前模块页数;如果页数>8,则有快速翻页功能(页面翻至第5页,显示左快速翻页按钮;当前页为左/右第4页时,不显示快速翻页按钮) :param profiles: :param pages: :return: """ self._goto_subProfilePage() self.profiles_po.turn_pages("advanced", pages) def _language_change(self, language): """ 语言切换函数 language: 0---english; 1---chinese; 2---russian :param language: :return: """ self._goto_subProfilePage() header_content = self.profiles_po.language_change(mainpage_language_change_posxpath, mainpage_language_dropdown_item_posxpath.format(replace_language='中文'), mainpage_language_dropdown_item_posxpath.format(replace_language='Русский'), mainpage_language_dropdown_item_posxpath.format(replace_language='English'), language) # 断言 time.sleep(2) if language == 0: header_english = ["ID", "Vsys ID", "Name", "General Options", "Client-Side Parameters", "Server-Side Parameters", "Reference Count", "Modified Time", "Last Modified By"] assert set(header_content).issubset(set(header_english)) if language == 1: header_chinese = ["ID", "虚拟系统 ID", "名称", "通用参数", "客户端参数", "服务器端参数", "引用计数", "操作时间", "最后一次修改者"] assert set(header_content).issubset(set(header_chinese)) if language == 2: header_russian = ["ID", "Vsys ID", "Имя", "Общие Параметры", "Параметры на Стороне Клиента", "Параметры на Стороне Сервера", "Подсчет Ссылок", "Время Изменения", "Последний Раз Редактирован"] assert set(header_content).issubset(set(header_russian)) def _vsys_case(self, data, c_vsys, c_type, c_supervisor, f_vsys, f_type, f_supervisor="None"): name = self._create(data, f_vsys) time.sleep(3) self._query(data, f_vsys, require_assertion=1, Name=name) # 本vsys下查询 time.sleep(1) result = self._query(data, c_vsys, require_assertion=1, Name=name) # 到其他vsys下查询 time.sleep(1) self._vsys_check(result, c_vsys, c_type, c_supervisor, f_vsys, f_type, f_supervisor) # 删除创建的数据 time.sleep(1) self._query(data, f_vsys, require_assertion=1, Name=name) self._del() time.sleep(2) def _vsys_check(self, result, c_vsys, c_type, c_supervisor, f_vsys, f_type, f_supervisor): if c_type == f_type: # 平级vsys不可见 T1 T2 或M1 M2(M1 M2无隶属关系) pytest_check.equal(result, 0, msg="所在行数{}".format(inspect.currentframe().f_lineno)) else: if c_type == "Mvsys" and f_type == "Tvsys": # Mvsys查看下级Tvsys数据 if c_supervisor == "open": # Mvsys开启监督模式,可查看下级Tvsys数据 self.first_row_checkBox_element.click() # 变量来自查询函数 self.profiles_po.data_limit(listpage_profile_tcp_proxy_profiles_edit_button_posxpath, listPage_profile_tcpProxyProfiles_delButton_posId) elif c_supervisor == "close": # Mvsys关闭监督模式,不可查看下级Tvsys数据 pytest_check.equal(result, 0, msg="所在行数{}".format(inspect.currentframe().f_lineno)) elif c_type == "Tvsys" and f_type == "Mvsys": # Tvsys查看Mvsys数据,不可查 pytest_check.equal(result, 0, msg="所在行数{}".format(inspect.currentframe().f_lineno)) @screenshot_on_failure def _audit_log(self, operation): """ operation: Add---create; Update---modify :param operation: :return: """ self.first_row_checkBox_element.click() self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() time.sleep(2) self.driver.find_element(By.XPATH, "//div[@class='audit_log']/span").click() # 第一条记录勾选框 self.driver.find_element(By.XPATH, "//tr[1]/td/div/label/span").click() # 点击Compare btn_compare = self.driver.find_element(By.ID, "test-compare-_AuditLogs_InfoRightProfile_advancedAdd_Home_App_anonymousComponent") self.driver.execute_script("arguments[0].click()", btn_compare) # 强制点击 time.sleep(0.5) # 获取 operation content current_operation = self.driver.find_element(By.XPATH, "//div[@class='compare-code-title']//div[3]/div[2]").text.strip() pytest_check.equal(current_operation, operation, msg="所在行数{}".format(inspect.currentframe().f_lineno)) self.driver.find_element(By.XPATH, tcpProxyProfiles_button_cancel_posCss).click() if self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).is_displayed(): self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() def _policy_create(self, profile_name): # 进入Intercept列表页 self._goto_vsysPage() self.driver.find_element(By.ID, mainPage_firstLevelMenu_Policy_posId).click() self.driver.find_element(By.ID, mainPage_secondLevelMenu_Proxy_intercept_posId).click() # 创建 rule policy_name = self.profiles_po.policy_create("Intercept", profile_name, listPage_intercept_create_button_posId, intercept_create_Name_input_frame_PosXpath, intercept_create_action_intercept_label_posId, intercept_create_add_IPAddress_button_click_posXpath, intercept_button_oK_posId, intercept_button_cancel_posId, intercept_button_warningSaveYes_posCss, "ssl", intercept_create_add_application_button_click_posXpath, "", "TCP_Proxy_Profile", intercept_ssl_tcpProxyProfile_dropDown_posXpath, intercept_ssl_tcpProxyProfile_search_posXpath) time.sleep(2) return policy_name def _policy_query(self, **kwargs): # 打开该列表 self._goto_vsysPage() self.driver.find_element(By.ID, mainPage_firstLevelMenu_Policy_posId).click() self.driver.find_element(By.ID, mainPage_secondLevelMenu_Proxy_intercept_posId).click() # first_row查询到的第一行内容。map_header_className为需要使用的到字典,用来提取第一行的结果。 result = self.profiles_po.query(listPage_interceptSearch_selectLabel_posId, listPage_interceptSearch_dropDown_item_posXpath, listPage_interceptSearch_input_itemContent_posXpath, listPage_interceptSearch_buttonSearch_posId, listPage_interceptTable_tableTbody_posXpath, listPage_interceptTable_tableHeader_posXpath, **kwargs) if result == 0: print("no data") else: first_row, map_header_className = result # 第一行的勾选定位,给修改、删除使用 self.first_row_checkBox_element = first_row.find_element(By.XPATH, "//span[@class='el-checkbox__input']") def _policy_del(self): """ 默认删除查询到的第一个结果 :return: """ # 点击勾选第一行选择框 self.first_row_checkBox_element.click() # 变量来自查询函数 # 调用profiles的功能删除方法 self.profiles_po.delete(listPage_intercept_delete_button_posId, listPage_dialogTips_intercept_button_yes_posCss, listPage_dialogTips_intercept_button_no_posCss) def _referenceCount_view(self, **kwargs): self._goto_subProfilePage() first_row, map_header_className = \ self.profiles_po.query(listPage_profileSearch_tcpProxyProfiles_selectLabel_posId, listPage_profileSearch_tcpProxyProfiles_dropDown_item_posXpath, listPage_profileSearch_tcpProxyProfiles_input_itemContent_posXpath, listPage_profileSearch_tcpProxyProfiles_buttonSearch_posId, listPage_profilTable_tcpProxyProfiles_tableTbody_posXpath, listPage_profilTable_tcpProxyProfiles_tableHeader_posXpath, **kwargs) first_row_checkBox_element = first_row.find_element(By.XPATH, "//span[@class='el-checkbox__input']") first_row_referenceCount_class = map_header_className["Reference Count"] # print("first_row_referenceCount_class=", first_row_referenceCount_class) first_row_checkBox_element.click() if first_row.find_element(By.XPATH, f"//td[contains(@class, '{first_row_referenceCount_class}')]/div").get_attribute("value") != "0": print("数据被引用") # 校验该条数据是否可删除 text_del = self.driver.find_element(By.ID, listPage_profile_tcpProxyProfiles_delButton_posId).get_attribute("class") disabled_class = text_del.split(" ")[-1].strip() pytest_check.equal(disabled_class, "is-disabled", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 校验是否弹出侧滑框 first_row.find_element(By.ID, "ReferenceData-_advanced_Home_App_anonymousComponent").click() #点击引用计数 pytest_check.equal(self.driver.element_isExist(By.XPATH, "//div[@class='LocalationDraswer lstsub policy-right-show-edit']"), True, msg="所在行数{}".format(inspect.currentframe().f_lineno)) self.driver.find_element(By.XPATH, "//div[@class='box-content']/div/div[1]").click() def _buildin_check(self, vsys_name="UIAutoTestVsys", vsys_type="Tvsys", vsys_id="10"): self._goto_subProfilePage(vsys_name_2=vsys_name) self.driver.find_element(By.ID, listPage_profileSearch_tcpProxyProfiles_selectLabel_posId).click() self.driver.find_element(By.ID, "2-_FilteredSearch_ElRow_advanced_Home_App_anonymousComponent").click() # 选择Name self.driver.find_element(By.XPATH, "//div[contains(@class,'ListItem')]//span[text()='Name']/ancestor::div[contains(@class,'ListItem')]//input").send_keys("Default Proxy TCP Option") self.driver.find_element(By.ID, listPage_profileSearch_tcpProxyProfiles_buttonSearch_posId).click() self.driver.execute_script("arguments[0].click()", self.driver.find_element(By.ID, listPage_profileSearch_tcpProxyProfiles_buttonSearch_posId)) #强制点击 element_tbody = self.driver.find_element(By.XPATH, listPage_profilTable_tcpProxyProfiles_tableTbody_posXpath) # 找到所有的行,table的body element_header = self.driver.find_element(By.XPATH, listPage_profilTable_tcpProxyProfiles_tableHeader_posXpath) # 查询table的header # 获取table header的text、th.class # headers = element_header.find_elements(By.XPATH, "th") # table header rows = element_tbody.find_elements(By.XPATH, "tr") # table body if len(rows) == 0: print("没有查询到数据:Default Proxy TCP Option") if vsys_type == "Tvsys": assert len(rows) == 1 # 从查询的结果中,取出需要断言的值 for i in range(len(rows)): # print("test=", self.driver.find_element(By.XPATH, f"//tr[{i+1}]//span[@class='el-checkbox__input']")) self.driver.find_element(By.XPATH, f"//tr[{i+1}]//span[@class='el-checkbox__input']").click() # 勾选当前数据的复选框 #data_vsysid = self.driver.find_element(By.XPATH, f"//div[contains(@class,'ly-table1')]//tbody/tr[{i+1}]/td[2]/div[@class='cell']//div").text.strip() # print("data_vsysid=", data_vsysid) # 校验当前数据是否为只能查看 text_view = self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).text.strip() class_view = self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).get_attribute("class") # print("text_view=", text_view) if i == 0: pytest_check.equal(text_view, "Edit", msg="所在行数{}".format(inspect.currentframe().f_lineno)) #pytest_check.equal(data_vsysid, vsys_id, msg="所在行数{}".format(inspect.currentframe().f_lineno)) assert class_view.split(" ")[-1].strip() != "is-disabled" else: pytest_check.equal(text_view, "View", msg="所在行数{}".format(inspect.currentframe().f_lineno)) assert class_view.split(" ")[-1].strip() != "is-disabled" # 校验删除按钮是否置灰 text_del = self.driver.find_element(By.ID, listPage_profile_tcpProxyProfiles_delButton_posId).get_attribute("class") # print("text_del=", text_del) disabled_class = text_del.split(" ")[-1].strip() # print("disabled_class=", disabled_class) pytest_check.equal(disabled_class, "is-disabled", msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 校验是否带锁 if i != 0: isExist_lock = self.driver.element_isExist(By.XPATH , "//i[@class='iconfont icon-lock']") assert isExist_lock # 校验是否有内置标识 isExist_builtin = self.driver.element_isExist(By.XPATH, ".icon > use") print("test=", isExist_builtin) assert isExist_builtin print("test=", self.driver.find_element(By.XPATH, f"//tr[{i+1}]//span[contains(@class,'el-checkbox__input')]")) self.driver.find_element(By.XPATH, f"//tr[{i+1}]//span[contains(@class,'el-checkbox__input')]").click() # 取消勾选当前数据的复选框 time.sleep(3) @screenshot_on_failure def listPageBottom_allSelect(self): # 跳转到列表页 self._goto_subProfilePage() #跳转页面 self.profiles_po.check_checkBoxClass_by_buttonAll() @screenshot_on_failure def check_createAndEditPageElement(self, data): # 检验create 页面元素 self._goto_subProfilePage() #跳转页面 #点击create self.driver.find_element(By.ID, listPage_profile_tcpProxyProfiles_createButton_posId).click() #在create 页面校验元素 create_page_header_except = "Create TCP Proxy Profile" create_page_headr_actual = self.driver.find_element(By.XPATH, tcpProxyProfiles_headerTitle_posXpath).text.strip() print("开始校验create页面元素...") pytest_check.equal(create_page_header_except, create_page_headr_actual, msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击 cancel 按钮 self.driver.find_element(By.XPATH, tcpProxyProfiles_button_cancel_posCss).click() # 检验edit 页面元素 tmp_name = self._create(data) time.sleep(3) self._query(data, require_assertion=0, Name=tmp_name) #创建后查询 if data["model"].strip().lower() == "create": #如果是create参数用例,则不用执行修改方法 return 0 #点击勾选第一行选择框 self.first_row_checkBox_element.click() #变量来自查询函数 self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() #打开edit页面 print("开始校验edit页面元素...") edit_page_header_except = "Edit TCP Proxy Profile" edit_page_headr_actual = self.driver.find_element(By.XPATH, tcpProxyProfiles_headerTitle_posXpath).text.strip() pytest_check.equal(edit_page_header_except, edit_page_headr_actual, msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 点击 cancel 按钮 self.driver.find_element(By.XPATH, tcpProxyProfiles_button_cancel_posCss).click() self._query(data, require_assertion=0, Name=tmp_name) self._del() #删除数据 @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_subProfilePage() tmp_name = self._create(data) time.sleep(3) self._query(data, require_assertion=0, Name=tmp_name) # 勾选第一行 self.first_row_checkBox_element.click() # 调用公共的link创建逻辑 self.profiles_po.linkdata(link_list_dict, listPage_profile_tcpProxyProfiles_linkButton_posId, listPage_linkTips_tcpProxyProfiles_button_save_posXpath, listPage_linkTips_tcpProxyProfiles_button_add_posXpath, listPage_linkTips_tcpProxyProfiles_button_OK_posXpath) # 删除数据 self._query(data, require_assertion=0, Name=tmp_name) self._del(del_model=1) #删除数据 time.sleep(3) # 删除其它目标link数据逻辑 self._del_linkDstData(data, tmp_name, link_list_dict) def _del_linkDstData(self, data, tmp_name, link_list_dict): """ 删除目标link数据 :param data: :param tmp_name: :param link_list_dict: :return: """ loginout = LogInOut(self.driver) loginout.logout() time.sleep(1) 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"]) self._query(data, vsys_name_2=link_list_dict[link_index]["link_dst_vsys"], require_assertion=0, Name=tmp_name) self._del(del_model=1) #删除数据 time.sleep(3) # 退出账号 loginout.logout() time.sleep(1) # 再次登录源tsg,测试退出使用 loginout.login() @screenshot_on_failure def chk_lnk_mod_case(self, data, link_list_dict): # 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: """ tmp_name = self._create(data) time.sleep(3) search_dict = self._query(data, require_assertion=0, Name=tmp_name) # 勾选第一行 self.first_row_checkBox_element.click() # 调用公共的link创建逻辑 Des_ID_list, Request_ID, Sou_ID_list = self.profiles_po.linkdata(link_list_dict, listPage_profile_tcpProxyProfiles_linkButton_posId, listPage_linkTips_tcpProxyProfiles_button_save_posXpath, listPage_linkTips_tcpProxyProfiles_button_add_posXpath, listPage_linkTips_tcpProxyProfiles_button_OK_posXpath) try: self._query(data, require_assertion=1, ID=search_dict["ID"]) # 点击勾选第一行选择框 self.first_row_checkBox_element.click() # 变量来自查询函数 time.sleep(1) self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() # save data src_val_dict = self._get_value_dict(data) print("src_val_dict ======== ", src_val_dict) # 切换到目的源 cluster 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._query(data, vsys_name_2=link_list_dict[link_index]["link_dst_vsys"], require_assertion=0, ID=Des_ID_list[0]) # 点击勾选第一行选择框 self.first_row_checkBox_element.click() # 变量来自查询函数 time.sleep(1) self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() # save data des_val_dict = self._get_value_dict(data) print("des_val_dict ======== ", des_val_dict) pytest_check.equal(src_val_dict, des_val_dict, msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 切换到源 cluster self.profiles_po.change_sou_vsys() # update data self._query(data, require_assertion=1, ID=search_dict["ID"]) self._modify(data) self._query(data, require_assertion=2, ID=search_dict["ID"]) # 点击勾选第一行选择框 self.first_row_checkBox_element.click() # 变量来自查询函数 time.sleep(1) self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() # save data sou_value_dict = self._get_value_dict(data) print("sou_value_dict ======== ", sou_value_dict) time.sleep(1) # click sync Request_ID = self.profiles_po.click_pol_lnk_sync(Request_ID) time.sleep(3) # Request_ID, update_one_value_dict, update_two_value_dict = self._mod_des_chk_syc(Des_ID_list, Request_ID, link_list_dict, data) # 判断是否一致 self.profiles_po.dicts_are_equal(sou_value_dict, update_one_value_dict, update_two_value_dict) except Exception as e: print("Exception ============", e) raise e finally: self._goto_tcp_proxy_page() self._delete_des(Des_ID_list, data) # 删除数据 # 删除policy links记录 self.profiles_po._del_policy_links(Request_ID) # 删除源vsys数据 self._delete_sou(Sou_ID_list, data) @screenshot_on_failure def chk_lnk_butin_data_case(self, data, link_list_dict): # 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: """ # jump page self._goto_tcp_proxy_page() # search butin data butin_elem = self.driver.find_elements(By.XPATH, "//tbody//*[contains(@class, 'svg-icon')]/ancestor::div[1]/following-sibling::div[1]/span") butin_elem_val = [] for ele in butin_elem: ele_val = ele.text butin_elem_val.append(ele_val) print("butin_elem_val =============== ", butin_elem_val) # search element ran_ele = random.choice(butin_elem_val) self._query(data, require_assertion=0, ID=ran_ele) # 勾选第一行 self.first_row_checkBox_element.click() self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() # save src data rev_data = self._get_value_dict(data) print("rev_data ============ " , rev_data) try: self._query(data, require_assertion=0, ID=ran_ele) # 勾选第一行 self.first_row_checkBox_element.click() # 调用公共的link创建逻辑 Des_ID_list, Request_ID, Sou_ID_list = self.profiles_po.linkdata(link_list_dict, listPage_profile_tcpProxyProfiles_linkButton_posId, listPage_linkTips_tcpProxyProfiles_button_save_posXpath, listPage_linkTips_tcpProxyProfiles_button_add_posXpath, listPage_linkTips_tcpProxyProfiles_button_OK_posXpath) # 切换到目的源 cluster 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._query(data, vsys_name_2=link_list_dict[link_index]["link_dst_vsys"], require_assertion=0, ID=Des_ID_list[0]) # 点击勾选第一行选择框 self.first_row_checkBox_element.click() # 变量来自查询函数 time.sleep(1) self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() # save data des_val_dict = self._get_value_dict(data) print("des_val_dict ======== ", des_val_dict) pytest_check.equal(rev_data, des_val_dict, msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 切换到源 cluster self.profiles_po.change_sou_vsys() # update data self._query(data, require_assertion=1, ID=ran_ele) self._modify(data, f_name=0) self._query(data, require_assertion=2, ID=ran_ele) # 点击勾选第一行选择框 self.first_row_checkBox_element.click() # 变量来自查询函数 time.sleep(1) self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() # save data sou_value_dict = self._get_value_dict(data) print("sou_value_dict ======== ", sou_value_dict) time.sleep(1) # click sync Request_ID = self.profiles_po.click_pol_lnk_sync(Request_ID) time.sleep(3) # Request_ID, update_one_value_dict, update_two_value_dict = self._mod_des_chk_syc(Des_ID_list, Request_ID, link_list_dict, data,) # 删除policy links记录 self.profiles_po._del_policy_links(Request_ID) # # 删除源vsys数据 # self._delete_sou(Sou_ID_list, data) # 判断是否一致 self.profiles_po.dicts_are_equal(sou_value_dict, update_one_value_dict, update_two_value_dict) except Exception as e: print("Exception ============", e) raise e finally: print("recover des data ============= please wait") self._rev_des(data, rev_data, ran_ele, link_list_dict) print("recover sou data ============= please wait") self._rev_sou(data, rev_data, ran_ele) @screenshot_on_failure def _mod_des_chk_syc(self, Des_ID_list, Request_ID, link_list_dict, 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"]) # 获取sync后的值 self._query(data, vsys_name_2=link_list_dict[link_index]["link_dst_vsys"], require_assertion=0, ID=Des_ID_list[0]) # 点击勾选第一行选择框 self.first_row_checkBox_element.click() # 变量来自查询函数 time.sleep(1) self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() update_one_value_dict = self._get_value_dict(data) # modify des data self._query(data, vsys_name_2=link_list_dict[link_index]["link_dst_vsys"], require_assertion=0, ID=Des_ID_list[0]) self._modify(data = { "ids": "创建tcp_proxy_profiles数据后修改enable_tcp_passthrough", "model": "modify", "enable_TCP_passthrough": "on->off", "c_override_MSS": "off->off", "c_no_delay": "on->on", "c_ttl": "90->70", "c_keepalive": "on->on", "c_probe_number":"20->8", "c_idle_time":"70->30", "c_interval":"75->15", "c_UserTimeout_switch": "on->on", "c_userTimeout":"700->600", "s_override_MSS": "off->off", "s_no_delay": "on->on", "s_ttl": "100->75", "s_keepalive": "on->on", "s_probe_number": "20->8", "s_idle_time": "70->30", "s_interval": "75->15", "s_UserTimeout_switch": "on->on", "s_userTimeout": "700->600", }) # # 调用公用的sync点击逻辑 Request_ID = self.profiles_po.click_pol_lnk_sync(Request_ID) 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"]) # 再次获取sync后的值 self._query(data, vsys_name_2=link_list_dict[link_index]["link_dst_vsys"], require_assertion=2, ID=Des_ID_list[0]) # 点击勾选第一行选择框 self.first_row_checkBox_element.click() # 变量来自查询函数 time.sleep(1) self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() update_two_value_dict = self._get_value_dict(data) time.sleep(3) return Request_ID, update_one_value_dict, update_two_value_dict def _delete_sou(self, Sou_ID_list, data): loginout = LogInOut(self.driver) loginout.logout() time.sleep(1) loginout.login_other(url="http://192.168.44.72/#/login", username="AUTO_UI_TEST_KG", passwd="kongweibin1") # 删除数据 profile_public = ProfilesPublicOperations(self.driver) profile_public.change_vsys(vsys_name="UIAutoTestVsys") self._goto_tcp_proxy_page() self._delete_source(Sou_ID_list, data) # 删除数据 def _rev_sou(self, data, rev_data, ran_ele): loginout = LogInOut(self.driver) loginout.logout() time.sleep(1) loginout.login_other(url="http://192.168.44.72/#/login", username="AUTO_UI_TEST_KG", passwd="kongweibin1") # 恢复数据 profile_public = ProfilesPublicOperations(self.driver) profile_public.change_vsys(vsys_name="UIAutoTestVsys") self._goto_tcp_proxy_page() self._query(data, require_assertion=1, ID=ran_ele) self.first_row_checkBox_element.click() time.sleep(1) self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() self._rev_data(rev_data) def _rev_des(self, data, rev_data, ran_ele, link_list_dict): loginout = LogInOut(self.driver) loginout.logout() time.sleep(1) 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_tcp_proxy_page() self._query(data, vsys_name_2=link_list_dict[link_index]["link_dst_vsys"], require_assertion=1, ID=ran_ele) self.first_row_checkBox_element.click() time.sleep(1) self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() self._rev_data(rev_data) def _rev_data(self, value_dict): """ {'name': 'Default Proxy TCP Option', 'enable_TCP_passthrough': None, 'c_override_MSS': None, 'c_no_delay': 'true', 'c_ttl': '70', 'c_keepalive': 'true', 'c_probe_number': '8', 'c_idle_time': '30', 'c_interval': '15', 'c_UserTimeout_switch': 'true', 'c_userTimeout': '600', 's_override_MSS': None, 's_no_delay': 'true', 's_ttl': '75', 's_keepalive': 'true', 's_UserTimeout_switch': 'true', 's_userTimeout': '600'} """ self.driver.find_element(By.ID, tcp_proxy_profiles_input_name_posxpath).clear() self.driver.find_element(By.ID, tcp_proxy_profiles_input_name_posxpath).send_keys(value_dict['name']) self._operate_switch_rec(value_dict["enable_TCP_passthrough"], tcp_proxy_profiles_switch_enable_tcp_passthrough_posxpath) self._operate_switch_rec(value_dict["c_override_MSS"], tcp_proxy_profiles_switch_server_override_mss_posxpath) if value_dict["c_override_MSS"]: self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_override_mss_posxath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_override_mss_posxath).send_keys(value_dict['c_override_MSS']) self._operate_switch_rec(value_dict["c_no_delay"], tcp_proxy_profiles_switch_client_nodelay_posxpath) self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_ttl_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_ttl_posxpath).send_keys(value_dict['c_ttl']) self._operate_switch_rec(value_dict["c_keepalive"], tcp_proxy_profiles_switch_client_keepalive_posxpath) if value_dict["c_keepalive"]: self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_probe_number_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_probe_number_posxpath).send_keys(value_dict['c_probe_number']) self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_idle_time_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_idle_time_posxpath).send_keys(value_dict['c_idle_time']) self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_interval_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_interval_posxpath).send_keys(value_dict['c_interval']) self._operate_switch_rec(value_dict["c_UserTimeout_switch"], tcp_proxy_profiles_switch_client_user_timeout_posxpath) if value_dict["c_UserTimeout_switch"]: self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_user_timeout_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_user_timeout_posxpath).send_keys(value_dict['c_userTimeout']) self._operate_switch_rec(value_dict["s_override_MSS"], tcp_proxy_profiles_switch_server_override_mss_posxpath) self._operate_switch_rec(value_dict["s_no_delay"], tcp_proxy_profiles_switch_server_nodelay_posxpath) self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_ttl_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_ttl_posxpath).send_keys(value_dict['s_ttl']) self._operate_switch_rec(value_dict["s_keepalive"], tcp_proxy_profiles_switch_server_keepalive_posxpath) if value_dict["s_keepalive"]: self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_probe_number_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_probe_number_posxpath).send_keys(value_dict['s_probe_number']) self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_idle_time_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_idle_time_posxpath).send_keys(value_dict['s_idle_time']) self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_interval_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_interval_posxpath).send_keys(value_dict['s_interval']) self._operate_switch_rec(value_dict["s_UserTimeout_switch"], tcp_proxy_profiles_switch_server_user_timeout_posxpath) if value_dict["s_UserTimeout_switch"]: self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_user_timeout_posxpath).clear() self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_user_timeout_posxpath).send_keys(value_dict['s_userTimeout']) # 点击 OK self.driver.find_element(By.XPATH, tcp_proxy_profiles_button_ok_posxpath).click() time.sleep(0.5) if self.driver.element_isExist(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss): self.driver.find_element(By.XPATH, tcpProxyProfiles_button_warningSaveYes_posCss).click() time.sleep(0.5) def _operate_switch_rec(self, switch_value="", element_position=""): """ 页面中,开关状态操作。 :param data: :param data_index: 0 -1来自上层 :param no_modify:"不修改" 来自上次调用 :param operation_type: create modify两个状态, :param switch_name: 数据中开关名称 :param elementPosition: 开关的定位 :return: """ print("switch_value ================ ", switch_value) #先获取当前页面中开关状态 include_root_current_class : class="el-switch is-checked" 有is-checked当前状态为开,没有is-chedked当前状态为关 swith_current_class = self.driver.find_element(By.XPATH, element_position).get_attribute("class") if "true" == switch_value: #数据中为开 if "is-checked" in swith_current_class: #页面当前为开,不用点击开关 pass else: #页面当前为关,需要点击开关 self.driver.find_element(By.XPATH, element_position).click() else: #用例输入为关 if "is-checked" in swith_current_class: #页面当前为开,需要点击开关 self.driver.find_element(By.XPATH, element_position).click() else: #页面当前为关,不用点击开关 pass def _delete_des(self, Des_ID_list, data): self.driver.find_element(By.ID, 'select-label').click() self.driver.find_element(By.XPATH, "//li[starts-with(@id, '1-_FilteredSearch_ElRow_')]//span[normalize-space(text())='ID']").click() self.driver.find_element(By.XPATH, '//input[contains(@placeholder, "Support")]').send_keys(Des_ID_list[0]) self.driver.find_element(By.ID, mainPage_profileSearch_buttonSearch_posId).click() time.sleep(1) self.driver.find_element(By.XPATH, "//div[@class='el-checkbox-group']//span[@class='el-checkbox__input']/span[@class='el-checkbox__inner']").click() # 确认删除 self.driver.find_element(By.XPATH, "//p[normalize-space(text())='Delete']").click() self.driver.find_element(By.XPATH, listpage_dialog_tips_tcp_proxy_profiles_button_yes_posxpath).click() def _delete_source(self, Sou_ID_list, data): self.driver.find_element(By.ID, 'select-label').click() self.driver.find_element(By.XPATH, "//li[starts-with(@id, '1-_FilteredSearch_ElRow_')]//span[normalize-space(text())='ID']").click() self.driver.find_element(By.XPATH, '//input[contains(@placeholder, "Support")]').send_keys(Sou_ID_list[0]) self.driver.find_element(By.ID, mainPage_profileSearch_buttonSearch_posId).click() time.sleep(1) self.driver.find_element(By.XPATH, "//div[@class='el-checkbox-group']//span[@class='el-checkbox__input']/span[@class='el-checkbox__inner']").click() # 确认删除 self.driver.find_element(By.XPATH, "//p[normalize-space(text())='Delete']").click() self.driver.find_element(By.XPATH, listpage_dialog_tips_tcp_proxy_profiles_button_yes_posxpath).click() @screenshot_on_failure def _goto_tcp_proxy_page(self, vsys_name_2=""): # 菜单操作,定位到ssl_decryption_keyrings列表页 # self.driver.find_element(By.XPATH, mainPage_navigationBar_logo_posCss).click() self.driver.find_element(By.ID, mainPage_firstLevelMenu_profiles_posId).click() element = self.driver.find_element(By.ID, mainPage_secondLevelMenu_tcpProxyProfiles_posId) self.driver.execute_script("arguments[0].click()", element) # 强制点击 def _get_value_dict(self, data,): ''' "enable_TCP_passthrough": "off->on", "c_override_MSS": "on->不修改", "c_overrideMSS": "600->1000", "c_no_delay": "off->on", "c_ttl": "20->200", "c_keepalive": "off->on", "c_probe_number":"20->200", "c_idle_time":"100->7000", "c_interval":"15->75", "c_UserTimeout_switch": "on->不修改", "c_userTimeout":"400->40000", "s_override_MSS": "off->不修改", "s_no_delay": "off->不修改", "s_ttl": "20->不修改", "s_keepalive": "off->不修改", "s_UserTimeout_switch": "on->不修改", "s_userTimeout": "400->不修改", ''' value_dict = {} value_name = self.driver.find_element(By.ID, tcp_proxy_profiles_input_name_posxpath).get_attribute("value") value_dict['name'] = value_name enable_TCP_passthrough = self.driver.find_element(By.XPATH,tcp_proxy_profiles_switch_enable_tcp_passthrough_posxpath).get_attribute("aria-checked") value_dict['enable_TCP_passthrough'] = enable_TCP_passthrough c_override_MSS = self.driver.find_element(By.XPATH, tcp_proxy_profiles_switch_server_override_mss_posxpath).get_attribute("aria-checked") value_dict['c_override_MSS'] = c_override_MSS if c_override_MSS: c_overrideMSS = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_override_mss_posxath).get_attribute("value") value_dict['c_overrideMSS'] = c_overrideMSS c_no_delay = self.driver.find_element(By.XPATH, tcp_proxy_profiles_switch_client_nodelay_posxpath).get_attribute("aria-checked") value_dict['c_no_delay'] = c_no_delay c_ttl = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_ttl_posxpath).get_attribute("value") value_dict['c_ttl'] = c_ttl c_keepalive = self.driver.find_element(By.XPATH, tcp_proxy_profiles_switch_client_keepalive_posxpath).get_attribute("aria-checked") value_dict['c_keepalive'] = c_keepalive if c_keepalive: c_probe_number = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_probe_number_posxpath).get_attribute("value") value_dict['c_probe_number'] = c_probe_number c_idle_time = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_idle_time_posxpath).get_attribute("value") value_dict['c_idle_time'] = c_idle_time c_interval = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_interval_posxpath).get_attribute("value") value_dict['c_interval'] = c_interval c_UserTimeout_switch = self.driver.find_element(By.XPATH, tcp_proxy_profiles_switch_client_user_timeout_posxpath).get_attribute("aria-checked") value_dict['c_UserTimeout_switch'] = c_UserTimeout_switch if c_UserTimeout_switch: c_userTimeout = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_client_user_timeout_posxpath).get_attribute("value") value_dict['c_userTimeout'] = c_userTimeout s_override_MSS = self.driver.find_element(By.XPATH, tcp_proxy_profiles_switch_server_override_mss_posxpath).get_attribute("aria-checked") value_dict['s_override_MSS'] = s_override_MSS s_no_delay = self.driver.find_element(By.XPATH, tcp_proxy_profiles_switch_server_nodelay_posxpath).get_attribute("aria-checked") value_dict['s_no_delay'] = s_no_delay s_ttl = self.driver.find_element(By.XPATH, tcp_proxy_profiles_input_server_ttl_posxpath).get_attribute("value") value_dict['s_ttl'] = s_ttl s_keepalive = self.driver.find_element(By.XPATH,tcp_proxy_profiles_switch_server_keepalive_posxpath).get_attribute("aria-checked") value_dict['s_keepalive'] = s_keepalive if s_keepalive: s_probe_number = self.driver.find_element(By.XPATH,tcp_proxy_profiles_input_server_probe_number_posxpath).get_attribute("value") value_dict['s_probe_number'] = s_probe_number s_idle_time = self.driver.find_element(By.XPATH,tcp_proxy_profiles_input_server_idle_time_posxpath).get_attribute("value") value_dict['s_idle_time'] = s_idle_time s_interval = self.driver.find_element(By.XPATH,tcp_proxy_profiles_input_server_interval_posxpath).get_attribute("value") value_dict['s_interval'] = s_interval s_UserTimeout_switch = self.driver.find_element(By.XPATH,tcp_proxy_profiles_switch_server_user_timeout_posxpath).get_attribute("aria-checked") value_dict['s_UserTimeout_switch'] = s_UserTimeout_switch if s_UserTimeout_switch: s_userTimeout = self.driver.find_element(By.XPATH,tcp_proxy_profiles_input_server_user_timeout_posxpath).get_attribute("value") value_dict['s_userTimeout'] = s_userTimeout # 点击 OK self.driver.find_element(By.XPATH, tcpProxyProfiles_button_cancel_posCss).click() return value_dict def chk_query_spec_chr(self, data): # 跳转到 hijack_page self._goto_subProfilePage() # 点击search查询框 self.driver.find_element(By.ID, mainPage_profileSearch_selectLabel_posId).click() # 循环输入查询内容 for key, value in data.items(): if "_" in key: key = key.replace("_", " ") # 将下划线替换为空格 listPage_profileSearch_hijackFiles_dropDown_item_posXpath dropdown_item_posXpath = listPage_profileSearch_tcpProxyProfiles_dropDown_item_posXpath.format(replaceName=key) self.driver.find_element(By.XPATH, dropdown_item_posXpath).click() # 点击下拉item input_item_posXpath = listPage_profileSearch_tcpProxyProfiles_input_itemContent_posXpath.format( replaceName=key) self.driver.find_element(By.XPATH, input_item_posXpath).send_keys(value.strip()) # 输入查询值 self.driver.find_element(By.XPATH, input_item_posXpath).send_keys(Keys.ENTER) # 模拟回车按键 # 点击查询按钮 element_search = self.driver.find_element(By.ID, mainPage_profileSearch_buttonSearch_posId) self.driver.execute_script("arguments[0].click()", element_search) # 强制点击 if key == "ID": content = self.driver.find_element(By.XPATH, "//p[text()=\"ID only supports numbers and English characters\',\'\"]").text pytest_check.equal(content, "ID only supports numbers and English characters','",msg="所在行数{}".format(inspect.currentframe().f_lineno)) if key == "Name": val = self.driver.find_element(By.XPATH, input_item_posXpath).text pytest_check.equal(len(val) < 256, True, msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 强制点击清空查询按钮 element_clear = self.driver.find_element(By.ID, listPage_profileSearch_tcpProxyProfiles_buttonClear_posId) self.driver.execute_script("arguments[0].click()", element_clear) # 强制点击 def _audit_log_all_operation(self, data): ran_name = self._create(data) try: time.sleep(1) profiles_type = "TCP Proxy Profile" search_dict = self._query(data, Name=ran_name) self._audit_log_operation(profiles_type, search_dict["ID"], operation_type='Create') self._query(data, Name=ran_name) self._audit_log_operation(profiles_type, search_dict["ID"], operation_type='Query Verbose') self._query(data, Name=ran_name) self._modify(data) self._query(data, Name=ran_name) self._audit_log_operation(profiles_type, search_dict["ID"], operation_type='Edit') self._goto_subProfilePage() self.profiles_po._audit_log_query_list(profiles_type, search_dict["ID"], operation_type='Query List') except Exception as e: raise e finally: self._query(data, Name=ran_name) self._del() self.profiles_po._audit_log_delete(profiles_type, search_dict["ID"], operation_type='Delete') def _audit_log_operation(self, profiles_type, search_id, operation_type): # 选中第一行 self.first_row_checkBox_element.click() # 点击编辑 self.driver.find_element(By.ID, listpage_profile_tcp_proxy_profiles_edit_button_posxpath).click() if operation_type == 'Query Verbose': click_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') if operation_type == 'Create': # 创建时间 compare_time = self.driver.find_element(By.XPATH, tcp_proxy_profiles_page_create_time_posXpath).text elif operation_type == 'Edit': # 修改时间 compare_time = self.driver.find_element(By.XPATH, tcp_proxy_profiles_page_modify_time_posXpath).text # 用户 user_name = self.driver.find_element(By.XPATH, "//div[@class='bifang-proxy-id item-content user_name_font']").text if operation_type == 'Query Verbose': self.profiles_po.search_compare_item(profiles_type, search_id, operation_type=operation_type, operation_flag=0) else: # 对比 Audit log 详情页 self.driver.find_element(By.XPATH, tcp_proxy_profiles_page_audit_logs_posXpath).click() self.driver.find_element(By.XPATH, "(//span[@class='el-checkbox__inner'])[2]").click() # 点击 Compare self.driver.find_element(By.XPATH, tcp_proxy_profiles_page_audit_logs_compare_posXpath).click() if operation_type == 'Create': self.profiles_po._check_audit_log_detail_page(profiles_type, user_name, search_id, compare_time, operation_flag=0) elif operation_type == 'Edit': self.profiles_po._check_audit_log_detail_page(profiles_type, user_name, search_id, compare_time, operation_flag=1) # 对比系统 audit_log 页 self.profiles_po.search_compare_item(profiles_type, search_id, operation_type=operation_type, operation_flag=0) time.sleep(1) if operation_type == 'Create': # 点击 Compare 对比 self.driver.find_element(By.XPATH, "//button[@class='el-button btn-style el-button--info el-button--mini']/span[normalize-space(text())='Compare']").click() self.driver.find_element(By.ID, list_page_audit_log_search_button_compare_posId).click() self.profiles_po._check_audit_log_detail_page(profiles_type, user_name, search_id, compare_time, operation_flag=0) elif operation_type == 'Edit': # 点击 Compare 对比 self.driver.find_element(By.XPATH, "//button[@class='el-button btn-style el-button--info el-button--mini']/span[normalize-space(text())='Compare']").click() # 对比 V.1 self.driver.find_element(By.XPATH, "(//td[contains(@class, 'is-left el-table-column--selection')])[last()]").click() self.driver.find_element(By.ID, list_page_audit_log_search_button_compare_posId).click() self.profiles_po._check_audit_log_system_page(profiles_type, user_name, search_id, compare_time, operation_flag=1) elif operation_type == 'Query Verbose': time.sleep(0.5) # 点击 Compare 对比 self.driver.find_element(By.XPATH, "(//button[@class='el-button btn-style el-button--info el-button--mini'])[1]").click() self.profiles_po._check_audit_log_detail_page(profiles_type, user_name, search_id, click_time, operation_flag=2) def _all_search_fields(self, data): # 新建数据 ran_name = self._create(data) # 名字查询 search_dict = self._query(data, Name=ran_name) try: # ID 唯一查询 self._query(data, ID=search_dict['ID']) # 只有一行记录并且ID一致 id_eles = self.driver.find_elements(By.XPATH, "//div[@class='table-status-item-id']") id_ele_lst = [e.text for e in id_eles] pytest_check.equal(len(id_ele_lst), 1, msg="所在行数{}".format(inspect.currentframe().f_lineno)) for id_ele in id_ele_lst: pytest_check.equal(id_ele, search_dict['ID'], msg="所在行数{}".format(inspect.currentframe().f_lineno)) # 名字模糊查询 search_name = self.profiles_po.random_substring(ran_name) self._query(data, Name=search_name) # 可以有多行记录都需要包含在名字里面 name_eles = self.driver.find_elements(By.XPATH, "//td[contains(@class,'el-table_1_column_2 is-left')]") name_ele_lst = [e.text for e in name_eles] for name_ele in name_ele_lst: pytest_check.equal(search_name in name_ele, True, msg="所在行数{}".format(inspect.currentframe().f_lineno)) except Exception as e: print("Exception ============", e) raise e finally: # 删除数据 self._query(data, Name=ran_name) self._del() create = _create query = _query modify = _modify delete = _del column_setting = _column_setting turn_pages = _turn_pages language_change = _language_change vsys_case = _vsys_case vsys_check = _vsys_check audit_log = _audit_log policy_create = _policy_create policy_query = _policy_query policy_delete = _policy_del referenceCount_view = _referenceCount_view buildin_check = _buildin_check """ def _random_number(self,flag): # 536-1460中随机数---override MSS if flag == 1: return random.randint(536,1460) # 1-255中随机数---TTL elif flag == 2: return random.randint(1, 255) # 200-60000中随机数---user Timeout elif flag == 3: return random.randint(200, 60000) """ if __name__ == '__main__': chrome_option = webdriver.ChromeOptions() a = MyWebDriver( command_executor="http://192.168.64.23:4444", options=chrome_option ) a.get("http://192.168.44.72") a.maximize_window() a.find_element(By.XPATH, loginpage_username_posxpath).send_keys("AUTO_UI_TEST_KG") a.find_element(By.XPATH, loginpage_passwd_posxpath).send_keys("kongweibin1") a.find_element(By.XPATH, login_page_sign_in_posxpath).click() time.sleep(2) # 测试修改数据 r = TcpProxyProfiles(a) # profile_pub = ProfilesPublicOperations(r) # profile_pub.change_vsys(vsys_name='UIAutoTestVsys') # model=0/1 ====0:单个 1group # type =IMSI/Phone_Number/IMEI data= { "ids": "创建tcp_proxy_profiles数据修改输入内容及开关状态", "model": "modify", "enable_TCP_passthrough": "on->off", "c_override_MSS": "on->不修改", "c_overrideMSS": "536->1000", "c_no_delay": "on->off", "c_ttl": "1->200", "c_keepalive": "on->不修改", "c_probe_number":"1->200", "c_idle_time":"30->6000", "c_interval":"15->70", "c_UserTimeout_switch": "on->不修改", "c_userTimeout":"200->50000", "s_override_MSS": "on->不修改", "s_overrideMSS": "1460->600", "s_no_delay": "on->off", "s_ttl": "255->20", "s_keepalive": "on->不修改", "s_probe_number":"222->19", "s_idle_time":"7200->100", "s_interval":"75->30", "s_UserTimeout_switch": "on->不修改", "s_userTimeout": "60000->400" } # 测试link # link_parse = configparser.ConfigParser() # link_parse_dir = os.path.join(workdir, "config", "linkcluster.ini") # link_parse.read(link_parse_dir, encoding="utf-8") # link_list_dict = [] # link_list = [2] # 可取值 1、2、 3、4、5 #这些取值来自linkcluster.ini配置文件 # for i in link_list: # tmp_dict = {} # link_index = "link_{}".format(i) # tmp_dict["link_dst_cluster"] = link_parse.get(link_index, "link_dst_cluster") # tmp_dict["link_dst_vsys"] = link_parse.get(link_index, "link_dst_vsys") # tmp_dict["url"] = link_parse.get(link_index, "url") # tmp_dict["username"] = link_parse.get(link_index, "username") # tmp_dict["passwd"] = link_parse.get(link_index, "passwd") # link_list_dict.append(copy.deepcopy(tmp_dict)) # print(link_list_dict) """ 传参查考 link_list_dict = [ { "link_dst_cluster": "42.49-User4Link", "link_dst_vsys": "Vsys2test", "url": "http://192.168.42.49/#/login", "username": "admin", "passwd": "admin" }, ] """ r.tcp_proxy_profiles_case(data)