一、框架结构
- allure-report:测试报告
- base:定位元素封装
- data:数据
- log:日志文件
- page:页面封装文件夹
- report:缓存报告
- testcases:测试用例层
- utils:工具类
- run.py:执行文件

二、封装类
base.py
import datetime
import timefrom selenium.webdriver import Keys, ActionChains
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from utils.log_util import loggerclass BasePage:def __init__(self, driver):self.driver = driverself.driver.maximize_window()self.driver.implicitly_wait(10) self.wait = WebDriverWait(self.driver, 10) self.actions = ActionChains(self.driver) def find_element(self, locator, condition='visibility', retry=1):""":param locator: 元素定位信息:param condition: 默认是visibility:param retry: 重试次数,默认是1,重试一次:return:"""for time in range(retry + 1):try:logger.info(f"定位元素{locator}")if condition == 'visibility':node = self.wait.until(EC.visibility_of_element_located(locator))else:node = self.wait.until(EC.presence_of_element_located(locator))return nodeexcept Exception as e:error_info = f"{locator}定位失败,错误信息{e}"logger.error(error_info)if time < retry:logger.info(f"正在重新定位,当前重试次数:{time + 1}")else:raise Exception(error_info)def find_elements(self, locator, retry=1):"""返回列表节点:param locator: 元素定位信息:param retry: 重试次数,默认是1,重试一次:return:"""for time in range(retry + 1):try:logger.info(f"定位元素{locator}")node = self.wait.until(lambda x: x.find_elements(*locator))return nodeexcept Exception as e:error_info = f"{locator}定位失败,错误信息{e}"logger.error(error_info)if time < retry:logger.info(f"正在重新定位,当前重试次数:{time + 1}")else:raise Exception(error_info)def send_keys(self, locator, value, enter=False):"""封装输入内容函数:param locator: 元素定位信息:param value: 输入项的内容:return:"""node = self.find_element(locator)node.clear()node.send_keys(value)logger.info(f"输入内容为:{value}")if enter:node.send_keys(Keys.ENTER)logger.info("点击回车键")def click(self, locator):"""定位元素并点击:param locator: 元素定位信息:return:"""node = self.find_element(locator)node.click()logger.info("点击按钮")def get_url(self, url=''):"""请求url:param url: 网址:return:"""self.driver.get(url)logger.info(f"打开网址{url}")def close_driver(self):"""关闭浏览器:return:"""logger.info("关闭浏览器")self.driver.close()def quit_driver(self):"""退出浏览器:return:"""logger.info("退出浏览器")self.driver.quit()def refresh(self):"""刷新浏览器:return:"""self.driver.refresh()logger.info("刷新浏览器")def switch_to_window(self, to_parent_window=False):"""切换窗口:param to_parent_window: 是否回到主窗口:return:"""total = self.driver.window_handlesif to_parent_window:self