Windows+Ubuntu双系统Python+Selenium自动化测试环境搭建指南
1. 项目概述为什么需要搭建双系统自动化测试环境作为一名常年混迹在开发和测试一线的老手我见过太多因为环境不一致导致的“灵异事件”。你的脚本在Windows上跑得飞起一到Linux服务器上就各种报错不是驱动不对就是路径问题或者某个库的版本有细微差异。这种“在我机器上好好的”问题排查起来最是头疼。所以搭建一个Windows/Linux双系统环境并在两个系统上配置一套完全一致的PythonSeleniumFirefox测试环境就成了一个非常务实且高效的选择。这不仅仅是“装两个系统”那么简单。它的核心价值在于环境一致性验证和跨平台兼容性保障。无论是开发Web自动化测试脚本、数据爬虫还是进行CI/CD流水线的前期验证你都可以先在本地双系统中模拟测试确保核心逻辑在两大主流桌面操作系统上都能完美运行再部署到生产环境从而大幅降低后期调试成本。本次搭建的目标是在Windows 11和Ubuntu 22.04 LTS双系统上分别安装Python 3.10、Selenium 4并配置最新版Firefox浏览器及对应的GeckoDriver驱动最终实现一套脚本无需修改即可在双系统间切换执行。2. 双系统安装与基础环境规划在开始配置具体的开发环境之前一个稳定、互不干扰的双系统基础是前提。这里我选择“Windows 11 Ubuntu 22.04 LTS”的组合原因是Win11作为主流桌面环境Ubuntu 22.04 LTS则拥有长期支持且社区资源丰富非常适合作为开发与测试的Linux端。2.1 安装方案选择与分区规划双系统安装主要有两种思路先Windows后Linux或者使用虚拟机。对于需要直接调用显卡虽然Selenium不必须或追求原生性能的测试场景物理双系统是更佳选择。强烈推荐“先安装Windows后安装Ubuntu”因为Windows的引导程序较为“霸道”后安装的Linux使用GRUB引导可以更友好地识别并加入Windows启动项。分区规划是重中之重操作失误会导致数据丢失。假设你有一块512GB的固态硬盘我的建议方案如下Windows系统分区 (C盘)约150GBNTFS格式。用于安装Windows 11和常用软件。Windows数据分区 (D盘)约150GBNTFS格式。存放Windows下的项目代码、文档等数据。Linux根分区 (/)约100GBEXT4格式。用于安装Ubuntu系统。Linux交换分区 (swap)约8GB与内存大小相当或略大即可。用于休眠和内存交换。Linux家目录分区 (/home)剩余所有空间约94GBEXT4格式。存放用户配置文件和个人数据。共享数据分区 (可选)可以再分出一个约50GB的NTFS或exFAT分区用于双系统之间交换大文件。exFAT格式两者都能直接读写更为方便。注意分区操作请在安装Ubuntu时使用“安装类型”选择“其他选项”进行手动分区。务必确认你操作的是正确的空闲空间并备份好原有硬盘上的重要数据。2.2 Ubuntu安装与启动项配置从Ubuntu官网下载22.04 LTS镜像使用Rufus或Ventoy制作启动U盘。重启电脑从U盘启动进入试用桌面后点击安装图标。关键步骤在于分区和启动引导器的安装。在手动分区界面按照上述规划创建分区。最关键的一步是“安装启动引导器的设备”的选择。这里不要选择某个分区如sda1而应该选择整个磁盘如/dev/sda。这样GRUB引导程序就会安装到硬盘的MBR/GPT引导记录中并自动探测到已有的Windows系统生成双系统选择菜单。安装完成后重启你应该能看到GRUB菜单列出了Ubuntu和Windows Boot Manager。选择即可进入对应系统。双系统时间同步问题这是一个经典坑点。Windows默认将硬件时钟视为本地时间RTC in local time而Linux/Unix视其为UTC时间。这会导致进入另一个系统时时间显示错误8小时假设你在东八区。解决方法是在Ubuntu中调整# 在Ubuntu终端中执行告诉系统硬件时钟使用本地时间 timedatectl set-local-rtc 1 --adjust-system-clock或者在Windows中修改注册表将硬件时钟改为UTC但前者在Ubuntu下操作更简单。3. Windows系统环境搭建详解搞定基础系统后我们开始配置环境。先从Windows开始因为它的图形化操作对多数人更友好。3.1 Python 3.10 安装与配置前往Python官网下载Windows安装包Windows installer (64-bit)。安装时有几个细节决定后续的便利性务必勾选“Add Python 3.10 to PATH”这会将Python和pip的路径添加到系统环境变量让你能在任何命令行窗口直接使用python和pip命令。选择“Customize installation”在可选功能中确保“pip”和“for all users”被选中。安装路径可以保持默认C:\Users\你的用户名\AppData\Local\Programs\Python\Python310也可以改为一个没有空格和中文的路径如C:\Python310后者更清晰。安装完成后打开命令提示符CMD或PowerShell验证安装python --version # 应输出Python 3.10.x pip --version # 应输出pip 22.x.x from ... (python 3.10)3.2 安装与配置Firefox及GeckoDriverSelenium 4推荐使用浏览器原生的驱动管理工具WebDriver Manager这极大简化了驱动管理。但为了理解原理和应对网络问题我们仍需要了解手动配置。安装Firefox从Mozilla官网下载最新版Firefox并安装。获取GeckoDriver前往GeckoDriver的GitHub发布页。下载与你的系统匹配的版本例如geckodriver-v0.34.0-win64.zip。注意版本号尽量选择较新的稳定版。配置GeckoDriver将下载的ZIP包中的geckodriver.exe解压出来。有三种配置方式方法A推荐临时将geckodriver.exe放在你的项目目录下。Selenium会优先在当前目录查找。方法B系统级将geckodriver.exe放入一个固定目录如C:\WebDriver\bin然后将该目录路径C:\WebDriver\bin添加到系统的PATH环境变量中。方法CPython脚本指定在代码中指定可执行文件路径service Service(executable_pathr‘C:\path\to\geckodriver.exe‘)。验证手动配置是否成功打开CMD输入geckodriver --version如果能输出版本信息则PATH配置正确。3.3 安装Selenium 4并验证环境在命令行中使用pip安装Selenium。建议使用清华源加速下载。pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple接下来创建一个简单的测试脚本test_firefox_win.py来验证整个环境from selenium import webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.firefox.options import Options import time # 方法1使用WebDriver Manager自动管理驱动推荐需额外安装 # from webdriver_manager.firefox import GeckoDriverManager # service Service(GeckoDriverManager().install()) # 方法2手动指定驱动路径如果已将geckodriver加入PATH则无需指定 # service Service(executable_pathr‘geckodriver.exe‘) # 假设驱动在当前目录 service Service() # 如果已在PATH中可以留空或省略 options Options() # options.add_argument(‘-headless‘) # 如需无头模式取消注释 driver webdriver.Firefox(serviceservice, optionsoptions) try: driver.get(‘https://www.baidu.com‘) print(‘页面标题‘, driver.title) time.sleep(2) # 等待2秒观察浏览器 # 进行一个简单操作比如搜索框输入 search_box driver.find_element(‘id‘, ‘kw‘) search_box.send_keys(‘Selenium Test‘) search_box.submit() time.sleep(2) print(‘当前URL‘, driver.current_url) finally: driver.quit() print(‘Firefox浏览器已关闭Windows环境测试通过‘)运行此脚本python test_firefox_win.py。如果成功弹出了Firefox浏览器并自动完成了打开百度、输入关键词、跳转的过程最后自动关闭那么你的Windows环境就搭建成功了。4. Linux (Ubuntu) 系统环境搭建详解重启进入Ubuntu系统。我们将通过终端命令行完成所有配置这是Linux的常态。4.1 Python 3.10 安装与Pip配置Ubuntu 22.04 默认可能已经安装了Python 3.10但可能不包含pip。我们通过以下命令安装和确认# 1. 更新软件包列表 sudo apt update # 2. 安装Python3、pip3以及构建Python包所需的开发工具 sudo apt install python3 python3-pip python3-venv build-essential -y # 3. 验证安装 python3 --version # 应输出 Python 3.10.x pip3 --version # 应输出 pip 22.x.x from ... (python 3.10) # 4. (可选但推荐) 为Python3创建‘python‘和‘pip‘的软链接方便使用 # 检查是否已有‘python‘命令指向python3 python --version # 如果没有可以创建软链接但需谨慎因为有些系统工具依赖python2 # 更安全的方式是使用别名alias这里我们暂时用python3和pip3命令。虚拟环境的使用强烈建议为每个项目创建独立的虚拟环境避免包冲突。# 在项目目录下 python3 -m venv venv # 激活虚拟环境 source venv/bin/activate # 激活后命令行提示符前会出现(venv)此时pip安装的包只在此环境内4.2 Firefox与GeckoDriver在Linux下的部署Ubuntu默认使用Snap版本的Firefox这个版本有时在Selenium自动化控制上会遇到沙盒权限问题。更稳定的方案是安装.deb包版本或使用Mozilla官方PPA。方案一使用APT安装简单版本可能稍旧sudo apt install firefox -y方案二使用Mozilla官方PPA安装最新版推荐# 添加Mozilla Team的PPA sudo add-apt-repository ppa:mozillateam/ppa -y # 更新并安装 sudo apt update sudo apt install -t ‘oLP-PPA-mozillateam‘ firefox -y # 设置APT优先从PPA获取Firefox更新防止被Snap版本覆盖 echo ‘ Package: firefox* Pin: release oLP-PPA-mozillateam Pin-Priority: 1001 ‘ | sudo tee /etc/apt/preferences.d/mozilla-firefox安装完成后在终端输入firefox --version查看版本。安装GeckoDriver# 确定系统架构通常是x86_64 arch$(uname -m) # 下载最新版GeckoDriver请去GitHub页面核对最新版本号例如0.34.0 wget https://github.com/mozilla/geckodriver/releases/download/v0.34.0/geckodriver-v0.34.0-linux64.tar.gz # 解压 tar -xzf geckodriver-*.tar.gz # 将可执行文件移动到系统PATH目录例如/usr/local/bin sudo mv geckodriver /usr/local/bin/ # 赋予可执行权限 sudo chmod x /usr/local/bin/geckodriver # 验证 geckodriver --version4.3 安装Selenium 4及无头模式测试在Linux下我们同样使用pip安装Selenium。如果在虚拟环境中请先激活。pip3 install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple在Linux服务器环境下图形界面GUI通常不可用因此无头模式Headless Mode运行自动化测试是标准做法。创建一个测试脚本test_firefox_linux.pyfrom selenium import webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.firefox.options import Options from selenium.webdriver.common.by import By import time # 配置Firefox选项 options Options() options.add_argument(‘--headless‘) # 启用无头模式不显示图形界面 options.add_argument(‘--no-sandbox‘) # 在某些Linux环境如Docker/CI中可能需要 options.add_argument(‘--disable-dev-shm-usage‘) # 解决共享内存空间不足问题 # 如果geckodriver已在PATH中Service()可以不带参数 service Service() driver webdriver.Firefox(serviceservice, optionsoptions) try: driver.get(‘https://www.baidu.com‘) print(‘[Linux] 页面标题‘, driver.title) # 使用更推荐的find_element方式 search_input driver.find_element(By.ID, ‘kw‘) search_input.send_keys(‘Linux Selenium Headless Test‘) search_input.submit() time.sleep(2) # 等待结果加载 print(‘[Linux] 搜索后URL‘, driver.current_url) # 可以截个图看看无头模式下的页面状态 driver.save_screenshot(‘baidu_search_result_linux.png‘) print(‘[Linux] 截图已保存。‘) finally: driver.quit() print(‘[Linux] Firefox无头浏览器已关闭Linux环境测试通过‘)运行脚本python3 test_firefox_linux.py。虽然你不会看到浏览器窗口弹出但终端会打印出步骤信息并且当前目录下会生成一张截图。检查截图和输出如果没有报错说明Linux环境也配置成功了。5. 双系统环境一致性校验与脚本移植环境分别搭好了但如何确保“一致”关键在于管理好两边的依赖和路径。5.1 使用requirements.txt统一Python依赖在其中一个系统比如Windows的项目目录下生成所有依赖包的清单pip freeze requirements.txt查看这个requirements.txt文件核心应该包含selenium4.x.x以及它可能依赖的包如urllib3,certifi等。将这个文件复制到你的共享数据分区或者通过U盘、网盘等方式传输到Linux系统的项目目录下。在Linux的虚拟环境中安装这些依赖# 确保已激活虚拟环境 source venv/bin/activate pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple这样两个系统中的Python包版本就完全一致了。5.2 处理系统相关的路径与配置差异脚本中可能包含一些系统相关的部分需要做兼容性处理文件路径Windows使用反斜杠\和盘符如C:\Linux使用正斜杠/且没有盘符概念。在Python中应使用os.path.join()函数来构建路径它会自动适应当前操作系统。import os # 不推荐 # windows_path ‘C:\\Users\\Project\\data.txt‘ # linux_path ‘/home/user/project/data.txt‘ # 推荐 data_dir ‘data‘ file_name ‘output.txt‘ file_path os.path.join(data_dir, file_name) # 自动适配系统GeckoDriver路径如前所述最佳实践是将geckodriver放入系统PATH或者在项目目录下存放一份这样代码中就不需要硬编码路径。如果必须指定可以判断系统import sys from selenium.webdriver.firefox.service import Service if sys.platform.startswith(‘win‘): driver_path ‘geckodriver.exe‘ # Windows elif sys.platform.startswith(‘linux‘): driver_path ‘geckodriver‘ # Linux else: raise Exception(‘Unsupported OS‘) # 如果驱动不在PATH则在当前目录查找 service Service(executable_pathdriver_path) if not shutil.which(‘geckodriver‘) else Service()浏览器二进制路径通常不需要指定Selenium会自动查找系统默认安装的Firefox。但如果安装了多个版本或非标准路径可以通过options.binary_location指定。5.3 编写跨系统兼容的测试脚本示例综合以上要点一个具备良好跨平台兼容性的脚本示例如下import os import sys import time from selenium import webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.firefox.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys def get_driver(): “““创建并返回一个配置好的WebDriver实例兼容Windows和Linux。“““ options Options() # 判断是否为无头环境如Linux服务器或CI # 可以通过环境变量控制例如设置 HEADLESS1 if os.environ.get(‘HEADLESS‘, ‘0‘) ‘1‘ or not sys.platform.startswith(‘win‘): # Linux环境或明确要求无头时启用无头模式 options.add_argument(‘--headless‘) options.add_argument(‘--no-sandbox‘) options.add_argument(‘--disable-dev-shm-usage‘) print(‘运行在无头模式‘) # 可选设置一些通用偏好如禁用图片加载加速测试 # options.set_preference(‘permissions.default.image‘, 2) # 驱动管理优先使用WebDriver Manager需安装webdriver-manager库 # 这是最省心、最推荐的方式能自动下载匹配浏览器版本的驱动。 try: from webdriver_manager.firefox import GeckoDriverManager service Service(GeckoDriverManager().install()) print(‘使用WebDriver Manager自动管理的驱动‘) except ImportError: # 如果未安装webdriver-manager则回退到系统PATH查找 print(‘WebDriver Manager未安装尝试从系统PATH查找驱动‘) service Service() driver webdriver.Firefox(serviceservice, optionsoptions) return driver def main(): driver None try: driver get_driver() driver.get(‘https://www.bing.com‘) # 换个网站测试 # 使用更稳定的定位方式 search_box driver.find_element(By.NAME, ‘q‘) search_term f‘跨平台测试 {sys.platform} {time.strftime(“%Y-%m-%d“)}‘ search_box.send_keys(search_term) search_box.send_keys(Keys.RETURN) time.sleep(2) print(f‘[{sys.platform}] 搜索词: {search_term}‘) print(f‘[{sys.platform}] 结果页标题: {driver.title}‘) # 跨系统的截图保存 screenshot_dir ‘screenshots‘ os.makedirs(screenshot_dir, exist_okTrue) screenshot_path os.path.join(screenshot_dir, f‘result_{sys.platform}.png‘) driver.save_screenshot(screenshot_path) print(f‘截图已保存至: {screenshot_path}‘) except Exception as e: print(f‘测试过程中发生错误: {e}‘) import traceback traceback.print_exc() finally: if driver: driver.quit() print(‘浏览器已退出测试完成。‘) if __name__ ‘__main__‘: main()这个脚本通过判断平台和环境变量来决定是否使用无头模式并优先采用WebDriver Manager自动管理驱动是跨系统运行的理想模板。你可以在Windows和Linux下分别运行它观察行为和输出结果是否一致。6. 常见问题、排查技巧与进阶优化即使按照步骤操作也难免会遇到问题。这里记录一些我踩过的坑和解决方案。6.1 驱动与浏览器版本不匹配这是最常见的问题。Selenium 4对驱动和浏览器的版本匹配要求比较严格。症状SessionNotCreatedException错误信息中提及无法启动浏览器或驱动版本不兼容。排查检查浏览器版本在Firefox地址栏输入about:support查看“应用程序版本”。检查GeckoDriver版本命令行运行geckodriver --version。去GeckoDriver的GitHub发布页面查看版本支持矩阵。通常较新的驱动会向后兼容几个版本的浏览器但最好使用相近版本。解决最佳方案使用webdriver-manager库pip install webdriver-manager它会在首次运行时自动下载匹配的驱动。手动方案根据Firefox版本下载对应的GeckoDriver版本。6.2 Firefox无法启动或崩溃在Linux无头模式下确保安装了必要的图形库依赖。即使是无头模式Firefox也可能需要一些X11库。安装它们sudo apt install xvfb libx11-xcb1 libxcomposite1 libxcursor1 libxdamage1 libxi6 libxtst6 libnss3 libcups2 libxss1 libxrandr2 libasound2 libatk1.0-0 libatk-bridge2.0-0 libpangocairo-1.0-0 libgtk-3-0 libgbm1 -y或者使用xvfb-run命令在虚拟显示缓冲区中运行你的Python脚本xvfb-run python3 your_script.py权限问题确保geckodriver有可执行权限chmod x。端口冲突如果之前运行未正常退出可能导致驱动占用的端口未释放。尝试重启系统或杀死相关进程。6.3 Selenium脚本执行速度慢或不稳定使用显式等待代替隐式等待和固定休眠time.sleep()是脆弱的。使用WebDriverWait配合expected_conditions。from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待最多10秒直到元素出现 element WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, “myDynamicElement“)) )优化元素定位器优先使用ID、NAME等稳定属性其次CSS_SELECTOR、XPATH。避免使用可能变化的文本或复杂索引。无头模式在Linux测试或不需要观察UI时始终使用无头模式可以节省大量资源并避免GUI干扰。6.4 双系统时间不同步导致的问题除了之前提到的修改Ubuntu将硬件时钟视为本地时间的方法如果你的脚本涉及文件时间戳同步或者某些基于时间的认证这可能会造成困扰。一个治本的方案是在Windows里修改注册表让Windows使用UTC时间不推荐新手操作。更简单的方法是确保你的自动化脚本不依赖于操作系统的本地时间而是使用网络时间或服务器时间。6.5 进阶将环境集成到持续集成CI流程这套环境的价值在CI/CD中更能体现。你可以在GitHub Actions、GitLab CI等工具中配置一个同时包含Windows和Linux Runner的流水线。GitHub Actions示例配置片段jobs: test-on-multiple-os: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest] python-version: [‘3.10‘] steps: - uses: actions/checkoutv3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-pythonv4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | pip install -r requirements.txt pip install webdriver-manager # 使用自动驱动管理 - name: Install Firefox (Linux) if: runner.os ‘Linux‘ run: | sudo apt-get update sudo apt-get install -y firefox - name: Run tests run: | python your_selenium_test_script.py这样每次代码提交都会自动在Windows和Linux环境下运行你的Selenium测试脚本及早发现跨平台兼容性问题。搭建和维护这样一套环境初期会花费一些时间但一旦跑通它将成为你进行跨平台Web自动化开发或测试的坚固基石。无论是本地调试还是集成到自动化流程中都能让你对自己的代码在多环境下的表现充满信心。记住环境问题早发现、早解决成本最低。