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

Selenium 包介绍

诸神缄默不语-个人CSDN博文目录

Selenium 是一个强大的工具,主要用于自动化 Web 浏览器的操作。它支持多种编程语言(如 Python、Java、C# 等)和主流浏览器(如 Chrome、Firefox、Safari、Edge 等),广泛应用于自动化测试、爬虫开发和浏览器行为模拟。

文章目录

  • Selenium 的主要功能
  • 安装 Selenium
  • Selenium 的核心组件
  • webdriver
    • `webdriver.Chrome()` 对象
    • `get(url)`
    • `find_element(by, value)`
    • `find_elements(by, value)`
    • `execute_script(script, *args)`
    • `save_screenshot(filename)`
    • `quit()`
    • `get_cookies()` 方法
    • `webdriver.get_cookie(name)`
    • `add_cookie()`
    • `webdriver.delete_cookie(name)`
    • `webdriver.delete_all_cookies()`
    • `webdriver.refresh()`
    • `webdriver.back()`
    • `webdriver.forward()`

Selenium 的主要功能

  1. 浏览器自动化: 打开网页、点击按钮、输入文本、提交表单等。
  2. 跨浏览器支持:支持多种浏览器(需要相应的浏览器驱动程序)。
  3. 动态网页抓取:可以处理 JavaScript 动态加载内容。
  4. 模拟用户操作:模拟键盘输入、鼠标点击、窗口切换等操作。
  5. 扩展测试功能:支持复杂的 UI 测试和页面行为验证。

安装 Selenium

在 Python 环境中,可以使用 pip 进行安装:

pip install selenium

Selenium 的核心组件

  1. WebDriver
    • 提供与浏览器交互的 API。
    • 需要对应的浏览器驱动程序(如 ChromeDriver、GeckoDriver)。
  2. WebElement
    • 表示 HTML 页面中的元素,可以进行点击、输入、获取属性等操作。
  3. ActionChains
    • 支持复杂的用户交互操作(如拖拽、鼠标悬停)。
  4. Waits
    • 提供显式和隐式等待功能,以处理动态加载的页面。

webdriver

from selenium import webdriver

webdriver.Chrome() 对象

在 Selenium 中,webdriver.Chrome() 是用于启动 Chrome 浏览器的 WebDriver。它提供了一个与 Chrome 浏览器交互的接口,可以自动执行浏览器操作,如打开网页、输入数据、点击按钮等。
新版Chrome浏览器下载时自动集成了chromedriver,如果没有下载过需要先下载chromedriver。

参数和高级用法:
webdriver.Chrome() 支持多种参数来配置浏览器行为,如无头模式、设置窗口大小等。

  1. 使用选项配置
    可以通过 webdriver.ChromeOptions 类设置浏览器选项。

    示例:启用无头模式(Headless)
    from selenium import webdriver# 创建 ChromeOptions 实例
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')  # 无头模式
    options.add_argument('--disable-gpu')  # 禁用 GPU(Linux 系统可能需要)# 创建 WebDriver
    driver = webdriver.Chrome(options=options)# 打开网页
    driver.get("https://www.example.com")# 获取页面标题
    print("页面标题:", driver.title)# 关闭浏览器
    driver.quit()
    
  2. 指定 ChromeDriver 路径
    如果 ChromeDriver 不在环境变量中,需要手动指定路径。
    from selenium import webdriver# 指定 ChromeDriver 的路径
    driver = webdriver.Chrome(executable_path='/path/to/chromedriver')# 打开网页
    driver.get("https://www.example.com")
    driver.quit()
    
  3. 设置用户代理
    可以通过添加参数更改用户代理。
    from selenium import webdriver# 配置用户代理
    options = webdriver.ChromeOptions()
    options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36')# 启动浏览器
    driver = webdriver.Chrome(options=options)# 打开网页
    driver.get("https://www.example.com")
    driver.quit()
    
  4. 设置窗口大小
    通过参数设置浏览器窗口大小:
    from selenium import webdriveroptions = webdriver.ChromeOptions()
    options.add_argument('window-size=1200x600')  # 设置窗口大小driver = webdriver.Chrome(options=options)
    driver.get("https://www.example.com")
    driver.quit()
    
  5. 加载扩展
    可以加载 Chrome 扩展程序:
    from selenium import webdriveroptions = webdriver.ChromeOptions()
    options.add_extension('/path/to/extension.crx')  # 添加扩展driver = webdriver.Chrome(options=options)
    driver.get("https://www.example.com")
    driver.quit()
    
  6. 关闭自动化控制提示
    默认情况下,Selenium 会在浏览器中显示“正在由自动化测试软件控制”的提示,可以通过以下代码关闭:
    from selenium import webdriveroptions = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-automation"])  # 去掉自动化提示
    options.add_experimental_option('useAutomationExtension', False)driver = webdriver.Chrome(options=options)
    driver.get("https://www.example.com")
    driver.quit()
    

get(url)

打开指定的 URL。

driver.get("https://www.example.com")

find_element(by, value)

查找页面中的元素(如按钮、输入框等)。

from selenium.webdriver.common.by import Byelement = driver.find_element(By.ID, "element-id")

find_elements(by, value)

查找多个元素。

elements = driver.find_elements(By.CLASS_NAME, "element-class")

execute_script(script, *args)

执行 JavaScript 脚本。

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

save_screenshot(filename)

截取当前页面截图。

driver.save_screenshot("screenshot.png")

quit()

关闭浏览器并结束 WebDriver 会话。

driver.quit()

get_cookies() 方法

在 Selenium 中,get_cookies 是 WebDriver 提供的一个方法,用于获取当前浏览器会话的所有 Cookie 信息。

webdriver.get_cookies()

返回值:

  • 返回一个包含所有 Cookie 信息的 列表
  • 每个 Cookie 是一个字典,字典中包含如下键:
    • name: Cookie 的名称。
    • value: Cookie 的值。
    • domain: Cookie 所属的域。
    • path: Cookie 的有效路径。
    • expiry: Cookie 的过期时间(以时间戳形式返回)。
    • secure: 布尔值,指示是否仅通过 HTTPS 传输。

使用场景:

  1. 查看当前网页的 Cookie
  2. 在会话间共享 Cookie
  3. 调试网站登录状态
  4. 模拟登录后爬取需要权限的页面

示例 1:获取所有 Cookies

from selenium import webdriver# 启动 WebDriver
driver = webdriver.Chrome()# 打开一个网页
driver.get("https://www.baidu.com")# 获取所有 Cookies
cookies = driver.get_cookies()# 打印 Cookies
for cookie in cookies:print(cookie)# 关闭浏览器
driver.quit()

示例 2:结合 add_cookie 使用
使用一个 Cookie 模拟登录后访问页面:

from selenium import webdriver# 启动 WebDriver
driver = webdriver.Chrome()# 打开登录页面
driver.get("https://www.baidu.com")# 手动登录后,获取登录后的 Cookies
login_cookies = driver.get_cookies()
print("登录后的 Cookies:", login_cookies)# 关闭并重新启动浏览器
driver.quit()# 新会话下加载 Cookies
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")  # 必须先加载网站一次
for cookie in login_cookies:driver.add_cookie(cookie)# 刷新页面,验证是否已登录
driver.refresh()# 打印当前页面标题
print("当前页面标题:", driver.title)# 关闭浏览器
driver.quit()

示例 3:获取特定 Cookie
可以通过遍历 Cookies 的列表来获取特定的 Cookie:

from selenium import webdriver# 启动 WebDriver
driver = webdriver.Chrome()# 打开网页
driver.get("https://www.baidu.com")# 获取所有 Cookies
cookies = driver.get_cookies()# 查找特定 Cookie(假设名称为 "session_id")
session_cookie = next((cookie for cookie in cookies if cookie["name"] == "session_id"), None)
if session_cookie:print("找到特定 Cookie:", session_cookie)
else:print("特定 Cookie 不存在")# 关闭浏览器
driver.quit()

注意事项:

  1. 必须加载过页面才能获取 Cookiesget_cookies 方法只能获取当前浏览器会话的 Cookies,调用前需加载相关页面。
  2. HTTPS 限制:如果 Cookie 的 secure 属性为 True,只能通过 HTTPS 请求获取。
  3. 跨域问题:只能获取当前域名下的 Cookies,不能跨域获取。
  4. 模拟登录:使用 Cookie 模拟登录时,需要确保所有必要的 Cookie 都已正确设置。

总结:

  • Selenium 是用于自动化浏览器操作的强大工具,支持复杂的 Web 操作。
  • get_cookies 方法 提供了一种便捷方式来查看和操作浏览器的 Cookies,可用于模拟登录、会话管理和调试等场景。

webdriver.get_cookie(name)

根据名称获取特定的 Cookie。

cookie = driver.get_cookie("session_id")
print(cookie)

add_cookie()

在 Selenium 中,webdriver.add_cookie 是用于向当前会话中添加一个新的 Cookie 的方法。通过此方法,可以模拟用户登录状态、管理会话信息等操作。

webdriver.add_cookie(cookie_dict)

参数说明:

  • cookie_dict:
    • 一个字典,表示需要添加的 Cookie。
    • 常用键:
      • name (必须): Cookie 的名称。
      • value (必须): Cookie 的值。
      • path (可选): Cookie 的路径,默认是 /
      • domain (可选): Cookie 的作用域,如果不指定,默认为当前页面的域。
      • secure (可选): 布尔值,指示是否只能通过 HTTPS 传输,默认为 False
      • expiry (可选): Cookie 的过期时间(Unix 时间戳,秒为单位)。

使用场景:

  1. 模拟登录状态
    使用已知的 Cookie 信息登录某个网页,而无需通过前端登录流程。
  2. 跨会话共享状态
    在不同的浏览器会话中共享相同的登录信息。
  3. 测试 Cookie 的设置和有效性
    手动设置测试环境中的 Cookie。

示例代码:

示例 1:添加一个简单的 Cookie

from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开一个网页
driver.get("https://www.example.com")# 添加一个 Cookie
cookie = {"name": "test_cookie", "value": "test_value"}
driver.add_cookie(cookie)# 验证 Cookie 是否添加成功
cookies = driver.get_cookies()
print("所有 Cookies:", cookies)# 关闭浏览器
driver.quit()

示例 2:添加多个 Cookie

from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开一个网页
driver.get("https://www.example.com")# 添加多个 Cookies
cookies = [{"name": "user_id", "value": "12345"},{"name": "session_token", "value": "abcdef", "path": "/", "secure": True}
]
for cookie in cookies:driver.add_cookie(cookie)# 查看当前的 Cookies
print(driver.get_cookies())# 关闭浏览器
driver.quit()

示例 3:使用 Cookie 模拟登录

from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开目标网站(必须先加载一次页面)
driver.get("https://www.example.com")# 添加登录所需的 Cookie
login_cookie = {"name": "session_id","value": "example_session_token","domain": "www.example.com","path": "/","secure": True
}
driver.add_cookie(login_cookie)# 刷新页面验证登录状态
driver.refresh()# 打印当前页面标题
print("当前页面标题:", driver.title)# 关闭浏览器
driver.quit()

注意事项:

  1. 必须先加载页面

    • add_cookie 方法只能在加载过页面后调用。如果未加载页面,会抛出 InvalidCookieDomainException 异常。
  2. 路径和域名匹配

    • 如果指定了 pathdomain,它们必须与当前页面匹配,否则 Cookie 可能无法正确设置。
  3. 过期时间的格式

    • expiry 的值是一个 Unix 时间戳(从 1970 年 1 月 1 日起的秒数),如果不指定,则默认 Cookie 是会话 Cookie。
  4. HTTPS 限制

    • 如果 secure 设置为 True,则只能通过 HTTPS 访问 Cookie。
  5. 跨域问题

    • Selenium 不允许直接跨域设置 Cookie。例如,你无法在 example.com 的会话中添加属于 otherdomain.com 的 Cookie。

常见问题及解决方法:

  1. 问题:InvalidCookieDomainException

    • 原因:试图为未加载的域或与当前页面域名不匹配的域添加 Cookie。
    • 解决方法:确保在调用 add_cookie 方法之前已经访问了目标页面。
  2. 问题:添加的 Cookie 无效

    • 原因:Cookie 的 pathdomainsecure 设置与实际需求不符。
    • 解决方法:仔细检查 Cookie 的参数设置,确保与实际的页面匹配。

总结:

  • webdriver.add_cookie 是 Selenium 提供的一个重要方法,用于向浏览器会话中添加 Cookie。
  • 它在模拟登录、共享会话状态和测试环境中 Cookie 的有效性等场景中非常有用。
  • 使用时需要注意当前页面是否加载以及域名和路径的匹配性。

webdriver.delete_cookie(name)

删除指定名称的 Cookie。

driver.delete_cookie("session_id")

webdriver.delete_all_cookies()

删除当前会话中的所有 Cookies。

driver.delete_all_cookies()

webdriver.refresh()

在 Selenium 中,webdriver.refresh() 是用于刷新当前页面的方法。它模拟了浏览器的刷新按钮或键盘快捷键 (如 F5) 的操作。


功能:

  • 重新加载当前页面
    • 刷新页面会让浏览器重新发起对当前 URL 的请求。
  • 更新页面内容
    • 对于动态网页或可能发生更改的内容,刷新可以更新页面显示。
  • 重试加载失败的页面
    • 如果当前页面加载失败,刷新可能会重新加载成功。

基本用法

from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开一个网页
driver.get("https://www.example.com")# 刷新页面
driver.refresh()# 打印当前页面标题
print("当前页面标题:", driver.title)# 关闭浏览器
driver.quit()

常见场景:

  1. 页面内容刷新
    对于实时更新的数据页面,通过 refresh 刷新页面获取最新数据。
from selenium import webdriver
import timedriver = webdriver.Chrome()# 打开一个动态网页
driver.get("https://www.example.com")# 等待 5 秒后刷新页面
time.sleep(5)
driver.refresh()driver.quit()

  1. 配合显式等待
    刷新页面后,等待某个动态加载的元素出现。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()# 打开网页
driver.get("https://www.example.com")# 刷新页面
driver.refresh()# 等待某个元素加载完成
try:element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "dynamic-element-id")))print("动态内容已加载")
finally:driver.quit()

注意事项:

  1. 页面状态丢失

    • 刷新页面后,未提交的表单数据、未保存的操作可能会丢失。
  2. 重载触发操作

    • 如果页面中存在自动触发的脚本或请求,刷新可能会导致重复提交或操作。
  3. 动态内容加载

    • 刷新不会保证动态加载的内容出现在页面中,可能需要配合等待机制(如 WebDriverWait)。
  4. 效率问题

    • 刷新会重新加载整个页面,可能耗费较多时间。

常见问题与解决方法:

  1. 页面刷新后找不到元素
    问题:刷新页面后,之前定位的元素可能会变得无效,因为页面 DOM 可能发生变化。

    解决方法:在刷新页面后重新定位元素。
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()driver.get("https://www.example.com")
driver.refresh()# 刷新后重新定位元素
element = driver.find_element(By.ID, "element-id")
print("找到元素:", element)driver.quit()
  1. 页面卡住或刷新超时
    问题:页面刷新过程中卡住或加载时间过长。

    解决方法:设置页面加载超时时间。
from selenium import webdriver
from selenium.common.exceptions import TimeoutExceptiondriver = webdriver.Chrome()# 设置页面加载超时时间
driver.set_page_load_timeout(10)try:driver.get("https://www.example.com")driver.refresh()
except TimeoutException:print("页面刷新超时!")driver.quit()

总结:

  • webdriver.refresh() 是 Selenium 中用于刷新当前页面的简单有效方法。
  • 它适合更新动态内容、解决加载失败问题,但需要注意刷新可能会导致页面状态丢失。
  • 在需要刷新后操作 DOM 时,建议重新定位元素并结合等待机制以确保操作的稳定性。

webdriver.back()

导航到浏览器的上一页。

webdriver.forward()

导航到浏览器的下一页。


http://www.mrgr.cn/news/78121.html

相关文章:

  • Facebook 隐私变革之路:回顾与展望
  • 23. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--预算
  • 一个个顺序挨着来 - 责任链模式(Chain of Responsibility Pattern)
  • Java后端常用的4种请求方式(通俗易懂)
  • 跨年烟花C++代码
  • 力扣经典题目之219. 存在重复元素 II
  • 高标准农田智慧农业系统建设方案
  • React-useEffect的使用
  • 免费实用在线AI工具集合 - 加菲工具
  • 加菲工具 - 好用免费的在线工具集合
  • 【Python】分割秘籍!掌握split()方法,让你的字符串处理轻松无敌!
  • 代码管理之Gitlab
  • 【深度学习】【RKNN】【C++】模型转化、环境搭建以及模型部署的详细教程
  • docker compose 使用记录
  • ThingsBoard规则链节点:Azure IoT Hub 节点详解
  • C51相关实验
  • docker 安装arm架构mysql8
  • Leetcode(双指针习题思路总结,持续更新。。。)
  • solr 远程命令执行 (CVE-2019-17558)
  • 用 Python 从零开始创建神经网络(十):优化器(Optimizers)(持续更新中...)
  • 丹摩征文活动|实现Llama3.1大模型的本地部署
  • WebGIS地图框架有哪些?
  • 二叉树oj题解析
  • 【快捷入门笔记】mySQL基本操作大全-运算符和句子
  • 系统设计时应时刻考虑设计模式基础原则
  • 架构-微服务-环境搭建