<think>我们正在构建一个基于Python、Selenium和Unittest的自动化测试框架。参考引用内容,我们可以总结出以下步骤:1.**环境准备**:安装必要的库(Selenium,Unittest等)。
2. **项目结构设计**:组织项目目录(如测试用例、页面对象、测试报告等)。
3. **编写基础类**:-测试基类(TestBase):用于初始化WebDriver,提供公共方法(如截图)。-页面对象(Page Objects):封装页面元素和操作。
4. **编写测试用例**:继承unittest.TestCase,使用页面对象编写测试方法(以test_开头)。5.**测试套件构建**:批量加载测试用例。
6. **生成测试报告**:使用HTMLTestRunner等生成美观的测试报告。
7. **可选**:加入邮件发送功能(发送测试报告)。下面逐步说明:
###1.环境准备安装Selenium:```bashpipinstall selenium```同时,确保已下载对应浏览器的驱动(如ChromeDriver)并配置环境变量。###2.项目结构建议如下:```
project/
├── testsuites/#测试套件目录(可存放测试用例集合)├──pageobjects/#页面对象目录│└── login_page.py#登录页面对象示例├── report/#存放测试报告├── common/#公共模块│└──test_base.py#测试基类└──run.py#主运行脚本```###3.编写基础类**test_base.py**(测试基类):
```pythonimport unittestfromselenium importwebdriverimporttimeimport osclassTestBase(unittest.TestCase):@classmethoddef setUpClass(cls):cls.driver =webdriver.Chrome()cls.driver.implicitly_wait(10)cls.driver.maximize_window()@classmethoddef tearDownClass(cls):time.sleep(3)cls.driver.quit()def get_windows_img(self):"""将截图保存到report目录"""day= time.strftime("%Y-%m-%d", time.localtime(time.time()))screenshot_path= f"report/{day}/screenshots/"if notos.path.exists(screenshot_path):os.makedirs(screenshot_path)now= time.strftime("%Y%m%d%H%M%S",time.localtime(time.time()))screenshot=self.driver.save_screenshot(f"{screenshot_path}{now}.png")returnscreenshot```
**login_page.py**(页面对象示例):```pythonfromselenium.webdriver.common.byimport ByclassLoginPage:def __init__(self,driver):self.driver= driver#页面元素定位username_input =(By.ID,'username')password_input= (By.ID, 'password')submit_button =(By.ID,'submit')#页面操作defopen(self, url):self.driver.get(url)definput_username(self, username):self.driver.find_element(*self.username_input).send_keys(username)def input_password(self, password):self.driver.find_element(*self.password_input).send_keys(password)defclick_submit(self):self.driver.find_element(*self.submit_button).click()
```###4.编写测试用例在testsuites目录下创建测试用例文件(如test_login.py):```pythonimportunittestfrom pageobjects.login_page importLoginPagefromcommon.test_base importTestBaseclassTestLogin(TestBase):#继承TestBasedef test_login_success(self):"""测试成功登录"""login_page =LoginPage(self.driver)login_page.open("http://example.com/login")login_page.input_username("valid_user")login_page.input_password("valid_pass")login_page.click_submit()#断言登录成功后的页面元素self.assertIn("Welcome", self.driver.page_source)deftest_login_fail(self):"""测试失败登录"""login_page =LoginPage(self.driver)login_page.open("http://example.com/login")login_page.input_username("invalid_user")login_page.input_password("invalid_pass")login_page.click_submit()error_text= self.driver.find_element_by_id("error").textself.assertTrue(error_text, "登录失败提示未出现")if __name__== '__main__':unittest.main()```
###5.构建测试套件并生成报告使用`HTMLTestRunner`生成报告(需下载HTMLTestRunner.py并放入项目)。创建`run.py`:
```pythonimport unittestimporttimeimport osfromHTMLTestRunner importHTMLTestRunner#定义测试用例目录test_dir ='testsuites'discover =unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')if __name__== "__main__":#创建报告目录day =time.strftime("%Y-%m-%d",time.localtime(time.time()))report_dir =f"report/{day}"ifnot os.path.exists(report_dir):os.makedirs(report_dir)now= time.strftime("%Y%m%d%H%M%S",time.localtime(time.time()))report_file =f"{report_dir}/{now}_report.html"withopen(report_file, 'wb')as f:runner =HTMLTestRunner(stream=f,title='自动化测试报告',description='测试详情')runner.run(discover)```
###6.运行执行`run.py`,测试报告将生成在report目录下。
###注意事项-测试用例方法必须以`test_`开头。-页面对象模式(PageObject)有助于代码复用和维护。
-报告模块`HTMLTestRunner`需要自行下载(网上搜索下载,或使用其他报告库如BeautifulReport,参考引用[3])。通过以上步骤,一个基本的自动化测试框架就搭建完成了。§§相关问题§§1.如何优化Selenium测试的执行速度?2.如何在测试失败时自动截图?3.如何将测试报告通过邮件发送?
4.如何处理测试中的动态元素?5.如何实现数据驱动测试?</think>### 基于Python+Selenium+Unittest的自动化测试框架搭建指南
#### 1. **环境准备**
- 安装Python(建议3.7+)
- 安装依赖库:
```bash
pip install selenium unittest html-testRunner beautifulreport
```
- 下载浏览器驱动(如ChromeDriver)并配置环境变量[^1]
#### 2. **项目结构设计**
```markdown
project/
├── common/ # 公共模块
│ ├── test_base.py # 测试基类
│ └── config.py # 配置文件
├── pageobjects/ # 页面对象模型
│ └── baidu_page.py # 页面操作封装
├── testsuites/ # 测试用例集
│ └── test_search.py # 测试用例
├── report/ # 测试报告目录
└── run.py # 主执行文件
```
#### 3. **核心代码实现**
**(1) 测试基类 (common/test_base.py)**
```python
import unittest
from selenium import webdriver
import time, os
class TestBase(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.implicitly_wait(10)
cls.driver.maximize_window()
@classmethod
def tearDownClass(cls):
time.sleep(3)
cls.driver.quit()
def get_windows_img(self):
"""截图方法"""
day = time.strftime("%Y-%m-%d", time.localtime(time.time()))
screenshot_path = f"report/{day}/screenshots/"
if not os.path.exists(screenshot_path):
os.makedirs(screenshot_path)
now = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))
self.driver.save_screenshot(f"{screenshot_path}{now}.png")
```
**(2) 页面对象封装 (pageobjects/baidu_page.py)**
```python
class BaiduPage:
def __init__(self, driver):
self.driver = driver
def open(self, url):
self.driver.get(url)
def input_keyword(self, keyword):
search_box = self.driver.find_element("id", "kw")
search_box.clear()
search_box.send_keys(keyword)
def click_search(self):
self.driver.find_element("id", "su").click()
def get_title(self):
return self.driver.title
```
**(3) 测试用例 (testsuites/test_search.py)**
```python
from common.test_base import TestBase
from pageobjects.baidu_page import BaiduPage
class TestSearch(TestBase):
def test_baidu_search(self):
"""百度搜索测试"""
page = BaiduPage(self.driver)
page.open("https://www.baidu.com")
page.input_keyword("Selenium")
page.click_search()
self.get_windows_img() # 调用截图方法
self.assertIn("Selenium", self.driver.title)
```
**(4) 测试执行入口 (run.py)**
```python
import unittest
import time
from BeautifulReport import BeautifulReport
if __name__ == '__main__':
# 定义测试套件
test_suite = unittest.defaultTestLoader.discover(
start_dir='testsuites',
pattern='test_*.py'
)
# 生成报告
day = time.strftime("%Y-%m-%d", time.localtime(time.time()))
report_dir = f"report/{day}"
result = BeautifulReport(test_suite)
result.report(
filename=f"自动化测试报告_{time.strftime('%H%M%S')}",
description='UI自动化测试',
report_dir=report_dir
)
```
#### 4. **关键设计原则**
1. **PO模式(Page Object)**
将页面元素定位和操作封装成独立类,实现测试脚本与页面元素的解耦[^2]
2. **测试分层结构**
- 基础层:`test_base.py` 处理浏览器初始化和公共方法
- 页面层:页面操作封装
- 用例层:业务测试逻辑
- 执行层:测试组织和报告生成
3. **测试报告优化**
使用`BeautifulReport`生成可视化HTML报告,包含:
- 测试通过率统计
- 失败用例截图
- 详细执行日志[^3]
#### 5. **执行流程**
1. 运行`python run.py`启动测试
2. 自动加载`testsuites`目录下所有`test_*.py`文件
3. 生成带时间戳的HTML测试报告
4. 失败用例自动截图保存到`report/日期/screenshots/`
#### 6. **常见问题解决**
- **元素定位失败**:增加隐式等待`implicitly_wait`
- **浏览器兼容性**:在`test_base.py`中扩展浏览器支持
- **并行测试**:使用`unittest`的`TestLoader`并发执行[^4]
> 框架扩展建议:可集成邮件通知(SMTP)、持续集成(Jenkins)和数据库验证模块[^5]