1、Selenium概述与环境搭建

1.1 Selenium发展史:从工具到标准

Selenium的故事,得从2004年说起。当时有个叫Jason Huggins的家伙,在ThoughtWorks写测试脚本,天天手动点浏览器点得想吐。他一拍脑袋,写了个JavaScript库,能自动操作浏览器——这就是Selenium Core的雏形。

我刚开始接触自动化测试时,用的还是Selenium 1.0。那时候叫Selenium RC(Remote Control),原理挺绕的——通过JavaScript注入来模拟用户操作。说白了就是让浏览器跑一段JS脚本,然后脚本去控制页面。但有个致命问题:跨域限制。你想想看,浏览器天生不允许JS访问不同域名的内容,这导致很多场景跑不通。

后来到了2006年,Google的Simon Stewart搞出了WebDriver。这家伙的思路完全不同——直接调用浏览器原生API,不走JS注入那套。嗯,这才是正道。2011年,Selenium和WebDriver合并,Selenium 2.0诞生。我个人觉得,这是自动化测试史上最重要的转折点。

关键时间线:

  • 2004年 — Selenium Core诞生(Jason Huggins)
  • 2006年 — WebDriver诞生(Simon Stewart)
  • 2011年 — Selenium 2.0发布(合并WebDriver)
  • 2016年 — Selenium 3.0发布(全面转向WebDriver)
  • 2021年 — Selenium 4.0发布(W3C标准化)

1.2 Selenium 3与Selenium 4的区别

很多人问我:「老师,现在该学Selenium 3还是4?」我的回答永远是:直接上4。为什么?我给你列几个关键区别。

对比项 Selenium 3 Selenium 4
协议 JSON Wire Protocol(自定义协议) W3C WebDriver标准协议
窗口管理 需手动切换窗口/标签页 原生支持Tab页操作
相对定位 不支持 支持(toLeftOf、toRightOf等)
Chrome DevTools 不支持 原生集成CDP
等待机制 隐式/显式等待 新增FluentWait增强

我记得有一次升级项目,从Selenium 3切到4,最直观的感受就是「稳」。以前用JSON Wire Protocol时,浏览器和驱动之间通信偶尔会丢包,出现莫名其妙的超时。换成W3C标准后,通信协议统一了,兼容性问题少了一大半。

我的建议:如果你还在用Selenium 3,别犹豫,尽快迁移。Selenium 4的API更简洁,而且Chrome DevTools的支持能让你做很多以前做不到的事——比如模拟网络条件、捕获性能日志。

1.3 WebDriver的工作原理

搞懂WebDriver的工作原理,你写脚本时心里就有底了。说白了,它就是个「中间人」。

流程是这样的:

  1. 你的Python脚本调用WebDriver API(比如 driver.get(url)
  2. WebDriver通过HTTP请求,把指令发给浏览器驱动(比如chromedriver)
  3. 浏览器驱动再调用浏览器的原生API,执行操作
  4. 执行结果原路返回

为什么会这样设计?因为浏览器厂商不允许外部程序直接操作浏览器——这是安全底线。所以WebDriver相当于拿到了「官方授权」,通过浏览器驱动这个中间层来发号施令。

我曾经踩过一个坑:在公司内网环境跑自动化,发现脚本动不动就超时。排查了半天,原来是代理服务器把WebDriver的HTTP请求给拦截了。嗯,这里要注意——WebDriver走的是HTTP协议,如果你的网络环境有代理限制,记得配置白名单。

避坑指南:我曾经遇到过浏览器版本和驱动版本不匹配,导致脚本全部报错。记住一条铁律:浏览器版本、驱动版本、Selenium版本三者必须兼容。尤其是Chrome,它更新太频繁了,我建议锁定浏览器版本,不要自动更新。

1.4 环境搭建:Python + Selenium + 浏览器驱动

好了,理论说完了,咱们动手搭环境。我习惯用Python 3.9+,Selenium 4.x,Chrome浏览器。你跟着我来,十分钟搞定。

第一步:安装Python

去python.org下载安装包,记得勾选「Add Python to PATH」。装完后打开终端验证:

python --version
pip --version

如果能看到版本号,说明Python装好了。我个人建议用虚拟环境,避免污染全局包:

python -m venv selenium_env
# Windows
selenium_env\Scripts\activate
# Mac/Linux
source selenium_env/bin/activate

第二步:安装Selenium

一行命令搞定:

pip install selenium

装完后验证一下:

python -c "import selenium; print(selenium.__version__)"

如果输出版本号(比如4.15.0),说明安装成功。

第三步:下载浏览器驱动

这是最容易出问题的一步。你想想看,浏览器驱动相当于「翻译官」,版本必须和浏览器完全匹配。

  • Chrome:去chromedriver.chromium.org下载,版本号要和Chrome一致
  • Firefox:用geckodriver,github.com/mozilla/geckodriver下载
  • Edge:用msedgedriver,微软官方下载

下载后把驱动放到Python的Scripts目录下,或者直接配置环境变量。我习惯放项目根目录,这样不同项目可以用不同版本:

# 项目结构
my_project/
├── chromedriver.exe
├── main.py
└── requirements.txt

第四步:写个脚本验证

新建一个 test_selenium.py,写入以下代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# 指定驱动路径(如果没配环境变量)
service = Service('./chromedriver.exe')
driver = webdriver.Chrome(service=service)

# 打开百度
driver.get('https://www.baidu.com')

# 打印页面标题
print(driver.title)

# 关闭浏览器
driver.quit()

运行脚本:

python test_selenium.py

如果浏览器自动打开并跳转到百度,控制台打印出「百度一下」,恭喜你——环境搭建成功!

常见问题排查:

  • 报错「chromedriver.exe 不在PATH中」 — 要么配环境变量,要么在代码里指定Service路径
  • 报错「session not created」 — 驱动版本和浏览器版本不匹配,去下载对应版本
  • 浏览器一闪而过 — 代码里没加 driver.quit() 或者脚本执行太快,可以加个 time.sleep(3) 观察

我的小技巧:如果你不想手动管理驱动版本,可以用 webdriver-manager 这个库。它会自动检测浏览器版本并下载对应驱动:

pip install webdriver-manager

from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service

service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

嗯,这个方案我一直在用,省心不少。

好了,环境搭好了,咱们下节课开始写真正的自动化脚本。记住,环境搭建是基础中的基础,别嫌麻烦。我见过太多人卡在这一步就放弃了——其实只要版本匹配,十分钟就能搞定。