1. 项目概述为什么需要一个标准化的自动化测试环境如果你是一名Web开发者或者测试工程师每天手动在Chrome、Firefox、Safari以及各种版本的浏览器上重复点击、输入、验证很快就会感到疲惫不堪且效率低下。更别提还要考虑不同操作系统Windows、macOS、Linux和屏幕分辨率下的兼容性问题。这就是Web自动化测试存在的意义用代码模拟人的操作让机器不知疲倦地、精确地执行重复性测试任务。但“工欲善其事必先利其器”。一个稳定、可复现、隔离的开发环境是开展高效自动化测试的基石。想象一下你写好的脚本在你自己电脑上跑得好好的一换到同事的机器上就各种报错——可能是Python版本不对可能是浏览器驱动不匹配也可能是系统依赖缺失。这种“在我机器上好好的”问题会严重拖慢团队协作和项目进度。因此搭建一个“开箱即用”的Python Web自动化测试开发环境核心目标就三个一致性、隔离性、可移植性。通过本次环境搭建你将得到一个包含所有必要工具和依赖的“沙箱”无论是用于学习Selenium、Playwright等框架还是进行实际的自动化脚本开发都能确保基础环境统一避免无谓的“环境坑”。2. 环境整体设计与工具选型思路搭建一个完整的自动化测试环境远不止安装一个Python和Selenium那么简单。我们需要一个层次清晰、彼此隔离的软件栈。我的设计思路是“从内到外层层封装”2.1 核心层Python与测试框架这是大脑和心脏。Python因其简洁和丰富的库生态成为自动化测试的首选。我们将安装特定版本的Python如3.8或3.9兼顾稳定性和新特性并搭配pip进行包管理。核心测试框架选择Selenium因为它成熟、稳定、社区庞大是Web自动化的行业标准。同时为了更好的测试管理和报告我们通常会引入pytest作为测试运行器它比Python自带的unittest更灵活强大。2.2 驱动层浏览器与WebDriver这是手脚。Selenium需要通过一个名为WebDriver的中间件来操控真实的浏览器。因此我们需要安装你需要的浏览器如Chrome、Firefox。下载对应浏览器版本的WebDriver如chromedriver、geckodriver并将其路径配置到系统环境变量中。这是最常见的报错点之一版本必须严格对应。2.3 隔离层虚拟环境Virtual Environment这是防护服。直接用系统Python安装包会导致全局污染项目间的依赖可能冲突。使用venv或conda创建独立的Python虚拟环境每个项目的依赖都封闭在自己的小世界里互不干扰。这是Python开发的最佳实践必须遵守。2.4 沙箱层虚拟机Virtual Machine这是终极隔离与复现方案。为什么需要虚拟机环境一致性将配置好的整个系统包括Python、浏览器、驱动、甚至IDE打包成一个虚拟机镜像。任何团队成员拿到这个镜像都能瞬间获得一个和你一模一样的开发环境。跨平台测试你可以在Windows宿主机上运行一个Linux虚拟机轻松测试网页在LinuxFirefox下的表现无需准备多台物理机。安全性测试脚本有时会访问不明确的网站或进行一些破坏性操作在虚拟机中进行可以完全隔离风险不会影响宿主机。基于以上思路我选择VMware Workstation Player免费版作为虚拟机软件并准备一个Ubuntu 22.04 LTS的镜像。Ubuntu是Linux发行版中的主流资料丰富且对开发工具支持友好。3. 核心组件安装与配置详解接下来我们进入实操环节。我会以在Windows宿主机上创建一个Ubuntu虚拟机并在其中搭建完整环境为例详细说明每一步。3.1 阶段一准备虚拟机与Ubuntu系统下载安装VMware Workstation Player从官网下载免费版本并安装。安装过程简单一直点击“下一步”即可。获取Ubuntu镜像前往Ubuntu官网下载22.04 LTS版本的ISO镜像文件.iso格式。创建新虚拟机打开VMware选择“创建新虚拟机”。选择“安装程序光盘映像文件”指向你下载的Ubuntu ISO文件。输入你的姓名、用户名、密码。这些将是你Ubuntu系统的登录凭证。为虚拟机命名如PythonWebAutoTest并选择存储位置建议放在剩余空间大的磁盘。指定磁盘容量。对于我们的开发环境建议不少于40GB选择“将虚拟磁盘拆分成多个文件”。在“自定义硬件”中建议将内存调整为至少4GB处理器数量调整为2这样能保证虚拟机运行流畅。安装Ubuntu系统启动虚拟机它将从ISO镜像引导。跟随图形化安装界面完成Ubuntu的安装。安装完成后重启虚拟机用你设置的用户名密码登录。注意安装过程中务必勾选“安装Ubuntu时下载更新”和“安装第三方图形和Wi-Fi驱动……”这能节省后续大量手动配置的时间。3.2 阶段二在Ubuntu中搭建Python开发环境登录Ubuntu后打开终端CtrlAltT。更新系统包管理器这是安装任何软件前的良好习惯。sudo apt update sudo apt upgrade -y安装Python3和pipUbuntu 22.04 默认已安装Python3但我们需要确保pip也已安装。sudo apt install python3-pip -y验证安装python3 --version pip3 --version创建项目目录和虚拟环境mkdir ~/web_auto_test cd ~/web_auto_test python3 -m venv venv这会在项目目录下创建一个名为venv的虚拟环境文件夹。激活虚拟环境source venv/bin/activate激活后你的命令行提示符前会出现(venv)字样表示你已进入该虚拟环境后续所有pip安装的包都将只存在于这个环境中。3.3 阶段三安装自动化测试核心库在激活的虚拟环境中执行以下命令pip install selenium pip install pytest pip install pytest-html # 用于生成HTML测试报告 pip install webdriver-manager # 强烈推荐自动管理浏览器驱动解决版本匹配难题selenium: Web自动化核心库。pytestpytest-html: 测试组织和报告。webdriver-manager: 这是一个神器。它会在你第一次运行脚本时自动下载匹配你浏览器版本的WebDriver无需手动查找和配置路径。3.4 阶段四安装浏览器与配置驱动安装Chrome浏览器wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - sudo sh -c echo deb [archamd64] http://dl.google.com/linux/chrome/deb/ stable main /etc/apt/sources.list.d/google-chrome.list sudo apt update sudo apt install google-chrome-stable -y安装后可以通过google-chrome --version查看版本。安装Firefox浏览器Ubuntu默认已安装Firefox如果需要最新版可使用以下命令sudo apt install firefox -y驱动配置使用webdriver-manager这是关键步骤。我们不需要手动下载驱动。创建一个测试脚本test_driver.py来验证# test_driver.py from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from webdriver_manager.firefox import GeckoDriverManager # 测试Chrome print(正在设置Chrome驱动...) service Service(ChromeDriverManager().install()) driver webdriver.Chrome(serviceservice) driver.get(https://www.baidu.com) print(fChrome 标题: {driver.title}) driver.quit() # 测试Firefox print(正在设置Firefox驱动...) service Service(GeckoDriverManager().install()) driver webdriver.Firefox(serviceservice) driver.get(https://www.baidu.com) print(fFirefox 标题: {driver.title}) driver.quit()运行这个脚本python test_driver.pywebdriver-manager会自动检测系统已安装的浏览器版本并下载对应的驱动。第一次运行会稍慢因为需要下载驱动。如果看到浏览器被成功打开并打印出百度首页的标题恭喜你最棘手的驱动问题已经解决了3.5 阶段五安装与配置集成开发环境VSCode在终端里写代码效率不高我们需要一个强大的IDE。安装VSCodesudo snap install --classic code安装Python扩展打开VSCode在终端输入code或在应用菜单中找到。点击左侧活动栏的扩展图标或按CtrlShiftX。搜索并安装“Python”扩展由Microsoft发布。配置VSCode使用虚拟环境在VSCode中打开我们的项目文件夹~/web_auto_test。按CtrlShiftP打开命令面板输入“Python: Select Interpreter”。选择显示路径中包含venv的解释器例如~/web_auto_test/venv/bin/python。这样VSCode就会使用虚拟环境中的Python和已安装的库提供代码补全、语法检查等功能。推荐安装的VSCode扩展Pylance: 微软出品强大的Python语言服务器提供超快的代码补全和类型检查。Python Test Explorer: 在侧边栏提供图形化测试界面方便运行和调试pytest用例。4. 编写你的第一个自动化测试脚本与项目结构环境搭好了我们来跑一个真正的测试并规划一个清晰的项目结构。4.1 创建标准的项目目录在web_auto_test目录下创建如下结构web_auto_test/ ├── venv/ # 虚拟环境目录由python -m venv生成 ├── drivers/ # 可选如需手动放置驱动放这里 ├── tests/ # 存放所有测试用例 │ ├── __init__.py │ ├── conftest.py # pytest共享配置和fixture │ └── test_baidu_search.py # 示例测试文件 ├── pages/ # Page Object模式存放页面类 │ ├── __init__.py │ └── baidu_page.py ├── utils/ # 工具函数如日志、配置文件读取 │ ├── __init__.py │ └── logger.py ├── reports/ # 存放生成的测试报告 ├── requirements.txt # 项目依赖清单 └── README.md # 项目说明4.2 编写Page Object示例pages/baidu_page.py:from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class BaiduPage: def __init__(self, driver): self.driver driver self.wait WebDriverWait(driver, 10) self.search_input (By.ID, kw) self.search_button (By.ID, su) def open(self): self.driver.get(https://www.baidu.com) return self def search_for(self, keyword): # 显式等待搜索框出现并输入 input_box self.wait.until(EC.presence_of_element_located(self.search_input)) input_box.clear() input_box.send_keys(keyword) # 点击搜索按钮 self.driver.find_element(*self.search_button).click() return self def get_title(self): return self.driver.title4.3 编写测试用例tests/test_baidu_search.py:import pytest from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from pages.baidu_page import BaiduPage pytest.fixture(scopefunction) def driver(): # 使用fixture管理driver生命周期 service Service(ChromeDriverManager().install()) _driver webdriver.Chrome(serviceservice) _driver.implicitly_wait(5) # 隐式等待 yield _driver _driver.quit() # 测试结束后退出浏览器 def test_baidu_search_title(driver): 测试百度搜索后标题包含关键词 page BaiduPage(driver).open() page.search_for(Selenium自动化测试) assert Selenium自动化测试 in driver.title def test_baidu_search_results(driver): 测试搜索后页面有结果展示通过判断特定元素存在 from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC page BaiduPage(driver).open() page.search_for(Python) # 等待结果容器出现 result_stats WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, content_left)) ) assert result_stats is not None4.4 运行测试并生成报告在项目根目录下运行# 运行所有测试 pytest # 运行特定测试文件 pytest tests/test_baidu_search.py # 运行并生成HTML报告 pytest --htmlreports/report.html --self-contained-html运行后打开reports/report.html你就能看到一个清晰的测试结果报告包括通过/失败的用例、执行时间、错误日志等。5. 虚拟机环境封装与分享至此我们已经在Ubuntu虚拟机内搭建了一个完整的、可工作的自动化测试环境。但它的价值在于可复制和分享。5.1 清理与瘦身虚拟机在打包前建议进行一些清理减小镜像体积sudo apt autoremove -y sudo apt clean # 清理pip缓存 pip cache purge # 可选清空浏览器缓存等5.2 在VMware中封装虚拟机在VMware中关闭Ubuntu虚拟机。选中该虚拟机点击“管理” - “清理磁盘”。这可以回收未使用的磁盘空间。最重要的一步点击“管理” -“克隆”。在克隆类型中选择“创建完整克隆”。这将生成一个全新的、独立的虚拟机文件。将克隆出来的虚拟机文件夹通常包含.vmx和.vmdk等文件压缩打包。这个压缩包就是你最终可以分享的“安装包与虚拟机环境”。5.3 使用分享的虚拟机你的同事拿到压缩包后只需解压。使用VMware Workstation Player的“打开虚拟机”功能选择解压后的.vmx文件。启动虚拟机使用你预设的用户名密码登录。打开终端进入~/web_auto_test目录激活虚拟环境(source venv/bin/activate)即可直接运行pytest开始编写和执行自动化测试无需任何额外配置。6. 常见问题与排查技巧实录即便按照步骤操作你也可能会遇到一些坑。以下是我在实际搭建中总结的常见问题及解决方案6.1 WebDriver版本不匹配问题症状SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version ...根因手动下载的chromedriver与系统安装的Chrome浏览器版本不一致。解决首选方案坚持使用webdriver-manager让它自动处理。手动方案查看浏览器版本google-chrome --version去ChromeDriver官网下载完全一致的主版本号驱动。将驱动放入/usr/local/bin或项目drivers/目录并在代码中指定路径Service(executable_path./drivers/chromedriver)。6.2 虚拟机无法上网症状在虚拟机内apt update或pip install失败。排查检查VMware网络适配器设置是否为“NAT模式”最通用。在Ubuntu中尝试ping 8.8.8.8。如果通是DNS问题编辑/etc/resolv.conf添加nameserver 8.8.8.8。如果不通在VMware菜单栏点击“编辑”-“虚拟网络编辑器”恢复默认设置。6.3 Selenium脚本在无图形界面服务器运行报错症状在纯命令行无显示器的Linux服务器上运行脚本报错selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary或与显示相关的错误。解决需要安装虚拟显示服务器Xvfb并使用无头模式。sudo apt install xvfb -y pip install pyvirtualdisplay修改你的测试代码在创建driver前启动虚拟显示from pyvirtualdisplay import Display display Display(visible0, size(1920, 1080)) display.start() # ... 你的测试代码 ... driver.quit() display.stop()或者更简单的方法是直接使用浏览器的无头模式选项from selenium.webdriver.chrome.options import Options options Options() options.add_argument(--headless) # 无头模式 options.add_argument(--no-sandbox) # 在服务器环境下常需要 options.add_argument(--disable-dev-shm-usage) driver webdriver.Chrome(optionsoptions, serviceservice)6.4 元素定位失败脚本不稳定症状脚本有时能运行有时报NoSuchElementException。根因网络或页面加载速度导致元素还未出现就尝试操作。解决弃用time.sleep这是不好的实践会造成不必要的等待。多用显式等待如前面示例中的WebDriverWait配合expected_conditions。这是Selenium最佳实践的核心。优化定位器优先使用稳定的id、name。其次是用CSS Selector或XPath。避免使用绝对XPath尽量使用相对路径和属性组合。6.5 虚拟机性能优化症状虚拟机运行卡顿。解决为虚拟机分配更多内存如8GB和CPU核心如4个。在VMware设置中为显卡分配更多显存。在Ubuntu内部使用轻量级桌面环境如Xfce而非默认的GNOME。最后分享一个我个人常用的环境检查脚本check_env.py在新环境或分享给他人后运行它可以快速验证所有组件是否就绪import sys import subprocess def run_cmd(cmd): try: result subprocess.run(cmd, shellTrue, capture_outputTrue, textTrue, checkTrue) return result.stdout.strip() except subprocess.CalledProcessError as e: return fERROR: {e.stderr.strip()} print( Python Web自动化测试环境检查 ) print(fPython 版本: {sys.version}) print(fPip 版本: {run_cmd(pip3 --version)}) # 检查关键包 packages [selenium, pytest, webdriver-manager] for pkg in packages: try: exec(fimport {pkg.split(-)[0].replace(., _)}) print(f{pkg}: 已安装) except ImportError: print(f{pkg}: 未安装) # 检查浏览器 print(f\nChrome 版本: {run_cmd(google-chrome --version)}) print(fFirefox 版本: {run_cmd(firefox --version)}) print(\n环境检查完成。如有ERROR或未安装请根据上述指南进行配置。)把这个脚本放在项目根目录任何时候运行python check_env.py都能对环境健康状况一目了然。
基于虚拟机的Python Web自动化测试环境搭建与配置指南
发布时间:2026/7/3 10:10:20
1. 项目概述为什么需要一个标准化的自动化测试环境如果你是一名Web开发者或者测试工程师每天手动在Chrome、Firefox、Safari以及各种版本的浏览器上重复点击、输入、验证很快就会感到疲惫不堪且效率低下。更别提还要考虑不同操作系统Windows、macOS、Linux和屏幕分辨率下的兼容性问题。这就是Web自动化测试存在的意义用代码模拟人的操作让机器不知疲倦地、精确地执行重复性测试任务。但“工欲善其事必先利其器”。一个稳定、可复现、隔离的开发环境是开展高效自动化测试的基石。想象一下你写好的脚本在你自己电脑上跑得好好的一换到同事的机器上就各种报错——可能是Python版本不对可能是浏览器驱动不匹配也可能是系统依赖缺失。这种“在我机器上好好的”问题会严重拖慢团队协作和项目进度。因此搭建一个“开箱即用”的Python Web自动化测试开发环境核心目标就三个一致性、隔离性、可移植性。通过本次环境搭建你将得到一个包含所有必要工具和依赖的“沙箱”无论是用于学习Selenium、Playwright等框架还是进行实际的自动化脚本开发都能确保基础环境统一避免无谓的“环境坑”。2. 环境整体设计与工具选型思路搭建一个完整的自动化测试环境远不止安装一个Python和Selenium那么简单。我们需要一个层次清晰、彼此隔离的软件栈。我的设计思路是“从内到外层层封装”2.1 核心层Python与测试框架这是大脑和心脏。Python因其简洁和丰富的库生态成为自动化测试的首选。我们将安装特定版本的Python如3.8或3.9兼顾稳定性和新特性并搭配pip进行包管理。核心测试框架选择Selenium因为它成熟、稳定、社区庞大是Web自动化的行业标准。同时为了更好的测试管理和报告我们通常会引入pytest作为测试运行器它比Python自带的unittest更灵活强大。2.2 驱动层浏览器与WebDriver这是手脚。Selenium需要通过一个名为WebDriver的中间件来操控真实的浏览器。因此我们需要安装你需要的浏览器如Chrome、Firefox。下载对应浏览器版本的WebDriver如chromedriver、geckodriver并将其路径配置到系统环境变量中。这是最常见的报错点之一版本必须严格对应。2.3 隔离层虚拟环境Virtual Environment这是防护服。直接用系统Python安装包会导致全局污染项目间的依赖可能冲突。使用venv或conda创建独立的Python虚拟环境每个项目的依赖都封闭在自己的小世界里互不干扰。这是Python开发的最佳实践必须遵守。2.4 沙箱层虚拟机Virtual Machine这是终极隔离与复现方案。为什么需要虚拟机环境一致性将配置好的整个系统包括Python、浏览器、驱动、甚至IDE打包成一个虚拟机镜像。任何团队成员拿到这个镜像都能瞬间获得一个和你一模一样的开发环境。跨平台测试你可以在Windows宿主机上运行一个Linux虚拟机轻松测试网页在LinuxFirefox下的表现无需准备多台物理机。安全性测试脚本有时会访问不明确的网站或进行一些破坏性操作在虚拟机中进行可以完全隔离风险不会影响宿主机。基于以上思路我选择VMware Workstation Player免费版作为虚拟机软件并准备一个Ubuntu 22.04 LTS的镜像。Ubuntu是Linux发行版中的主流资料丰富且对开发工具支持友好。3. 核心组件安装与配置详解接下来我们进入实操环节。我会以在Windows宿主机上创建一个Ubuntu虚拟机并在其中搭建完整环境为例详细说明每一步。3.1 阶段一准备虚拟机与Ubuntu系统下载安装VMware Workstation Player从官网下载免费版本并安装。安装过程简单一直点击“下一步”即可。获取Ubuntu镜像前往Ubuntu官网下载22.04 LTS版本的ISO镜像文件.iso格式。创建新虚拟机打开VMware选择“创建新虚拟机”。选择“安装程序光盘映像文件”指向你下载的Ubuntu ISO文件。输入你的姓名、用户名、密码。这些将是你Ubuntu系统的登录凭证。为虚拟机命名如PythonWebAutoTest并选择存储位置建议放在剩余空间大的磁盘。指定磁盘容量。对于我们的开发环境建议不少于40GB选择“将虚拟磁盘拆分成多个文件”。在“自定义硬件”中建议将内存调整为至少4GB处理器数量调整为2这样能保证虚拟机运行流畅。安装Ubuntu系统启动虚拟机它将从ISO镜像引导。跟随图形化安装界面完成Ubuntu的安装。安装完成后重启虚拟机用你设置的用户名密码登录。注意安装过程中务必勾选“安装Ubuntu时下载更新”和“安装第三方图形和Wi-Fi驱动……”这能节省后续大量手动配置的时间。3.2 阶段二在Ubuntu中搭建Python开发环境登录Ubuntu后打开终端CtrlAltT。更新系统包管理器这是安装任何软件前的良好习惯。sudo apt update sudo apt upgrade -y安装Python3和pipUbuntu 22.04 默认已安装Python3但我们需要确保pip也已安装。sudo apt install python3-pip -y验证安装python3 --version pip3 --version创建项目目录和虚拟环境mkdir ~/web_auto_test cd ~/web_auto_test python3 -m venv venv这会在项目目录下创建一个名为venv的虚拟环境文件夹。激活虚拟环境source venv/bin/activate激活后你的命令行提示符前会出现(venv)字样表示你已进入该虚拟环境后续所有pip安装的包都将只存在于这个环境中。3.3 阶段三安装自动化测试核心库在激活的虚拟环境中执行以下命令pip install selenium pip install pytest pip install pytest-html # 用于生成HTML测试报告 pip install webdriver-manager # 强烈推荐自动管理浏览器驱动解决版本匹配难题selenium: Web自动化核心库。pytestpytest-html: 测试组织和报告。webdriver-manager: 这是一个神器。它会在你第一次运行脚本时自动下载匹配你浏览器版本的WebDriver无需手动查找和配置路径。3.4 阶段四安装浏览器与配置驱动安装Chrome浏览器wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - sudo sh -c echo deb [archamd64] http://dl.google.com/linux/chrome/deb/ stable main /etc/apt/sources.list.d/google-chrome.list sudo apt update sudo apt install google-chrome-stable -y安装后可以通过google-chrome --version查看版本。安装Firefox浏览器Ubuntu默认已安装Firefox如果需要最新版可使用以下命令sudo apt install firefox -y驱动配置使用webdriver-manager这是关键步骤。我们不需要手动下载驱动。创建一个测试脚本test_driver.py来验证# test_driver.py from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from webdriver_manager.firefox import GeckoDriverManager # 测试Chrome print(正在设置Chrome驱动...) service Service(ChromeDriverManager().install()) driver webdriver.Chrome(serviceservice) driver.get(https://www.baidu.com) print(fChrome 标题: {driver.title}) driver.quit() # 测试Firefox print(正在设置Firefox驱动...) service Service(GeckoDriverManager().install()) driver webdriver.Firefox(serviceservice) driver.get(https://www.baidu.com) print(fFirefox 标题: {driver.title}) driver.quit()运行这个脚本python test_driver.pywebdriver-manager会自动检测系统已安装的浏览器版本并下载对应的驱动。第一次运行会稍慢因为需要下载驱动。如果看到浏览器被成功打开并打印出百度首页的标题恭喜你最棘手的驱动问题已经解决了3.5 阶段五安装与配置集成开发环境VSCode在终端里写代码效率不高我们需要一个强大的IDE。安装VSCodesudo snap install --classic code安装Python扩展打开VSCode在终端输入code或在应用菜单中找到。点击左侧活动栏的扩展图标或按CtrlShiftX。搜索并安装“Python”扩展由Microsoft发布。配置VSCode使用虚拟环境在VSCode中打开我们的项目文件夹~/web_auto_test。按CtrlShiftP打开命令面板输入“Python: Select Interpreter”。选择显示路径中包含venv的解释器例如~/web_auto_test/venv/bin/python。这样VSCode就会使用虚拟环境中的Python和已安装的库提供代码补全、语法检查等功能。推荐安装的VSCode扩展Pylance: 微软出品强大的Python语言服务器提供超快的代码补全和类型检查。Python Test Explorer: 在侧边栏提供图形化测试界面方便运行和调试pytest用例。4. 编写你的第一个自动化测试脚本与项目结构环境搭好了我们来跑一个真正的测试并规划一个清晰的项目结构。4.1 创建标准的项目目录在web_auto_test目录下创建如下结构web_auto_test/ ├── venv/ # 虚拟环境目录由python -m venv生成 ├── drivers/ # 可选如需手动放置驱动放这里 ├── tests/ # 存放所有测试用例 │ ├── __init__.py │ ├── conftest.py # pytest共享配置和fixture │ └── test_baidu_search.py # 示例测试文件 ├── pages/ # Page Object模式存放页面类 │ ├── __init__.py │ └── baidu_page.py ├── utils/ # 工具函数如日志、配置文件读取 │ ├── __init__.py │ └── logger.py ├── reports/ # 存放生成的测试报告 ├── requirements.txt # 项目依赖清单 └── README.md # 项目说明4.2 编写Page Object示例pages/baidu_page.py:from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class BaiduPage: def __init__(self, driver): self.driver driver self.wait WebDriverWait(driver, 10) self.search_input (By.ID, kw) self.search_button (By.ID, su) def open(self): self.driver.get(https://www.baidu.com) return self def search_for(self, keyword): # 显式等待搜索框出现并输入 input_box self.wait.until(EC.presence_of_element_located(self.search_input)) input_box.clear() input_box.send_keys(keyword) # 点击搜索按钮 self.driver.find_element(*self.search_button).click() return self def get_title(self): return self.driver.title4.3 编写测试用例tests/test_baidu_search.py:import pytest from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from pages.baidu_page import BaiduPage pytest.fixture(scopefunction) def driver(): # 使用fixture管理driver生命周期 service Service(ChromeDriverManager().install()) _driver webdriver.Chrome(serviceservice) _driver.implicitly_wait(5) # 隐式等待 yield _driver _driver.quit() # 测试结束后退出浏览器 def test_baidu_search_title(driver): 测试百度搜索后标题包含关键词 page BaiduPage(driver).open() page.search_for(Selenium自动化测试) assert Selenium自动化测试 in driver.title def test_baidu_search_results(driver): 测试搜索后页面有结果展示通过判断特定元素存在 from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC page BaiduPage(driver).open() page.search_for(Python) # 等待结果容器出现 result_stats WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, content_left)) ) assert result_stats is not None4.4 运行测试并生成报告在项目根目录下运行# 运行所有测试 pytest # 运行特定测试文件 pytest tests/test_baidu_search.py # 运行并生成HTML报告 pytest --htmlreports/report.html --self-contained-html运行后打开reports/report.html你就能看到一个清晰的测试结果报告包括通过/失败的用例、执行时间、错误日志等。5. 虚拟机环境封装与分享至此我们已经在Ubuntu虚拟机内搭建了一个完整的、可工作的自动化测试环境。但它的价值在于可复制和分享。5.1 清理与瘦身虚拟机在打包前建议进行一些清理减小镜像体积sudo apt autoremove -y sudo apt clean # 清理pip缓存 pip cache purge # 可选清空浏览器缓存等5.2 在VMware中封装虚拟机在VMware中关闭Ubuntu虚拟机。选中该虚拟机点击“管理” - “清理磁盘”。这可以回收未使用的磁盘空间。最重要的一步点击“管理” -“克隆”。在克隆类型中选择“创建完整克隆”。这将生成一个全新的、独立的虚拟机文件。将克隆出来的虚拟机文件夹通常包含.vmx和.vmdk等文件压缩打包。这个压缩包就是你最终可以分享的“安装包与虚拟机环境”。5.3 使用分享的虚拟机你的同事拿到压缩包后只需解压。使用VMware Workstation Player的“打开虚拟机”功能选择解压后的.vmx文件。启动虚拟机使用你预设的用户名密码登录。打开终端进入~/web_auto_test目录激活虚拟环境(source venv/bin/activate)即可直接运行pytest开始编写和执行自动化测试无需任何额外配置。6. 常见问题与排查技巧实录即便按照步骤操作你也可能会遇到一些坑。以下是我在实际搭建中总结的常见问题及解决方案6.1 WebDriver版本不匹配问题症状SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version ...根因手动下载的chromedriver与系统安装的Chrome浏览器版本不一致。解决首选方案坚持使用webdriver-manager让它自动处理。手动方案查看浏览器版本google-chrome --version去ChromeDriver官网下载完全一致的主版本号驱动。将驱动放入/usr/local/bin或项目drivers/目录并在代码中指定路径Service(executable_path./drivers/chromedriver)。6.2 虚拟机无法上网症状在虚拟机内apt update或pip install失败。排查检查VMware网络适配器设置是否为“NAT模式”最通用。在Ubuntu中尝试ping 8.8.8.8。如果通是DNS问题编辑/etc/resolv.conf添加nameserver 8.8.8.8。如果不通在VMware菜单栏点击“编辑”-“虚拟网络编辑器”恢复默认设置。6.3 Selenium脚本在无图形界面服务器运行报错症状在纯命令行无显示器的Linux服务器上运行脚本报错selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary或与显示相关的错误。解决需要安装虚拟显示服务器Xvfb并使用无头模式。sudo apt install xvfb -y pip install pyvirtualdisplay修改你的测试代码在创建driver前启动虚拟显示from pyvirtualdisplay import Display display Display(visible0, size(1920, 1080)) display.start() # ... 你的测试代码 ... driver.quit() display.stop()或者更简单的方法是直接使用浏览器的无头模式选项from selenium.webdriver.chrome.options import Options options Options() options.add_argument(--headless) # 无头模式 options.add_argument(--no-sandbox) # 在服务器环境下常需要 options.add_argument(--disable-dev-shm-usage) driver webdriver.Chrome(optionsoptions, serviceservice)6.4 元素定位失败脚本不稳定症状脚本有时能运行有时报NoSuchElementException。根因网络或页面加载速度导致元素还未出现就尝试操作。解决弃用time.sleep这是不好的实践会造成不必要的等待。多用显式等待如前面示例中的WebDriverWait配合expected_conditions。这是Selenium最佳实践的核心。优化定位器优先使用稳定的id、name。其次是用CSS Selector或XPath。避免使用绝对XPath尽量使用相对路径和属性组合。6.5 虚拟机性能优化症状虚拟机运行卡顿。解决为虚拟机分配更多内存如8GB和CPU核心如4个。在VMware设置中为显卡分配更多显存。在Ubuntu内部使用轻量级桌面环境如Xfce而非默认的GNOME。最后分享一个我个人常用的环境检查脚本check_env.py在新环境或分享给他人后运行它可以快速验证所有组件是否就绪import sys import subprocess def run_cmd(cmd): try: result subprocess.run(cmd, shellTrue, capture_outputTrue, textTrue, checkTrue) return result.stdout.strip() except subprocess.CalledProcessError as e: return fERROR: {e.stderr.strip()} print( Python Web自动化测试环境检查 ) print(fPython 版本: {sys.version}) print(fPip 版本: {run_cmd(pip3 --version)}) # 检查关键包 packages [selenium, pytest, webdriver-manager] for pkg in packages: try: exec(fimport {pkg.split(-)[0].replace(., _)}) print(f{pkg}: 已安装) except ImportError: print(f{pkg}: 未安装) # 检查浏览器 print(f\nChrome 版本: {run_cmd(google-chrome --version)}) print(fFirefox 版本: {run_cmd(firefox --version)}) print(\n环境检查完成。如有ERROR或未安装请根据上述指南进行配置。)把这个脚本放在项目根目录任何时候运行python check_env.py都能对环境健康状况一目了然。