Python Selenium 完整安装与使用详解
一、核心概念
Selenium 是自动化浏览器工具,可模拟人操作网页(点击、输入、爬虫、自动化测试),分为三部分:
seleniumPython 库:代码驱动接口- 浏览器驱动(ChromeDriver/EdgeDriver/FirefoxDriver):桥梁,代码 ↔ 浏览器
- 本地浏览器(Chrome、Edge、Firefox)
二、环境安装
1. 安装 selenium 库
打开终端 / CMD,执行:
# 稳定版推荐
pip install selenium
# 国内镜像加速
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 浏览器驱动(两种方案,优先方案 2)
方案 1:手动下载驱动(过时,需匹配版本)
- 查看 Chrome 版本:浏览器右上角 → 设置 → 关于 Chrome
- 下载对应版本 ChromeDriver:https://chromedriver.chromium.org/downloads
- 将
chromedriver.exe放到 Python 根目录 / 代码同级文件夹
方案 2:自动管理驱动(推荐,无需手动匹配)
安装
webdriver-manager,自动下载对应浏览器驱动:pip install webdriver-manager
三、最简入门示例(Chrome)
示例 1:自动管理驱动(不用手动放 exe)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 自动获取匹配版本驱动
service = Service(ChromeDriverManager().install())
# 启动Chrome浏览器
driver = webdriver.Chrome(service=service)
# 访问网页
driver.get("https://www.baidu.com")
# 打印网页标题
print(driver.title)
# 关闭浏览器
driver.quit()
示例 2:手动指定驱动路径(本地已有 chromedriver.exe)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 填写驱动文件路径
service = Service(r"./chromedriver.exe")
driver = webdriver.Chrome(service=service)
driver.get("https://www.baidu.com")
driver.quit()
四、常用配置(无头、禁用弹窗、隐藏特征)
1. 无头模式(后台运行,不弹出浏览器窗口)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
# 配置项
chrome_options = Options()
# 无头模式
chrome_options.add_argument("--headless=new")
# 禁用GPU
chrome_options.add_argument("--disable-gpu")
# 设置窗口大小
chrome_options.add_argument("window-size=1920,1080")
# 隐藏自动化特征,防网站检测
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option("useAutomationExtension", False)
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)
driver.get("https://www.baidu.com")
print(driver.page_source) # 获取网页源码
driver.quit()
2. 常用参数说明
chrome_options.add_argument("--no-sandbox") # Linux服务器必备
chrome_options.add_argument("--disable-dev-shm-usage") # 解决内存不足
chrome_options.add_argument("--mute-audio") # 静音网页视频
chrome_options.add_argument("--blink-settings=imagesEnabled=false") # 不加载图片,提速
五、元素定位八大方法(Selenium4 标准)
导入定位工具
from selenium.webdriver.common.by import By
| 定位方式 | 代码 | 适用场景 |
|---|---|---|
| ID | driver.find_element(By.ID, "id值") |
唯一 id,最快 |
| Name | driver.find_element(By.NAME, "name值") |
表单 name 属性 |
| Class | driver.find_element(By.CLASS_NAME, "类名") |
单一 class |
| Tag 标签 | driver.find_element(By.TAG_NAME, "div") |
根据标签查找 |
| 链接文本 | driver.find_element(By.LINK_TEXT, "完整文字") |
a 标签完整文字 |
| 部分链接 | driver.find_element(By.PARTIAL_LINK_TEXT, "部分文字") |
a 标签模糊匹配 |
| XPath | driver.find_element(By.XPATH, "//div[@class='xxx']") |
万能,复杂页面 |
| CSS 选择器 | driver.find_element(By.CSS_SELECTOR, "#id .class") |
前端常用,速度快 |
示例:百度搜索输入框操作
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
# service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
time.sleep(5)
# 1. 定位搜索框输入文字
search_input = driver.find_element(By.ID, "kw")
search_input.send_keys("Python Selenium教程")
# 2. 点击搜索按钮
submit_btn = driver.find_element(By.ID, "su")
submit_btn.click()
time.sleep(3)
driver.quit()
亲测可用!!!
六、启动速度
Selenium4 默认会强制联网拉取谷歌版本清单,超时才会用本地驱动,和你放没放 Scripts 目录无关
就算驱动在虚拟环境 Scripts,代码启动时依然会先阻塞等待谷歌接口超时,这就是慢的核心。
注意:是非常的慢,要访问谷歌的github网络,要等待好几分钟,太慢了,也仅仅不到10行代码就这么慢。方案一:
import os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from lxml import etree
# 全局设置国内镜像,不再访问谷歌
os.environ['WDM_CHROMEDRIVER_DOWNLOAD_URL'] = 'https://npmmirror.com/mirrors/chromedriver' # 下载旧版chromedriver
os.environ['WDM_CHROME_FOR_TESTING_URL'] = 'https://cdn.npmmirror.com/binaries/chrome-for-testing' # 下载新版chromedriver
driver_path = ChromeDriverManager().install()
service = Service(driver_path)
browser = webdriver.Chrome(service=service)
browser.get('https://careers.aliyun.com/off-campus/position-list?lang=zh')
# print(browser.page_source)
tree = etree.HTML(browser.page_source)
result = tree.xpath('//div[@class="_1RRlPtjyYmeDGCWt9lrk2P _3vj2eS7k7Mwpko5_6OSRu2"]/text()')
print(result)
使用国内镜像源,比使用谷歌网络要快点,但是总体感受也是慢。
方案二:
from lxml import etree
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
browser = webdriver.Chrome()
browser.get('https://careers.aliyun.com/off-campus/position-list?lang=zh')
tree = etree.HTML(browser.page_source)
result = tree.xpath('//div[@class="_1RRlPtjyYmeDGCWt9lrk2P _3vj2eS7k7Mwpko5_6OSRu2"]/text()')
print(result)
此处是将chromedriver.exe放在了I:\python\自动化测试框架\.venv\Scripts虚拟环境的目录,虽然代码可以简写成
browser = webdriver.Chrome()
但是,还是慢,和谷歌网络一样慢,输出结果如下:

方案三:
from lxml import etree
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
service = Service(r"I:\python\自动化测试框架\.venv\Scripts\chromedriver.exe")
browser = webdriver.Chrome(service=service)
browser.get('https://careers.aliyun.com/off-campus/position-list?lang=zh')
tree = etree.HTML(browser.page_source)
result = tree.xpath('//div[@class="_1RRlPtjyYmeDGCWt9lrk2P _3vj2eS7k7Mwpko5_6OSRu2"]/text()')
print(result)
直接手动指定chrmoedriver.exe所在的位置,这时候的代码启动就相当快了,和双击打开chrome浏览器的速度一样的感觉。
输出结果没有报错,如下所示:
七、等待机制(重点!解决加载找不到元素报错)
网站异步加载,直接定位会报错,三种等待:
1. 强制等待(time.sleep,不推荐)
简单粗暴,固定等待几秒:
import time
time.sleep(2)
2. 隐式等待(全局)
设置最长等待时间,所有元素统一等待:
driver.implicitly_wait(10) # 最多等10秒,找到立刻执行
3. 显式等待(推荐,精准等待单个元素)
只等待目标元素,性能最好:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 最多等10秒,直到元素可点击
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, "su")))
element.click()
常用等待条件:
EC.presence_of_element_located:元素出现在 DOMEC.visibility_of_element_located:元素可见EC.element_to_be_clickable:元素可点击EC.title_contains("百度"):标题包含文字
八、常用操作 API 大全
1. 输入、清空、点击
elem.send_keys("文本") # 输入内容
elem.clear() # 清空输入框
elem.click() # 点击元素
2. 获取元素信息
elem.text # 获取元素内可见文字
elem.get_attribute("href") # 获取属性值
driver.current_url # 当前页面url
driver.title # 页面标题
driver.page_source # 完整网页源码
3. 浏览器窗口控制
driver.back() # 返回上一页
driver.forward() # 前进
driver.refresh() # 刷新页面
driver.maximize_window() # 最大化窗口
driver.minimize_window() # 最小化
4. 弹窗处理 alert
alert = driver.switch_to.alert
print(alert.text)
alert.accept() # 确认弹窗
alert.dismiss() # 取消弹窗
5. iframe 框架切换
页面内嵌 iframe 时必须切换才能定位内部元素
# 通过id切换iframe
driver.switch_to.frame("iframe_id")
# 切回主页面
driver.switch_to.default_content()
6. 多标签页切换
# 获取所有窗口句柄
windows = driver.window_handles
# 切换到第二个标签
driver.switch_to.window(windows[1])
7. 执行 JS 代码
滚动页面、修改元素属性等
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 移除元素隐藏属性
driver.execute_script("arguments[0].style.display='block';", elem)
九、模拟键盘操作(Keys)
from selenium.webdriver.common.keys import Keys
input_elem.send_keys(Keys.ENTER) # 回车
input_elem.send_keys(Keys.CONTROL, "a") # Ctrl+A全选
input_elem.send_keys(Keys.CONTROL, "v") # 粘贴
input_elem.send_keys(Keys.BACKSPACE) # 退格删除
十、完整综合案例(搜索 + 翻页)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 配置浏览器
opt = Options()
opt.add_argument("--start-maximized")
opt.add_experimental_option("excludeSwitches", ["enable-automation"])
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=opt)
wait = WebDriverWait(driver, 10)
try:
# 打开百度
driver.get("https://www.baidu.com")
# 等待搜索框出现并输入
kw = wait.until(EC.visibility_of_element_located((By.ID, "kw")))
kw.send_keys("selenium自动化")
# 点击搜索
wait.until(EC.element_to_be_clickable((By.ID, "su"))).click()
# 等待结果加载,翻页
next_btn = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "下一页>")))
next_btn.click()
finally:
# 无论是否报错都关闭浏览器
driver.quit()
十一、常见报错与解决方案
-
WebDriverException: 驱动版本不匹配解决:使用
webdriver-manager自动管理驱动,不再手动下载 -
NoSuchElementException 找不到元素
- 未加等待,页面没加载完;改用显式等待
- 元素在 iframe 里,需要 switch_to.frame
- Xpath/CSS 选择器写错
-
元素不可点击 ElementClickInterceptedException
- 弹窗遮挡、页面未滚动到底部
- JS 滚动到元素:
driver.execute_script("arguments[0].scrollIntoView();", elem)
-
网站检测 selenium 被拦截添加隐藏自动化特征配置(上文无头代码内的 excludeSwitches)
十二、Edge / Firefox 使用方式
Edge(只替换驱动部分)
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from selenium.webdriver.edge.service import Service as EdgeService
from selenium.webdriver import Edge
service = EdgeService(EdgeChromiumDriverManager().install())
driver = Edge(service=service)
Firefox
from webdriver_manager.firefox import GeckoDriverManager
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver import Firefox
service = FirefoxService(GeckoDriverManager().install())
driver = Firefox(service=service)
十三、爬虫防封锁进阶补充
- 添加随机 UA:
opt.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
- 代理 IP 设置:
opt.add_argument("--proxy-server=http://ip:port")
- 禁用图片加载,提升访问速度。

浙公网安备 33010602011771号