Python Selenium 超详细新手教程:从零开始掌握浏览器自动化

以下是 Python + Selenium 超详细新手教程(2026 年最新版):从零开始掌握浏览器自动化。

这份教程基于 Selenium 4.40+(2026 年 1 月最新稳定版)和 Python 3.12/3.13,重点解决新手最痛的几个问题:

  • 驱动安装不再手动下载(Selenium Manager 自动搞定)
  • headless / 无头模式 / 绕过检测
  • 常见元素定位、等待、交互、异常处理
  • 真实项目场景示例(登录、爬取、表单填写、截图等)

0. 为什么 2026 年还在学 Selenium?

  • 动态 JS 页面、复杂交互、文件上传、验证码绕过等场景,Playwright / Puppeteer 虽快,但 Selenium 生态最成熟、职位最多、云测试平台支持最好。
  • Selenium Manager(4.6+ 内置)让安装难度大幅降低,新手友好度暴涨。

1. 环境准备(5 分钟搞定)

步骤 1:安装 Selenium(包含 Selenium Manager)

pip install --upgrade selenium # 推荐额外安装(方便调试、等待、日志) pip install webdriver-manager # 可选,Selenium Manager 已够用,但有时更稳定

步骤 2:验证安装

from selenium import webdriver print(webdriver.__version__)# 应该 ≥ 4.40.0

2026 年关键变化

  • Selenium 4.6+ 内置 Selenium Manager(Rust 实现),自动下载匹配你浏览器版本的 chromedriver/geckodriver/msedgedriver 等。
  • 不再需要手动去 chromedriver.chromium.org 下载驱动,也不用放 PATH。

2. 第一个程序:打开浏览器 + 访问页面

from selenium import webdriver from selenium.webdriver.chrome.options import Options # ------------------- 方式一:最简单(推荐新手) ------------------- driver = webdriver.Chrome()# 自动使用 Selenium Manager 下载驱动 driver.get("https://www.python.org")print(driver.title)# Python.org 标题 driver.quit()# 必须关闭,否则进程残留

方式二:无头模式(headless)——后台运行,不弹出窗口

options = Options() options.add_argument("--headless=new")# 现代无头模式(Chrome 109+ 推荐) options.add_argument("--disable-gpu")# 部分系统需要 options.add_argument("--no-sandbox")# Linux / Docker 常见 options.add_argument("--disable-dev-shm-usage") driver = webdriver.Chrome(options=options) driver.get("https://www.google.com")print(driver.page_source[:200])# 输出部分 HTML driver.quit()

方式三:加一些防检测参数(爬虫/防反爬常用)

options = Options() options.add_argument("--headless=new") options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36") options.add_experimental_option("excludeSwitches",["enable-automation"]) options.add_experimental_option('useAutomationExtension',False) driver = webdriver.Chrome(options=options)

3. 核心概念:元素定位(8 大主流方式)

定位方式语法示例适用场景优先级建议
idfind_element(By.ID, “kw”)最高优先,唯一性强★★★★★
namefind_element(By.NAME, “wd”)表单 input name★★★★☆
class namefind_element(By.CLASS_NAME, “s_ipt”)单个 class★★★☆☆
tag namefind_elements(By.TAG_NAME, “a”)找所有链接/按钮★★☆☆☆
link textfind_element(By.LINK_TEXT, “新闻”)精确匹配超链接文字★★★☆☆
partial link textfind_element(By.PARTIAL_LINK_TEXT, “新”)模糊匹配链接文字★★☆☆☆
css selectorfind_element(By.CSS_SELECTOR, “#kw”)
.s_ipt
input[type=‘text’]
最强大、最快、推荐掌握★★★★★
xpathfind_element(By.XPATH, “//*[@id=‘kw’]”)
//input[@name=‘wd’]
最灵活,但慢、易碎★★★★☆

推荐顺序(2026 年最佳实践):
ID > name > css > xpath(最后用) > class > link text

代码示例(百度搜索)

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time driver = webdriver.Chrome() driver.get("https://www.baidu.com")# 定位搜索框(多种写法等价) search_box = driver.find_element(By.ID,"kw")# search_box = driver.find_element(By.NAME, "wd")# search_box = driver.find_element(By.CSS_SELECTOR, "#kw")# search_box = driver.find_element(By.XPATH, "//input[@id='kw']") search_box.clear()# 清空 search_box.send_keys("Python Selenium 教程") search_box.send_keys(Keys.ENTER)# 回车搜索 time.sleep(3)# 粗暴等待(后面学智能等待)print(driver.title) driver.quit()

4. 必须掌握:显式等待(WebDriverWait)——避免 sleep 地狱

from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, timeout=10, poll_frequency=0.5)# 每0.5秒检查一次,最多等10秒# 等待元素可见 wait.until(EC.visibility_of_element_located((By.ID,"result_logo")))# 等待元素可点击 wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,".btn.btn-primary")))# 等待标题包含某文字 wait.until(EC.title_contains("Python"))

常用 EC(expected_conditions)

  • visibility_of_element_located
  • presence_of_element_located(在 DOM 中即可,不必可见)
  • element_to_be_clickable
  • text_to_be_present_in_element
  • title_is / title_contains
  • staleness_of(元素消失)

5. 常见交互操作汇总

element = driver.find_element(By.ID,"su") element.click()# 点击 element.send_keys("输入内容")# 输入 element.clear()# 清空输入框 element.get_attribute("value")# 获取 value 属性 element.text # 获取显示文本 element.is_displayed()# 是否可见 element.is_enabled()# 是否可用 element.is_selected()# radio/checkbox 是否选中# 浏览器操作 driver.back() driver.forward() driver.refresh() driver.maximize_window() driver.set_window_size(1200,800) driver.save_screenshot("baidu.png")# 截图

6. 窗口/iframe/警报处理

# 切换窗口(多标签) handles = driver.window_handles driver.switch_to.window(handles[1])# 切换到第二个标签# 切换 iframe driver.switch_to.frame("iframe_id_or_name_or_element") driver.switch_to.default_content()# 切回主文档# 处理 alert/confirm/prompt alert = driver.switch_to.alert alert.accept()# 确认 alert.dismiss()# 取消 alert.text # 获取弹窗文字 alert.send_keys("输入")# prompt 输入

7. 真实项目小实战:自动登录某网站(伪代码)

driver = webdriver.Chrome() wait = WebDriverWait(driver,15) driver.get("https://example.com/login") wait.until(EC.presence_of_element_located((By.NAME,"username"))).send_keys("your_account") driver.find_element(By.NAME,"password").send_keys("your_pass") driver.find_element(By.CSS_SELECTOR,"button[type='submit']").click()# 等待登录成功(例如个人中心元素出现) wait.until(EC.presence_of_element_located((By.CLASS_NAME,"user-avatar")))print("登录成功!") driver.save_screenshot("login_success.png")

8. 常见报错 & 解决方案(2026 年高频)

错误原因 & 解决办法
NoSuchDriverException浏览器版本与驱动不匹配 → 升级 selenium 或用 webdriver-manager 强制更新
ElementNotInteractableException元素被遮挡/不可见 → 加等待 + scrollIntoView 或 ActionChains 移动鼠标
StaleElementReferenceException页面刷新后元素失效 → 重新定位元素,不要缓存 element
TimeoutException等待超时 → 延长 timeout 或检查 locator 是否正确
SessionNotCreatedException驱动版本错 → Selenium Manager 自动处理,若失败:options.add_argument(“–headless=new”)
undetected-chromedriver 检测网站强反爬 → 用 undetected-chromedriver 库(pip install undetected-chromedriver)

9. 进阶方向建议(学完基础后)

  • Page Object Model(POM)设计模式
  • pytest + selenium 集成(推荐测试框架)
  • 处理验证码(OCR / 人工打码平台)
  • 多线程/分布式(selenium-grid)
  • 结合 Playwright 迁移(未来趋势)
  • headless + proxy + user-agent 随机 → 爬虫防封

一句话总结
2026 年 Selenium 安装几乎零成本(Selenium Manager 功不可没),学会 显式等待 + CSS 定位 + POM,你就基本能应对 90% 的浏览器自动化需求。

有哪部分还想再细讲?
例如:

  • 如何处理滑块验证码
  • POM 完整项目模板
  • headless + 绕过 Cloudflare / Akamai
  • pytest + allure 报告

随时告诉我,我继续展开~

Read more

【Python 速览 】 —— 课前甜点,打开你的味蕾

【Python 速览 】 —— 课前甜点,打开你的味蕾

欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创📩!欢迎评论区留言交流🌟 个人主页 👉 ZyyOvO 本文专栏➡️Python 算法研究所 各位于晏,亦菲请阅 * 前言 * 课前甜点 * Python解释器 * 唤出解释器 * 传入参数 * 交互模式 * 解释器的运行环境 * 源文件的字符编码 * Python注释 * Python用作计算器 * 数字 * 文本 * 列表 * 走向编程的第一步 * 扩展阅读 * 本文小结 前言 Python 是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 优雅的语法和动态类型以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的理想语言。 Python 官网 上免费提供了 Python 解释器和扩展的标准库,包括源码和适用于各操作系统的机器码形式,并可自由地分发。Python 官

By Ne0inhk
【3月考】二级Python最新真题及满分代码合集(基本操作题部分)

【3月考】二级Python最新真题及满分代码合集(基本操作题部分)

本套试题内容适配2025年9月考试 配套讲解视频欢迎关注B站:大头博士先生 考前押题关注微博:大头博士先生 祝大家优秀拿下!!! 第1套题 【题目素材】 # 请在______处使用一行代码或表达式替换## 注意:请不要修改其他已给出代码import ______ txt =input("请输入一段中文文本:") ______ print("{:.1f}".format(len(txt)/len(ls))) 【参考代码】 # 请在______处使用一行代码或表达式替换## 注意:请不要修改其他已给出代码import jieba txt =input("请输入一段中文文本:") ls=jieba.lcut(txt)print("{:.1f}".format(len(txt)/len(ls)

By Ne0inhk
Python(32)Python内置函数全解析:30个核心函数的语法、案例与最佳实践

Python(32)Python内置函数全解析:30个核心函数的语法、案例与最佳实践

目录 * 引言 * 基础数据类型操作 * 1. len() * 2. range() * 3. enumerate() * 4. zip() * 5. sorted() * 函数式编程工具 * 6. map() * 7. filter() * 8. reduce() * 9. any() * 10. all() * 输入输出与文件操作 * 11. open() * 12. print() * 13. input() * 14. exec() * 15. eval() * 元编程与高级功能 * 16. dir() * 17. help() * 18. type() * 19. isinstance() * 20. hasattr() * 21. getattr() * 22. setattr(

By Ne0inhk
python之路并不一马平川:带你踩坑Pandas

python之路并不一马平川:带你踩坑Pandas

这是我的亲身经历。作为一名全能型的混子,Pandas是我吃饭的家伙之一,但光是把它请到我的电脑上,就差点让我“饭碗不保”。这是一段长达数周,充满挫折、困惑和最终解脱的曲折历程。我将带你完整回顾我踩过的每一个坑,以及那最后的“救命稻草”。我将以第一视角,带你完整回顾我踩过的那些坑,以及我是如何一步步爬出来的。 记得刚入行那年,我接手的第一个项目是个电商小程序开发。当时为了赶进度,我直接跳过了需求分析阶段,结果上线后发现支付接口和后台数据对不上,不得不紧急下架整改。那三天三夜不眠不休的debug经历,现在想起来还心有余悸。 去年在开发智能家居App时,我又犯了个典型错误:没有做好版本兼容性测试。当用户反馈老型号设备无法连接时,我们才发现蓝牙协议栈对新老设备的处理方式完全不同。这个教训让我养成了建立完整测试矩阵的习惯。 最惨痛的经历是去年年底的云服务迁移。当时为了节省成本,我选择了直接全量迁移数据库,结果因为网络波动导致数据不一致,差点酿成重大事故。现在我做数据迁移时都会严格遵循"全量备份-增量同步-数据校验"的标准流程。 这些血泪教训让我明白,在技术这条路上,捷径往往是最远的路。每

By Ne0inhk