以下列出了在进行UI自动化测试时, 常用的方法封装,装饰器是一个报错重试装饰器
报错重试装饰器
""" 名称:功能报错装饰器 功能:执行某个函数时,时常会因”网速慢、网络波动大、浏览器卡顿“等原因从而报错,其实这时重新执行可以解决问题,该装饰器就依次为功能。 如果执行某个函数报错,它就是重新执行,直至执行成功或超出时间就会跳出循环,无需再用例步骤前后追加强制等待时间,减少用例冗余。 返回:无 """ from time import time, sleep def func_error(func): def wrapper(*args, **kwargs): start_time = time() while True: sleep(0.3) try: func(*args, **kwargs) except: print(f"(错误装饰器)运行错误") else: break if time() - start_time >= 30: print(f"您已超出{int(time() - start_time)}秒,退出循环") break return wrapper
常用方法的二次封装
# 文件说明:selenium关键字驱动类:用例将所有常规操作进行封装 import os import re import time from time import sleep from selenium import webdriver from selenium.webdriver import Keys, ActionChains from UI.Common.Error_Decorator import func_error class Key: def __init__(self): chrome_options = webdriver.ChromeOptions() # 自定义路径以及配置其它参数 path = r"UI/TestTheDownloadedFile" prefs = { 'profile.default_content_settings.popups': 0, # 防止保存弹窗 'download.default_directory': path, # 设置默认下载路径,如果目录不存在则直接创建 "profile.default_content_setting_values.automatic_downloads": 1 # 允许多文件下载 } # 将自定义设置添加到chrome配置对象实例中 chrome_options.add_experimental_option("prefs", prefs) # 启动带有自定义设置的chrome浏览器 self.driver = webdriver.Chrome(options=chrome_options) # 浏览器操作------------------------------------------------------------------ def open(self, txt): """ 访问url、最大化窗口、隐式等待 :param txt: 网址 """ # 打开网址 self.driver.get(txt) # 最大化浏览器窗口 self.driver.maximize_window() # 隐式等待10秒 self.driver.implicitly_wait(10) def quit(self): """ 退出浏览器 """ self.driver.quit() @func_error def open_new_bookmark(self, txt): """ 一个浏览器打开多个页签 :param txt: 网址 """ js = f"window.open('{txt}')" self.driver.execute_script(js) self.driver.switch_to.window(self.driver.window_handles[-1]) @func_error def switch(self, txt): """ 跳转到新页签 :param txt: txt传入的是数字, 传入0代表切换原始页签,输入1或N是切换新页签,从左往右数 """ self.driver.implicitly_wait(2) self.driver.switch_to.window(self.driver.window_handles[txt]) @func_error def window_switch(self): """ 关闭当前窗口 """ self.driver.switch_to.window(self.driver.window_handles[1]) # 切换到新页签 self.driver.close() # 关闭新页签 self.driver.switch_to.window(self.driver.window_handles[0]) # 然后切换回原始页签 @func_error def switch_new_iframe(self, value, name="xpath"): """ iframe窗口切换 :param value: 元素路径 :param name: 定位方法,默认为xpath """ iframe = self.driver.find_element(name, value) # 定位iframe框架 self.driver.switch_to.frame(iframe) # 切换到iframe框架 @func_error def quit_old_iframe(self): """ 退出iframe """ self.driver.switch_to.default_content() def sleep(self, txt): """ 强制等待 :param txt: 传入时间,单位为秒 :return: """ sleep(txt) def browser_zoom(self, txt): """ 浏览器缩放,0.5为缩放50%,0.25为缩放0.25 :param txt: 缩放值:0.5 """ self.driver.execute_script(f"document.body.style.zoom='{txt}'") # 元素操作函数----------------------------------------------------------------- @func_error def locator(self, value, name="xpath"): """ 元素定位(可用作元素等待) :param value: 元素路径 :param name: 定位方法,默认为xpath :return: """ return self.driver.find_element(name, value) def input(self, txt, value, name="xpath"): """ 输入:对某元素输入内容 :param txt: 输入的内容 :param value: 元素路径 :param name: 元素定位方法 """ el = self.driver.find_element(name, value) el.clear() el.send_keys(txt) def input_enter(self, txt, value, name="xpath"): """ 对某元素输入内容,并敲回车 :param txt: 输入的内容 :param value: 元素路径 :param name: 定位方法 """ el = self.driver.find_element(name, value) el.clear() # 清空输入框 el.send_keys(txt) # 输入内容 sleep(0.5) el.send_keys(Keys.ENTER) @func_error def click(self, value, name="xpath"): """ 点击元素 :param value: 元素路径 :param name: 元素定位方法 """ el = self.driver.find_element(name, value) # 高亮操作元素 # self.driver.execute_script( # "arguments[0].setAttribute('style', arguments[1]);", # el, # "border: 2px solid red;" # 边框border:2px; red红色 # ) el.click() @func_error def click_pluas(self, value, name="xpath"): """ 元素点击被拦截错误处理 :param value: 元素路径 :param name: 元素定位方法 """ el = self.driver.find_element(name, value) self.driver.execute_script("arguments[0].click();", el) def enter(self, value, name="xpath"): """ 对某元素的输入框敲“回车键” :param value: 元素路径 :param name: 定位方法 """ self.driver.find_element(name, value).send_keys(Keys.ENTER) def get_ele_txt(self, value, name="xpath"): """ 获取元素文本 :param value: 元素路径 :param name: 定位方法 :return: 返回元素文本信息 """ # el = self.driver.find_element(name, value) # self.driver.execute_script("arguments[0].scrollIntoView(false)", el) # self.driver.execute_script("arguments[0].scrollIntoView(true)", el) # return el.text start_time = time.time() el = self.driver.find_element(name, value) while True: if el.text != "": return el.text elif time.time() - start_time >= 10: return f"超时{time.time() - start_time}秒,元素文本为None,请检查元素定位" else: # "driver.execute_script"将元素移动到可视界面 self.driver.execute_script("arguments[0].scrollIntoView(false)", el) self.driver.execute_script("arguments[0].scrollIntoView(true)", el) continue def get_element_attribute(self, txt, value, name="xpath"): """ 获取元素属性值,举例:driver.find_element('xpath','//input[@id="kw"]').get_attribute('id')。id可以是任何属性名 :param txt: 元素的属性名称 :param value: 元素路径 :param name: 定位方法 :return: 返回元素属性值 """ el_key = self.driver.find_element(name, value).get_attribute(txt) return el_key # 鼠标键盘操作-------------------------------------------------------------------- def mouse_move(self, value, name="xpath"): """ 将鼠标移动到某元素上 :param value: 元素路径 :param name: 定位方法 """ element = self.driver.find_element(name, value) ActionChains(self.driver).move_to_element(element).perform() def mouse_press_move(self, xoffset, yoffset, value, name="xpath"): """ 按住鼠标滑动 :param xoffset: 横坐标 :param yoffset: 纵坐标 :param value: 元素路径 :param name: 定位方法 """ element = self.driver.find_element(name, value) ActionChains(self.driver).drag_and_drop_by_offset(element, xoffset, yoffset).perform() # 文件操作---------------------------------------------------------------------- def listdir_file(self, path): """ 读取某目录下所有文件 :param path: 文件所在目录 :return: 将以文件名称放入列表返回 """ return os.listdir(path) @func_error def remove_file(self, path): """ 删除某目录下所有文件 :param path: 需要删除的目录 :return: 删除成功返回True,删除失败返回False """ for i in os.listdir(path): os.remove(fr'{path}/{i}') file = os.listdir(path) if file == [] or None: return True elif file != [] or None: return False # 其它--------------------------------------------------------------------------- def regular_expression(self, pattern, string): """ 正则表达式。pattern:匹配的正则表达式 ; string:要匹配的字符串; :param pattern: 匹配的正则表达式 :param string: 要匹配的字符串 :return: 成功返回True、错误返回False """ if re.match(pattern, string) is not None: return True elif re.match(pattern, string) is None: return False