Selenium使用教程
Selenium 介绍
Selenium 是一款用于 web 应用程序自动化测试的工具,也广泛用于网络爬虫、网页自动化操作等场景。相比其他工具(如 Requests 结合 BeautifulSoup),Selenium 的优势在于能直接运行在浏览器环境中它支持多种浏览器(Chrome、Firefox、Edge 等)和多种编程语言(Python、Java、C# 等),完美处理 JavaScript 动态加载的内容,但缺点是运行速度相对较慢,资源消耗较高。,以下将详细介绍其在 Python 环境下的使用方法。
一、安装
1. 安装 Selenium 库
使用 pip 命令安装 Python 版本的 Selenium:
pip install selenium
2. 安装浏览器驱动
Selenium 操作浏览器需要对应浏览器的驱动程序(如 Chrome 需要 ChromeDriver)。推荐使用 webdriver_manager
自动管理驱动,无需手动下载:
pip install webdriver-manager
二、常用库及作用
以下是 Selenium 常用的库及其功能说明:
导入语句 | 作用 |
---|---|
from selenium import webdriver | 核心库,提供操作浏览器的驱动类(如 Chrome、Firefox 等) |
from selenium.webdriver.chrome.service import Service | 用于配置 Chrome 驱动的服务(如指定驱动路径) |
from selenium.webdriver.chrome.options import Options | 用于设置 Chrome 浏览器的参数(如无头模式、窗口大小等) |
from webdriver_manager.chrome import ChromeDriverManager | 自动下载并管理 ChromeDriver,无需手动配置路径 |
from selenium.webdriver.common.by import By | 提供元素定位方式(如 ID、CSS 选择器、XPath 等) |
from selenium.webdriver.common.keys import Keys | 模拟键盘操作(如 Enter、Tab、空格等) |
from selenium.webdriver.support.ui import Select | 专门用于操作下拉框(select 标签)元素 |
from selenium.webdriver.support import expected_conditions as EC | 提供等待条件判断(如元素是否可见、是否存在等) |
from selenium.webdriver.support.ui import WebDriverWait | 显式等待工具,配合 EC 使用,等待元素满足条件 |
from selenium.webdriver import ActionChains | 动作链,用于模拟复杂操作(如拖拽、悬停、右键等) |
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.common.keys import Keys
# 下拉框
from selenium.webdriver.support.ui import Select# 判断
from selenium.webdriver.support import expected_conditions as EC
# 等待
from selenium.webdriver.support.ui import WebDriverWait
# 动作链
from selenium.webdriver import ActionChains
三、浏览器配置
无头模式(Headless) 与隐藏自动化控制特征
无头模式即无界面运行浏览器,适合服务器环境或无需显示界面的场景,配置方式如下:
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsopt = Options()
# 设置无头模式
opt.add_argument('--disable-blink-features=Automationcontrolled')
# 隐藏自动化控制
opt.add_experimental_option("excludeSwitches", ["enable-automation"])
# 保持浏览器打开
opt.add_experimental_option('detach', True)
# 启动浏览器(结合 webdriver_manager 自动管理驱动)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=opt)
四、等待机制
Selenium 提供三种等待方式,用于处理网页加载延迟导致的元素定位失败问题:
1. 隐式等待(Implicit Wait)
全局设置,对所有元素生效,等待元素加载超时前持续尝试定位:
driver = webdriver.Chrome()
# 设置隐式等待时间为 10 秒(只需要设置一次)
driver.implicitly_wait(10)
2. 显式等待(Explicit Wait)
针对特定元素设置等待条件,超时前满足条件则继续执行:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By# 等待 10 秒,直到元素(ID 为 "username")可见
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "username"))
)
3. 强制等待(Sleep)
直接暂停程序,不推荐频繁使用(会降低效率):
import time
# 强制等待 3 秒
time.sleep(3)
五、页面加载策略
Selenium 提供三种页面加载策略,控制浏览器何时停止等待页面加载:
chrome_options = Options()
# 策略 1:normal(默认)- 等待页面完全加载(所有资源加载完成)
chrome_options.page_load_strategy = "normal"# 策略 2:eager - 等待 DOM 加载完成(不等待图片、样式等资源)
chrome_options.page_load_strategy = "eager"# 策略 3:none - 不等待页面加载,立即返回
chrome_options.page_load_strategy = "none"driver = webdriver.Chrome(options=chrome_options)
六、浏览器基本操作
1. 打开浏览器并访问网页
driver = webdriver.Chrome() # 打开 Chrome 浏览器
driver.get("https://www.example.com") # 访问指定 URL
2. 窗口大小与位置设置
driver.maximize_window() # 最大化窗口
driver.minimize_window() # 最小化窗口
driver.set_window_size(1200, 800) # 设置窗口大小(宽,高)
driver.set_window_position(100, 100) # 设置窗口位置(x,y 坐标)
3. 导航操作
driver.back() # 后退到上一页
driver.forward() # 前进到下一页
driver.refresh() # 刷新当前页面
4. 获取网页信息
print(driver.title) # 获取页面标题
print(driver.current_url) # 获取当前 URL
print(driver.page_source) # 获取网页 HTML 源代码
5. 关闭浏览器
driver.close() # 关闭当前窗口
driver.quit() # 关闭所有窗口并退出驱动(推荐)
七、元素定位与操作
1. 常用定位方式(By 类)
from selenium.webdriver.common.by import By# 通过 ID 定位
element = driver.find_element(By.ID, "element_id")# 通过 CSS 选择器定位
element = driver.find_element(By.CSS_SELECTOR, ".class_name")# 通过 XPath 定位
element = driver.find_element(By.XPATH, "//tag[@attribute='value']")# 其他方式:NAME、CLASS_NAME、TAG_NAME、LINK_TEXT、PARTIAL_LINK_TEXT
2. 元素操作
element.click() # 点击元素
element.send_keys("文本内容") # 输入文本
element.clear() # 清空输入框
print(element.text) # 获取元素文本
print(element.get_attribute("href")) # 获取元素属性值
3. 下拉框操作(Select 类)
from selenium.webdriver.support.ui import Selectselect_element = driver.find_element(By.ID, "select_id")
select = Select(select_element)select.select_by_index(0) # 通过索引选择(从 0 开始)
select.select_by_value("value") # 通过 option 的 value 属性选择
select.select_by_visible_text("选项文本") # 通过可见文本选择
八、窗口与 Frame 切换
1. 窗口切换(句柄操作)
当页面打开新窗口时,需通过窗口句柄切换:
# 获取当前所有窗口句柄(句柄是窗口的唯一标识)
all_handles = driver.window_handles
# 切换到最后一个窗口(通常是新打开的窗口)
driver.switch_to.window(all_handles[-1])
# 切换回第一个窗口
driver.switch_to.window(all_handles[0])
2. Frame 切换
网页中的 iframe 或 frame 需先切换才能操作内部元素:
# 通过 ID 切换到 frame
driver.switch_to.frame("frame_id")# 通过元素切换到 frame
frame_element = driver.find_element(By.XPATH, "//iframe")
driver.switch_to.frame(frame_element)# 切回主文档(重要!操作完 frame 后需切回)
driver.switch_to.default_content()
九、动作链(ActionChains)
在 Selenium 中,动作链(ActionChains) 是用于模拟复杂用户交互的工具,可实现鼠标悬停、拖拽、右键点击、键盘组合键等单步操作难以完成的行为。它将一系列操作按顺序存储在队列中,通过 perform()
方法一次性执行,完美模拟真实用户的连续操作逻辑。
动作链的核心原理
- 队列机制:动作链通过
ActionChains(driver)
创建实例后,调用的每一个操作方法(如click()
、move_to_element()
)都会被存入内部队列,不会立即执行。 - 批量执行:只有调用
perform()
方法时,队列中的所有操作才会按顺序依次执行,确保操作的连贯性。 - 上下文关联:动作链会记录操作的上下文(如当前鼠标位置),后续操作会基于前序操作的状态进行(例如拖拽需要先定位起始元素,再移动到目标元素)。
基本使用流程
- 导入模块:
from selenium.webdriver import ActionChains
- 创建动作链实例:
actions = ActionChains(driver) # driver 为浏览器驱动实例
- 添加操作到队列:
# 示例:定位元素并添加点击操作 element = driver.find_element(By.ID, "target") actions.click(element) # 操作存入队列,未执行
- 执行所有操作:
actions.perform() # 执行队列中所有操作
常用动作链方法及示例
以下是实际场景中高频使用的动作链方法,按功能分类说明:
1. 鼠标基础操作
-
click(element)
:点击指定元素(与直接调用element.click()
等效,但可整合到动作链中)。# 示例:点击按钮 button = driver.find_element(By.ID, "submit_btn") ActionChains(driver).click(button).perform()
-
context_click(element)
:右键点击元素(弹出上下文菜单)。# 示例:右键点击图片 image = driver.find_element(By.TAG_NAME, "img") ActionChains(driver).context_click(image).perform()
-
double_click(element)
:双击元素(如双击文本选中、双击按钮触发特定事件)。# 示例:双击文本框选中内容 input_box = driver.find_element(By.ID, "username") ActionChains(driver).double_click(input_box).perform()
2. 鼠标移动与悬停
-
move_to_element(element)
:将鼠标悬停在指定元素上(常用于触发下拉菜单、tooltip 提示等)。# 示例:悬停在导航菜单上显示下拉选项 menu = driver.find_element(By.CSS_SELECTOR, ".nav-menu") ActionChains(driver).move_to_element(menu).perform() # 悬停后下拉菜单展开
-
move_by_offset(xoffset, yoffset)
:相对于当前鼠标位置移动指定像素(x 轴正方向为右,y 轴正方向为下)。# 示例:从当前位置向右移动 100px,向下移动 50px ActionChains(driver).move_by_offset(100, 50).perform()
-
move_to_element_with_offset(element, xoffset, yoffset)
:相对于指定元素的左上角移动指定像素(常用于点击元素内的特定位置,如图片的某个区域)。# 示例:点击图片左上角向右 50px、向下 30px 的位置 image = driver.find_element(By.TAG_NAME, "img") ActionChains(driver).move_to_element_with_offset(image, 50, 30).click().perform()
3. 拖拽与释放
-
drag_and_drop(source, target)
:将源元素拖拽到目标元素并释放(最常用的拖拽方式)。# 示例:拖拽滑块到目标位置 source = driver.find_element(By.ID, "slider") # 滑块元素 target = driver.find_element(By.ID, "target_area") # 目标区域 ActionChains(driver).drag_and_drop(source, target).perform()
-
drag_and_drop_by_offset(source, xoffset, yoffset)
:将源元素拖拽指定像素后释放(适用于无明确目标元素的场景,如下拉刷新)。# 示例:将元素向右拖拽 200px element = driver.find_element(By.ID, "draggable") ActionChains(driver).drag_and_drop_by_offset(element, 200, 0).perform()
-
分步拖拽:通过
click_and_hold()
(按住元素)、move_to_element()
(移动到目标)、release()
(释放)组合实现复杂拖拽。# 示例:分步拖拽(效果与 drag_and_drop 一致,但更灵活) source = driver.find_element(By.ID, "source") target = driver.find_element(By.ID, "target") ActionChains(driver)\.click_and_hold(source)\ # 按住源元素.move_to_element(target)\ # 移动到目标元素.release()\ # 释放鼠标.perform()
4. 键盘操作
动作链可结合 Keys
类实现键盘按键组合(如 Ctrl+C
、Shift+A
等)。
-
send_keys(keys_to_send)
:向当前聚焦的元素发送键盘输入(需先通过click()
或move_to_element()
聚焦)。from selenium.webdriver.common.keys import Keys# 示例:在输入框中输入文本并按 Enter input_box = driver.find_element(By.ID, "search") ActionChains(driver)\.click(input_box)\ # 聚焦输入框.send_keys("selenium")\ # 输入文本.send_keys(Keys.ENTER)\ # 按 Enter 键.perform()
-
key_down(keys, element)
与key_up(keys, element)
:按住/释放指定按键(常用于组合键)。# 示例:Ctrl+A 选中输入框内容,然后 Ctrl+C 复制 input_box = driver.find_element(By.ID, "content") ActionChains(driver)\.click(input_box)\.key_down(Keys.CONTROL)\ # 按住 Ctrl 键.send_keys("a")\ # 按下 A(等效于 Ctrl+A).send_keys("c")\ # 按下 C(等效于 Ctrl+C).key_up(Keys.CONTROL)\ # 释放 Ctrl 键.perform()
5. 其他常用操作
-
pause(seconds)
:在动作链中插入等待(单位:秒),用于模拟用户操作间隔。# 示例:点击后等待 2 秒再执行下一步 button = driver.find_element(By.ID, "next_btn") ActionChains(driver)\.click(button)\.pause(2)\ # 等待 2 秒.click(driver.find_element(By.ID, "confirm_btn"))\.perform()
-
reset_actions()
:清空当前动作链的操作队列(放弃未执行的操作)。actions = ActionChains(driver) actions.click(element1).move_to_element(element2) actions.reset_actions() # 清空队列,后续 perform() 无操作
注意
- 操作顺序:动作链的执行严格按照添加顺序,需确保逻辑符合用户操作习惯(例如拖拽必须先按住再移动)。
- 元素可见性:动作链操作的元素必须可见(不可被遮挡),否则可能触发异常(如
ElementNotInteractableException
)。 - 配合等待机制:若元素加载存在延迟,需先用显式等待确保元素可交互后再添加到动作链,避免操作失败。
- 浏览器兼容性:部分动作(如复杂拖拽)在不同浏览器中的表现可能略有差异,建议优先使用 Chrome 进行测试。
动作链是 Selenium 处理复杂交互场景的核心工具,通过组合鼠标、键盘操作,可高度模拟真实用户行为例如滑块操作等。实际使用中,需根据具体场景选择合适的方法,并注意操作的连贯性和元素的可交互状态,以确保自动化脚本的稳定性。