pythonUI自动化之selenium常用方法封装
UI自动化常见方法封装
# 文件说明:selenium关键字驱动类:用例将所有常规操作进行封装 import os import re from time import sleep from selenium.webdriver import Keys, ActionChains from selenium import webdriver from selenium.webdriver import Chrome, DesiredCapabilities from selenium.webdriver.chrome.options import Options import time class Key: def __init__(self,headless_mode): """ :param headless_mode: 是否开启无头, True开启, False关闭 """ # 创建一个DesiredCapabilities对象,用于指定Chrome浏览器的配置 d = DesiredCapabilities.CHROME d['goog:loggingPrefs'] = {'performance': 'ALL'} # 指定浏览器记录所有性能日志 # 创建一个ChromeOptions对象,用于指定Chrome浏览器的启动选项 chrome_options = Options() # 是否开启无头, True开启, False关闭 chrome_options.headless = headless_mode 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() 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]) 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]) 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]) # 然后切换回原始页签 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框架 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}'") # 获取浏览器接口 def get_url(self, url): """ :param url: 需要获取的接口url :return: """ # 获取浏览器的性能日志,并将其保存为一个列表。'performance'参数表示获取性能日志。 logs_list = self.driver.get_log('performance') # 循环日志列表 for i in logs_list: # 如果日志中包含该接口, 则返回该行日志内容 if url in i['message']: return i['message'] # 元素操作函数----------------------------------------------------------------- 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) 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() 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) 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)