
1. 项目概述为什么UI自动化测试是开发者的必修课如果你是一名开发者或者测试工程师还在手动一遍遍点击页面、填写表单来验证功能那真的有点“复古”了。UI自动化测试尤其是基于Selenium的自动化早已不是大厂的专利它正成为提升个人和团队交付效率的标配技能。简单来说它就是用代码模拟人的操作让浏览器自动执行点击、输入、跳转等行为从而完成对Web应用界面的功能验证。想象一下每次代码更新后你只需要点一下运行然后去喝杯咖啡回来就能看到一份详尽的测试报告告诉你哪些功能正常哪些出现了问题。这种解放双手、提升信心的感觉是手动测试无法比拟的。Selenium作为这个领域的“老大哥”其地位至今难以撼动。它支持多种主流浏览器Chrome, Firefox, Edge等和编程语言Python, Java, C#等生态成熟社区活跃资料丰富。无论是想快速入门自动化测试的新手还是需要构建复杂测试框架的资深工程师Selenium都是一个绕不开的起点。本系列教程的第一篇我们就从最基础但也最容易踩坑的环节开始——环境安装与配置。我会带你一步步走通整个流程并分享那些官方文档里不会写的“血泪教训”确保你一次成功少走弯路。2. 环境准备构建稳固的自动化测试地基在开始写第一行自动化脚本之前一个正确且稳定的环境是成功的一半。很多新手在第一步就卡住了不是因为步骤多复杂而是因为一些细节没注意到导致后续问题频发。我们这里选择最主流、对新手最友好的组合Python Selenium Chrome浏览器。这个组合入门快社区支持好出了问题也容易找到解决方案。2.1 Python环境安装与配置Python是我们的脚本语言是驱动Selenium的“大脑”。虽然系统可能自带Python但我强烈建议你使用Anaconda或从Python官网安装独立的版本以避免与系统自带的Python产生冲突。第一步下载与安装访问Python官网下载最新的稳定版本如Python 3.11或3.12。安装时务必勾选“Add Python to PATH”这个选项这是为了能在命令行中直接使用python和pip命令。如果不勾选后续你会遇到“python不是内部或外部命令”的错误需要手动配置环境变量对新手不太友好。第二步验证安装安装完成后打开命令行Windows上是CMD或PowerShellMac/Linux上是Terminal输入以下命令python --version pip --version如果两行命令都能正确返回版本号说明Python和包管理工具pip安装成功。注意在部分系统或环境下命令可能是python3和pip3。如果你同时安装了Python2和Python3则需要用python3来明确指定版本。为了统一本教程后续在命令行示例中均使用python和pip请根据你的实际情况调整。第三步配置国内镜像源加速下载默认的pip源在国外下载Python包库时速度可能很慢甚至失败。配置一个国内的镜像源能极大提升体验。常用的有清华源、阿里云源等。这里以配置清华源为例在用户目录下如C:\Users\你的用户名\新建一个名为pip的文件夹。在pip文件夹内新建一个文本文件命名为pip.ini注意扩展名是.ini。用记事本打开pip.ini写入以下内容并保存[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn配置完成后后续使用pip install安装任何包都会从这个镜像站快速下载。2.2 浏览器与驱动自动化测试的“手”和“眼睛”Selenium本身只是一个控制浏览器行为的库它需要通过与一个名为“WebDriver”的中间件通信来实际操控浏览器。你可以把Selenium想象成大脑发出指令WebDriver是神经传递指令浏览器则是手脚执行动作。三者版本必须匹配这是安装过程中最大的坑。第一步安装浏览器确保你安装了Google Chrome浏览器。建议使用官方稳定版并记住你的Chrome版本号在浏览器地址栏输入chrome://version/查看第一行就是例如120.0.6099.130。第二步下载ChromeDriver这是最关键的一步。ChromeDriver的版本必须与你的Chrome浏览器主版本号完全一致例如都是120.x.x.x。访问ChromeDriver的官方下载站或国内镜像站。官方地址有时访问困难可以使用淘宝的镜像站。根据你的操作系统Windows, Mac, Linux和Chrome版本号下载对应的ChromeDriver压缩包。对于Windows用户下载的是一个名为chromedriver_win32.zip的文件。解压后你会得到一个chromedriver.exe文件。第三步配置ChromeDriver路径下载的chromedriver.exe需要放在一个地方并让系统或Python脚本能找到它。有三种常用方法推荐第一种最简单方法一放入Python脚本目录。这是最直接的方法。将chromedriver.exe文件直接复制到你的Python自动化脚本所在的同一个文件夹里。在代码中你就可以用相对路径./chromedriver.exe来指定它。方法二放入系统PATH路径。将chromedriver.exe放在一个固定的目录例如C:\WebDriver\然后将这个目录添加到系统的环境变量PATH中。这样在任何地方运行脚本Selenium都能自动找到它。具体添加PATH的方法可以搜索“Windows添加环境变量”获得。方法三在代码中指定绝对路径。在初始化WebDriver时直接传入chromedriver.exe的完整路径如driver webdriver.Chrome(executable_pathr‘C:\path\to\chromedriver.exe‘)。注意Python字符串中的路径最好使用原始字符串前缀r或双反斜杠\\以避免转义字符问题。实操心得我强烈建议新手使用方法一。在项目初期把所有相关文件脚本、驱动、测试数据放在一个项目文件夹内管理清晰且不易出错。等熟悉了整个流程再考虑使用更全局的配置方法方法二。另外务必养成一个好习惯每次Chrome浏览器自动升级后记得检查并更新对应的ChromeDriver否则脚本会报错。3. 核心安装步骤让Selenium在你的机器上跑起来环境准备好后安装Selenium库本身反而是最简单的一步。但这一步也藏着一些优化技巧。3.1 使用pip安装Selenium库打开命令行输入以下命令pip install selenium如果你之前配置了清华镜像源这个下载过程会非常快。安装完成后可以通过pip show selenium来查看安装的版本信息。版本选择建议通常直接安装最新稳定版即可。但如果你需要与团队或历史项目保持一致可以指定版本安装例如pip install selenium4.15.0。Selenium 4.x 版本相比 3.x 有较大改进如更好的W3C协议支持、相对定位器等新特性建议新项目直接使用4.x。3.2 编写你的第一个验证脚本安装完成不代表环境就通了我们必须写一个简单的脚本真正地启动浏览器并打开一个网页这才算成功。在你的项目文件夹里新建一个Python文件例如first_test.py。# first_test.py from selenium import webdriver from selenium.webdriver.common.by import By import time # 1. 创建WebDriver实例启动Chrome浏览器 # 如果你的chromedriver.exe放在脚本同目录这样写即可 driver webdriver.Chrome() # 2. 使用get方法打开百度首页 driver.get(https://www.baidu.com) # 3. 等待2秒让我们能看到页面加载 time.sleep(2) # 4. 在搜索框输入“Selenium” # 首先通过元素的ID属性找到搜索输入框 search_box driver.find_element(By.ID, kw) # 然后向输入框发送文本“Selenium” search_box.send_keys(Selenium) # 5. 找到“百度一下”按钮并点击 search_button driver.find_element(By.ID, su) search_button.click() # 6. 等待3秒查看搜索结果 time.sleep(3) # 7. 关闭浏览器窗口 driver.quit() print(第一个Selenium自动化脚本执行成功)逐行解析与注意事项from selenium import webdriver导入Selenium的核心模块。from selenium.webdriver.common.by import By导入定位元素的方式。在Selenium 4中find_element_by_id这种旧写法已被弃用官方推荐使用find_element(By.ID, “value”)这种更统一、清晰的方式。driver webdriver.Chrome()这行代码会尝试启动Chrome浏览器。如果系统找不到chromedriver.exe会抛出WebDriverException异常。如果成功你将看到一个弹窗提示“Chrome正受到自动测试软件的控制”并且打开一个全新的、干净的浏览器窗口无缓存、无插件。driver.get(“url”)命令浏览器导航到指定的网址。time.sleep(seconds)强制等待。这是一个非常初级但有效的等待方式让脚本暂停执行几秒以便页面有足够时间加载。但在实际项目中应尽量避免滥用time.sleep因为它效率低下且不稳定。我们后续会介绍更智能的“显式等待”。find_element(By.ID, “kw”)这是元素定位。By.ID表示通过HTML元素的id属性来查找“kw”是百度搜索输入框的id值。你可以通过浏览器的开发者工具F12查看元素的这些属性。send_keys(“text”)向输入框模拟键盘输入。click()模拟鼠标点击动作。driver.quit()非常重要这会关闭所有由WebDriver打开的浏览器窗口并结束WebDriver进程。与之对应的还有一个driver.close()它只关闭当前标签页。为了彻底释放资源养成使用quit()的好习惯。运行这个脚本。如果一切顺利你会看到Chrome浏览器自动打开访问百度输入“Selenium”并搜索然后关闭。控制台输出成功信息。恭喜你你的Selenium环境已经成功搭建并验证通过4. 进阶配置与最佳实践一次性的成功运行只是开始。为了让你的自动化测试环境更健壮、更易于维护我们需要进行一些进阶配置。4.1 浏览器启动选项配置默认启动的浏览器会带有“受自动化测试控制”的提示并且是一个全新的干净环境。有时我们需要定制浏览器的行为比如禁用提示、设置窗口大小、启用无头模式等。这可以通过ChromeOptions来实现。from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service # 创建ChromeOptions对象 chrome_options Options() # 1. 禁用“Chrome正受到自动测试软件的控制”提示 chrome_options.add_experimental_option(excludeSwitches, [enable-automation]) chrome_options.add_experimental_option(useAutomationExtension, False) # 2. 设置浏览器窗口最大化 chrome_options.add_argument(--start-maximized) # 3. 启用无头模式不显示浏览器界面在后台运行 # chrome_options.add_argument(--headlessnew) # Chrome 109以上版本推荐写法 # chrome_options.add_argument(--headless) # 旧版本写法 # 注意无头模式下某些需要渲染或交互的特性可能表现不同调试时可先关闭。 # 4. 禁用沙盒模式在某些Linux环境或Docker中可能需要 # chrome_options.add_argument(--no-sandbox) # 禁用/dev/shm使用在某些Linux环境或Docker中可能需要 # chrome_options.add_argument(--disable-dev-shm-usage) # 5. 指定ChromeDriver路径如果未加入PATH service Service(executable_pathr‘./chromedriver.exe‘) # 相对路径示例 # 将options和service传入创建driver driver webdriver.Chrome(serviceservice, optionschrome_options) driver.get(https://www.baidu.com) # ... 你的测试代码 driver.quit()配置解析excludeSwitches和useAutomationExtension这两个选项组合使用可以有效去除浏览器顶部的自动化提示栏让测试环境更接近真实用户环境。--start-maximized让浏览器启动时直接最大化避免因窗口大小导致元素不可见而定位失败。--headless无头模式是自动化测试特别是集成到CI/CD流水线中的关键。它不启动GUI界面极大节省系统资源可以在服务器上运行。但调试时建议关闭以便观察页面实际状态。--no-sandbox和--disable-dev-shm-usage这两个是常见的在Linux服务器或Docker容器中运行Chrome时需要的参数用于解决权限和共享内存问题。在Windows和Mac本地开发时通常不需要。4.2 使用WebDriver Manager管理浏览器驱动手动下载和管理ChromeDriver版本是一件繁琐且容易出错的事情。有一个非常棒的三方库叫webdriver-manager它可以自动检测你本地安装的浏览器版本并下载匹配的WebDriver彻底解决版本匹配的烦恼。安装WebDriver Managerpip install webdriver-manager在代码中使用from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # 使用ChromeDriverManager自动下载和管理驱动 service Service(ChromeDriverManager().install()) # 创建driver时传入service driver webdriver.Chrome(serviceservice) driver.get(https://www.baidu.com) # ... 你的测试代码 driver.quit()第一次运行时ChromeDriverManager().install()会检查本地Chrome版本然后自动从镜像站下载对应的驱动到缓存目录。以后再次运行如果版本没变就直接使用缓存非常方便。它同样支持Firefox、Edge等浏览器。强烈推荐对于所有新手和大多数项目直接使用webdriver-manager是最佳实践。它能将你从“驱动版本不匹配”这个最常见的坑里彻底解救出来。5. 常见问题与排查技巧实录即使按照步骤操作你也可能会遇到一些问题。下面是我在帮助无数新手解决问题后总结出的最常见错误及其解决方案。5.1 驱动相关问题问题1selenium.common.exceptions.WebDriverException: Message: ‘chromedriver‘ executable needs to be in PATH.现象运行脚本时程序报错提示找不到chromedriver。原因Selenium无法在系统的PATH环境变量或脚本当前目录中找到chromedriver.exe文件。解决方案检查放置位置确认chromedriver.exe是否放在了你的Python脚本所在的同一个文件夹里。检查文件名确保文件名是chromedriver.exeWindows或chromedriverMac/Linux没有多余的后缀或空格。指定绝对路径在代码中使用Service明确指定驱动路径如Service(executable_pathr‘C:\full\path\to\chromedriver.exe‘)。终极方案使用webdriver-manager一劳永逸。问题2selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version XX现象脚本之前能运行某天突然报这个错。原因Chrome浏览器自动升级了但ChromeDriver没有随之更新导致版本不匹配。解决方案查看当前Chrome版本chrome://version。下载与该版本号主版本一致的ChromeDriver替换旧的驱动文件。或者直接使用webdriver-manager它会自动处理版本匹配。5.2 浏览器启动与页面加载问题问题3浏览器闪退或打不开现象运行脚本后浏览器窗口一闪而过或者根本没打开就报错了。原因驱动版本严重不匹配。浏览器安装损坏或存在多个冲突版本。杀毒软件或防火墙拦截。解决方案首先确保使用的是webdriver-manager。尝试以管理员身份运行你的IDE或命令行。临时关闭杀毒软件或防火墙试试。检查任务管理器是否有残留的chrome.exe或chromedriver.exe进程强制结束它们再试。问题4元素找不到NoSuchElementException现象脚本在执行到find_element时抛出异常提示找不到元素。原因这是UI自动化中最常见的问题。页面未加载完成代码执行太快元素还没渲染出来就去定位了。定位方式错误使用的定位器如ID、XPath写错了或者该元素属性是动态生成的。元素在iframe/frame内目标元素嵌套在iframe标签内需要先切换上下文。元素在新窗口/标签页点击某个链接后打开了新窗口需要先切换窗口句柄。解决方案增加等待不要只用time.sleep。学习使用显式等待WebDriverWait这是解决此类问题的标准做法。它会在指定时间内不断尝试查找元素直到找到或超时。from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待最多10秒直到ID为‘kw‘的元素出现 element WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, “kw“)) ) element.send_keys(“Selenium“)检查定位器使用浏览器的开发者工具F12 - Elements仔细检查元素的属性。优先使用稳定的属性如id、name。如果都没有再考虑使用XPath或CSS Selector。处理iframe如果元素在iframe里必须先切换到该iframe。# 通过iframe的id或index切换 driver.switch_to.frame(“iframe_id“) # 操作iframe内的元素... # 操作完成后切换回主文档 driver.switch_to.default_content()处理新窗口获取所有窗口句柄并切换。# 点击打开新窗口的链接 driver.find_element(By.LINK_TEXT, “新窗口“).click() # 获取所有窗口句柄 all_handles driver.window_handles # 切换到新窗口最后一个通常是新打开的 driver.switch_to.window(all_handles[-1]) # 在新窗口操作...5.3 环境与依赖问题问题5ModuleNotFoundError: No module named ‘selenium‘现象运行脚本时提示找不到selenium模块。原因Selenium库没有安装或者安装在了另一个Python环境下比如你系统有多个Python。解决方案确认你运行脚本时使用的Python环境和用pip install selenium安装时的是同一个。在命令行中where pythonWindows或which pythonMac/Linux可以查看当前使用的Python路径。在当前的Python环境下重新安装pip install selenium。如果你使用PyCharm等IDE检查项目的Python解释器设置是否正确。问题6脚本在无头模式下运行失败或有差异现象在普通模式下运行正常的脚本开启--headless后失败或者页面截图显示异常。原因无头模式下的浏览器环境如窗口大小、用户代理、某些特性支持与有界面模式可能存在细微差异。解决方案设置窗口大小在无头模式下默认的窗口大小可能较小导致某些响应式布局的元素不可见。添加参数--window-size1920,1080。添加用户代理有些网站会检测无头浏览器。可以添加一个常见的用户代理字符串来伪装chrome_options.add_argument(‘user-agentMozilla/5.0 ...‘)。调试在关键步骤添加页面截图driver.save_screenshot(‘debug.png‘)查看无头模式下的页面状态与有界面模式对比。环境搭建是自动化测试的第一步也是最容易让人沮丧的一步因为任何一个环节的小问题都可能导致失败。但请相信一旦你成功跨过这个门槛后面编写自动化脚本、设计测试用例的乐趣和成就感会远远超过这点前期的麻烦。记住核心要点Python环境装好、浏览器驱动版本匹配、使用WebDriver Manager省心、遇到元素找不到优先考虑显式等待。把这些基础打牢你已经为成为一名高效的UI自动化测试工程师迈出了最坚实的一步。下一篇教程我们将深入Selenium的核心——元素定位这是你与网页进行一切交互的基础。