当前位置: 首页 > news >正文

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() 方法时,队列中的所有操作才会按顺序依次执行,确保操作的连贯性。
  • 上下文关联:动作链会记录操作的上下文(如当前鼠标位置),后续操作会基于前序操作的状态进行(例如拖拽需要先定位起始元素,再移动到目标元素)。

基本使用流程

  1. 导入模块
    from selenium.webdriver import ActionChains
    
  2. 创建动作链实例
    actions = ActionChains(driver)  # driver 为浏览器驱动实例
    
  3. 添加操作到队列
    # 示例:定位元素并添加点击操作
    element = driver.find_element(By.ID, "target")
    actions.click(element)  # 操作存入队列,未执行
    
  4. 执行所有操作
    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+CShift+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() 无操作
    

注意

  1. 操作顺序:动作链的执行严格按照添加顺序,需确保逻辑符合用户操作习惯(例如拖拽必须先按住再移动)。
  2. 元素可见性:动作链操作的元素必须可见(不可被遮挡),否则可能触发异常(如 ElementNotInteractableException)。
  3. 配合等待机制:若元素加载存在延迟,需先用显式等待确保元素可交互后再添加到动作链,避免操作失败。
  4. 浏览器兼容性:部分动作(如复杂拖拽)在不同浏览器中的表现可能略有差异,建议优先使用 Chrome 进行测试。

动作链是 Selenium 处理复杂交互场景的核心工具,通过组合鼠标、键盘操作,可高度模拟真实用户行为例如滑块操作等。实际使用中,需根据具体场景选择合适的方法,并注意操作的连贯性和元素的可交互状态,以确保自动化脚本的稳定性。

http://www.dtcms.com/a/403064.html

相关文章:

  • 多线程——单例模式
  • 镜头调焦的 调整的是焦距还是像距?
  • (四)React+.Net+Typescript全栈(错误处理)
  • @ant-design/icons-vue 打包成多格式库
  • 什么是营销型网站?杭州建设教育网站
  • C++开发环境(VSCode + CMake + gdb)
  • JAVA CodeX精选实用代码示例
  • 肥东网站建设南京医院网站建设
  • Qt 多线程解析
  • ZooKeeper与Kafka分布式:从基础原理到集群部署
  • 免费网站服务器安全软件下载wordpress权限设置方法
  • three.js射线拾取点击位置与屏幕坐标映射
  • AutoMQ × Ververica:打造云原生实时数据流最佳实践!
  • Laravel5.8 使用 snappyPDF 生成PDF文件
  • 自己做网站的图片手机芒果tv2016旧版
  • L4 vs L7 负载均衡:彻底理解、对比与实战指南
  • wordpress站群软件自己的网站怎么赚钱
  • 零知IDE——基于STM32F407VET6和MCP2515实现CAN通信与数据采集
  • 若依框架-Spring Boot
  • 全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!
  • 自建网站推广的最新发展wordpress同步到报价号
  • 4、导线、端子及印制电路板元器件的插装、焊接及拆焊
  • 【Java八股文】13-中间件面试篇
  • (四)优雅重构:洞悉“搬移特性”的艺术与实践
  • 网站建设专用图形库商务网站建设方案
  • 快速入门HarmonyOS应用开发(三)
  • Easysearch 国产替代 Elasticsearch:8 大核心问题解读
  • 【机器学习】搭建对抗神经网络模型来实现 MNIST 手写数字生成
  • 做推广的网站那个好中国机房建设公司排名
  • odoo18应用、队列服务器分离(SSHFS)