Selenium 自动化测试与爬虫实战:从环境搭建到高级应用

目录

[一、Selenium 是什么?](#一、Selenium 是什么?)

二、环境搭建:从安装到测试

[1. 安装 Selenium 库](#1. 安装 Selenium 库)

[2. 下载浏览器驱动](#2. 下载浏览器驱动)

[3. 测试环境是否可用](#3. 测试环境是否可用)

[三、Selenium 核心用法](#三、Selenium 核心用法)

[1. 基本操作:访问页面与获取信息](#1. 基本操作:访问页面与获取信息)

[2. 元素定位:找到页面中的节点](#2. 元素定位:找到页面中的节点)

[3. 交互操作:模拟用户行为](#3. 交互操作:模拟用户行为)

[4. 处理 iframe:切换嵌套页面](#4. 处理 iframe:切换嵌套页面)

[5. 动作链:处理复杂交互](#5. 动作链:处理复杂交互)

[6. 执行 JavaScript:扩展操作能力](#6. 执行 JavaScript:扩展操作能力)

四、高级实战:处理验证码与动态加载

[1. 处理点选验证码](#1. 处理点选验证码)

[2. 处理图片懒加载](#2. 处理图片懒加载)

[五、Selenium 爬虫注意事项](#五、Selenium 爬虫注意事项)

六、总结


Selenium 是一款强大的 Web 自动化工具,最初用于网站测试,如今也成为爬虫领域处理动态网页的利器。无论是模拟用户操作、处理 JavaScript 渲染内容,还是应对验证码,Selenium 都能胜任。本文将从环境搭建开始,逐步讲解 Selenium 的核心用法与实战技巧。

一、Selenium 是什么?

Selenium 本质是一个 "浏览器自动化控制器",它可以模拟人类在浏览器中的操作(如点击、输入、滚动等),并能获取浏览器渲染后的动态内容。与传统爬虫工具(如 Requests+BeautifulSoup)相比,Selenium 的优势在于:

  • 能处理 JavaScript 动态生成的内容(如 Ajax 加载、懒加载数据)。
  • 支持模拟登录、点击按钮、下拉菜单等交互操作。
  • 可直接运行在主流浏览器(Chrome、Firefox 等),贴近真实用户行为。
二、环境搭建:从安装到测试

Selenium 的使用需要 "工具包 + 浏览器驱动" 的配合,以下是详细步骤:

1. 安装 Selenium 库

推荐使用 Python 环境,通过 pip 安装指定版本(3.x 版本稳定性较好):

复制代码
pip install selenium==3.0.0
2. 下载浏览器驱动

Selenium 需要浏览器驱动(Driver)来控制浏览器,不同浏览器对应不同驱动:

操作步骤

  • 查看浏览器版本(如 Chrome:设置→关于 Chrome)。
  • 下载对应版本的驱动,解压后得到可执行文件(如chromedriver.exe)。
  • 将驱动文件放在项目目录下,或添加到系统环境变量(避免每次指定路径)。
3. 测试环境是否可用

编写简单代码,验证是否能启动浏览器并访问网页:

复制代码
from selenium import webdriver

# 初始化Chrome浏览器(指定驱动路径)
driver = webdriver.Chrome(executable_path="./chromedriver.exe")
# 访问百度
driver.get("https://www.baidu.com")
# 停留3秒后关闭浏览器
import time
time.sleep(3)
driver.quit()

若成功弹出 Chrome 浏览器并打开百度页面,则环境搭建完成。

三、Selenium 核心用法
1. 基本操作:访问页面与获取信息
复制代码
from selenium import webdriver

driver = webdriver.Chrome(executable_path="./chromedriver.exe")
driver.get("https://www.baidu.com")  # 打开网页

# 获取页面信息
print("当前URL:", driver.current_url)  # 输出:https://www.baidu.com
print("页面源码:", driver.page_source)  # 获取渲染后的HTML
driver.save_screenshot("baidu.png")  # 页面截图

driver.close()  # 关闭当前标签页(driver.quit()关闭整个浏览器)
2. 元素定位:找到页面中的节点

Selenium 提供多种元素定位方法,常用的有以下几种(以百度搜索框为例):

定位方式 代码示例 说明
ID 定位 driver.find_element_by_id("kw") 通过id="kw"定位
CSS 选择器 driver.find_element_by_css_selector("#kw") 支持复杂选择器
XPath 路径 driver.find_element_by_xpath("//input[@id='kw']") 灵活定位任意节点
标签名 driver.find_element_by_tag_name("input") 适合唯一标签,慎用
链接文本 driver.find_element_by_link_text("新闻") 定位<a>标签的文本内容

注意

  • find_element_xxx返回第一个匹配元素,find_elements_xxx返回所有匹配元素(列表)。
  • Selenium 4.x 中,find_element_by_xxx方法已废弃,推荐使用find_element(By.ID, "kw")(需导入from selenium.webdriver.common.by import By)。
3. 交互操作:模拟用户行为

以 "百度搜索" 为例,模拟输入关键词并点击搜索按钮:

复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome(executable_path="./chromedriver.exe")
driver.get("https://www.baidu.com")

# 定位搜索框并输入文字
search_input = driver.find_element(By.ID, "kw")
search_input.send_keys("Selenium教程")  # 输入文本
time.sleep(1)

# 定位搜索按钮并点击
search_button = driver.find_element(By.ID, "su")
search_button.click()  # 点击按钮
time.sleep(3)

driver.quit()

其他常用交互方法:

  • clear():清空输入框内容。
  • submit():提交表单(如按回车)。
  • get_attribute("href"):获取元素属性(如链接地址)。
4. 处理 iframe:切换嵌套页面

网页中常通过<iframe>标签嵌套子页面(如登录框、视频播放器),Selenium 默认在父页面查找元素,需先切换到 iframe 才能操作内部元素:

复制代码
# 以QQ空间登录为例
driver.get("https://qzone.qq.com/")

# 切换到iframe(通过id或name定位)
driver.switch_to.frame("login_frame")

# 操作iframe内的元素(如点击"账号密码登录")
driver.find_element(By.ID, "switcher_plogin").click()

# 切回父页面(如需操作外部元素)
driver.switch_to.default_content()
5. 动作链:处理复杂交互

对于鼠标拖曳、右键点击、悬停等无特定对象的操作,需使用ActionChains(动作链):

复制代码
from selenium.webdriver import ActionChains

# 示例:鼠标悬停在某个元素上
menu = driver.find_element(By.CSS_SELECTOR(".nav-menu"))
ActionChains(driver).move_to_element(menu).perform()  # 悬停

# 示例:拖曳元素(从A到B)
source = driver.find_element(By.ID, "source")
target = driver.find_element(By.ID, "target")
ActionChains(driver).drag_and_drop(source, target).perform()  # 拖曳
6. 执行 JavaScript:扩展操作能力

Selenium 支持直接运行 JavaScript 代码,用于处理 API 未覆盖的场景(如滚动页面、修改元素属性):

复制代码
# 向下滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")

# 修改元素属性(如移除禁用状态)
driver.execute_script("document.getElementById('submit').removeAttribute('disabled')")
四、高级实战:处理验证码与动态加载
1. 处理点选验证码

很多网站登录时会出现点选验证码(如 "点击图片中的文字"),需结合图片处理和动作链实现自动点击:

复制代码
from selenium import webdriver
from selenium.webdriver import ActionChains
from PIL import Image
import time

driver = webdriver.Chrome(executable_path="./chromedriver.exe")
driver.get("https://example.com/login")

# 1. 截取验证码图片
driver.save_screenshot("full_page.png")  # 截取全屏
code_img = driver.find_element(By.CSS_SELECTOR(".verify-code"))  # 定位验证码元素

# 获取验证码在屏幕中的位置
location = code_img.location  # 左上角坐标
size = code_img.size  # 宽高
left, top = location["x"], location["y"]
right, bottom = left + size["width"], top + size["height"]

# 裁剪验证码图片
full_img = Image.open("full_page.png")
code_img_crop = full_img.crop((left, top, right, bottom))
code_img_crop.save("code.png")

# 2. 调用验证码识别接口(如打码平台),获取点击坐标(示例返回"x1,y1|x2,y2")
# result = verify_code_api("code.png")
result = "100,50|200,80"  # 假设识别结果

# 3. 动作链点击验证码
for pos in result.split("|"):
    x, y = map(int, pos.split(","))
    # 相对于验证码元素的偏移量点击
    ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform()
    time.sleep(1)
2. 处理图片懒加载

对于采用懒加载的图片(如前文提到的data-src属性),Selenium 可通过滚动触发加载,再提取真实地址:

复制代码
# 滚动页面,触发懒加载
def scroll_to_load(driver):
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        # 滚动到底部
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
        time.sleep(2)  # 等待加载
        # 检查是否已滚动到页面底部
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height

# 加载完成后提取图片真实地址
scroll_to_load(driver)
images = driver.find_elements(By.CSS_SELECTOR("img.lazy"))
for img in images:
    real_src = img.get_attribute("data-src")  # 提取真实地址
    print(real_src)
五、Selenium 爬虫注意事项
  1. 反爬规避

    • 避免频繁请求,添加随机time.sleep()

    • 模拟真实浏览器参数(如设置user-agent)。

    • 使用无头浏览器(如 Chrome 无头模式)减少被检测概率:

      复制代码
      options = webdriver.ChromeOptions()
      options.add_argument("--headless")  # 无头模式
      driver = webdriver.Chrome(options=options)
  2. 性能优化

    • 避免不必要的页面加载(如禁用图片、CSS 加载)。
    • 及时关闭不再使用的标签页(driver.close())。
  3. 版本兼容

    • Selenium 3.x 与 4.x 语法有差异(如 4.x 移除executable_path,需用Service类),需注意版本匹配。
六、总结

Selenium 凭借对浏览器的完全控制能力,成为处理动态网页和复杂交互的首选工具。从环境搭建到元素定位、交互操作,再到验证码处理和懒加载应对,掌握这些技巧能让你在自动化测试和爬虫开发中更加得心应手。实际使用中,需结合场景灵活运用,并注意规避反爬机制,平衡效率与稳定性。

相关推荐
Dxy12393102163 小时前
报错:selenium.common.exceptions.ElementNotInteractableException: Message
selenium·测试工具·microsoft
敲上瘾6 小时前
渗透测试常用指令
服务器·测试工具·网络安全·压力测试
天若有情67310 小时前
【python】Python爬虫入门教程:使用requests库
开发语言·爬虫·python·网络爬虫·request
fsnine19 小时前
网络爬虫(python)入门
开发语言·爬虫·python
纳米软件20 小时前
是德科技的BenchVue和纳米软件的ATECLOUD有哪些区别?
测试工具·自动化·集成测试
Dreamsi_zh20 小时前
Python爬虫07_Requests爬取图片
开发语言·爬虫·python
yzx9910131 天前
关于PHP学习
运维·爬虫·自动化·php
ALex_zry1 天前
Valgrind终极指南:深入内存安全与性能瓶颈检测
测试工具·安全
gc_22991 天前
学习Python中Selenium模块的基本用法(4:WebDriver常用属性及函数)
python·selenium