Python Selenium 完整安装与使用详解

一、核心概念

Selenium 是自动化浏览器工具,可模拟人操作网页(点击、输入、爬虫、自动化测试),分为三部分:
  1. selenium Python 库:代码驱动接口
  2. 浏览器驱动(ChromeDriver/EdgeDriver/FirefoxDriver):桥梁,代码 ↔ 浏览器
  3. 本地浏览器(Chrome、Edge、Firefox)

二、环境安装

1. 安装 selenium 库

打开终端 / CMD,执行:
# 稳定版推荐
pip install selenium
# 国内镜像加速
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
 

2. 浏览器驱动(两种方案,优先方案 2)

方案 1:手动下载驱动(过时,需匹配版本)

  1. 查看 Chrome 版本:浏览器右上角 → 设置 → 关于 Chrome
  2. 下载对应版本 ChromeDriver:https://chromedriver.chromium.org/downloads
  3. 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()

 但是,还是慢,和谷歌网络一样慢,输出结果如下:

image

 方案三:

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浏览器的速度一样的感觉。

输出结果没有报错,如下所示:

image 

七、等待机制(重点!解决加载找不到元素报错)

网站异步加载,直接定位会报错,三种等待:

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:元素出现在 DOM
  • EC.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()
 

十一、常见报错与解决方案

  1. WebDriverException: 驱动版本不匹配
     
    解决:使用 webdriver-manager 自动管理驱动,不再手动下载
  2. NoSuchElementException 找不到元素
    • 未加等待,页面没加载完;改用显式等待
    • 元素在 iframe 里,需要 switch_to.frame
    • Xpath/CSS 选择器写错
  3. 元素不可点击 ElementClickInterceptedException
    • 弹窗遮挡、页面未滚动到底部
    • JS 滚动到元素:driver.execute_script("arguments[0].scrollIntoView();", elem)
  4. 网站检测 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)
 

十三、爬虫防封锁进阶补充

  1. 添加随机 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")
 
  1. 代理 IP 设置:
 
opt.add_argument("--proxy-server=http://ip:port")
 
  1. 禁用图片加载,提升访问速度。
posted @ 2026-07-13 17:15  chenlight  阅读(29)  评论(0)    收藏  举报