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

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

目录

一、Selenium 是什么?

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

1. 安装 Selenium 库

2. 下载浏览器驱动

3. 测试环境是否可用

三、Selenium 核心用法

1. 基本操作:访问页面与获取信息

2. 元素定位:找到页面中的节点

3. 交互操作:模拟用户行为

4. 处理 iframe:切换嵌套页面

5. 动作链:处理复杂交互

6. 执行 JavaScript:扩展操作能力

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

1. 处理点选验证码

2. 处理图片懒加载

五、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:ChromeDriver(需与浏览器版本匹配)。
  • Firefox:GeckoDriver。

操作步骤

  • 查看浏览器版本(如 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 timetime.sleep(3)driver.quit()

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

三、Selenium 核心用法
1. 基本操作:访问页面与获取信息
from selenium import webdriverdriver = webdriver.Chrome(executable_path=\"./chromedriver.exe\")driver.get(\"https://www.baidu.com\") # 打开网页# 获取页面信息print(\"当前URL:\", driver.current_url) # 输出:https://www.baidu.comprint(\"页面源码:\", driver.page_source) # 获取渲染后的HTMLdriver.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(\"新闻\") 定位标签的文本内容

注意

  • 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 webdriverfrom selenium.webdriver.common.by import Byimport timedriver = 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:切换嵌套页面

网页中常通过标签嵌套子页面(如登录框、视频播放器),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 webdriverfrom selenium.webdriver import ActionChainsfrom PIL import Imageimport timedriver = 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 凭借对浏览器的完全控制能力,成为处理动态网页和复杂交互的首选工具。从环境搭建到元素定位、交互操作,再到验证码处理和懒加载应对,掌握这些技巧能让你在自动化测试和爬虫开发中更加得心应手。实际使用中,需结合场景灵活运用,并注意规避反爬机制,平衡效率与稳定性。