selenium库工作原理

发布于:2025-03-07 ⋅ 阅读:(21) ⋅ 点赞:(0)

详细介绍 selenium 及其相关模块

你的代码使用了 selenium 进行 CSDN 文章的自动发布。为了更深入理解,下面将详细介绍 selenium 及其相关模块的作用。


1. selenium

selenium 是一个用于 Web 自动化测试的 Python 库,支持与各种浏览器(如 Chrome、Firefox)交互,主要用于自动化测试、爬虫等任务。

安装 Selenium

如果你的环境尚未安装 selenium,可以使用以下命令进行安装:

pip install selenium

Selenium 主要功能

  • 浏览器驱动 (webdriver): 允许 Python 代码控制浏览器(如 Chrome)。
  • 元素选择 (By): 提供不同的方式定位网页元素,如 idclass namexpath 等。
  • 等待机制 (WebDriverWait): 用于处理网页动态加载,等待元素出现。
  • 模拟用户交互 (ActionChains): 包括点击、输入文本、拖拽等操作。
  • 执行 JavaScript (execute_script): 运行 JavaScript 代码,如滚动页面。

2. webdriver 模块

selenium.webdriverselenium 的核心模块,提供控制浏览器的能力。

示例

from selenium import webdriver

# 创建 Chrome 浏览器实例
driver = webdriver.Chrome()

# 打开 CSDN 首页
driver.get("https://www.csdn.net/")
  • webdriver.Chrome():启动 Chrome 浏览器。
  • driver.get(url):访问指定的网址。

3. Options 模块

用于配置浏览器选项,例如禁用弹窗、无头模式等。

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--disable-save-password-bubble")  # 禁用密码保存提示
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])  # 规避浏览器检测
chrome_options.add_argument("--disable-blink-features=AutomationControlled")  # 进一步隐藏自动化标志

# 传递给 WebDriver
driver = webdriver.Chrome(options=chrome_options)
  • add_argument("--disable-save-password-bubble"):防止浏览器弹出“是否保存密码”窗口。
  • add_experimental_option("excludeSwitches", ["enable-automation"]):防止 Selenium 被检测到。
  • add_argument("--disable-blink-features=AutomationControlled"):绕过 Selenium 受控标记。

4. WebDriverWait 模块

用于显式等待网页元素加载,防止 NoSuchElementException

示例

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver.get("https://www.csdn.net/")

# 等待某个元素可见,最多等待 20 秒
wait = WebDriverWait(driver, 20)
element = wait.until(EC.presence_of_element_located((By.ID, "element_id")))

print("元素已找到!")
  • WebDriverWait(driver, 20):设置最多等待 20 秒。
  • until(EC.presence_of_element_located((By.ID, "element_id"))):等待某个 ID"element_id" 的元素出现。

5. By 模块

用于选择网页元素,提供多种查找方式。

from selenium.webdriver.common.by import By

# 通过 ID 选择元素
element = driver.find_element(By.ID, "element_id")

# 通过 class 选择元素
element = driver.find_element(By.CLASS_NAME, "class_name")

# 通过 CSS 选择器
element = driver.find_element(By.CSS_SELECTOR, ".my-class")

# 通过 XPath
element = driver.find_element(By.XPATH, "//div[@class='example']")
  • By.ID:通过 id 选择元素。
  • By.CLASS_NAME:通过 class 选择元素。
  • By.CSS_SELECTOR:使用 CSS 选择器定位元素。
  • By.XPATH:使用 XPath 路径查找元素。

6. expected_conditions (EC) 模块

EC 模块提供了多种等待条件,配合 WebDriverWait 使用。

常见条件

from selenium.webdriver.support import expected_conditions as EC

# 等待元素出现
EC.presence_of_element_located((By.ID, "element_id"))

# 等待元素可见
EC.visibility_of_element_located((By.CLASS_NAME, "class_name"))

# 等待元素可点击
EC.element_to_be_clickable((By.CSS_SELECTOR, ".clickable-button"))

7. execute_script 执行 JavaScript

Selenium 允许执行 JavaScript 代码,比如滚动页面、点击按钮等。

# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# 让元素滚动到可见区域
element = driver.find_element(By.CLASS_NAME, "some-class")
driver.execute_script("arguments[0].scrollIntoView(true);", element)

# 直接执行 JavaScript 触发点击(绕过遮挡)
driver.execute_script("arguments[0].click();", element)

8. switch_to.frame() 切换到 iframe

CSDN 文章编辑器在 iframe 内,因此需要先切换到 iframe 才能操作。

# 找到 iframe 并切换
iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)

# 执行操作
driver.find_element(By.TAG_NAME, "body").send_keys("这是正文内容")

# 切回主页面
driver.switch_to.default_content()
  • switch_to.frame(iframe):切换到 iframe 内。
  • switch_to.default_content():返回主页面。

9. find_elements() 遍历多个元素

在查找 iframe 或者按钮时,我们可能需要遍历多个元素。

iframes = driver.find_elements(By.TAG_NAME, "iframe")

for index, iframe in enumerate(iframes):
    driver.switch_to.frame(iframe)
    try:
        if driver.find_element(By.TAG_NAME, "body"):
            print(f"找到目标 iframe,索引: {index}")
            break
    except:
        driver.switch_to.default_content()
  • find_elements() 返回多个匹配的元素列表。
  • switch_to.frame(iframe) 依次尝试每个 iframe 以找到目标 iframe

10. time.sleep() 设置延迟

在一些操作后,为了防止网页未完全加载,可能需要手动 sleep 一段时间。

import time

time.sleep(3)  # 等待 3 秒
  • WebDriverWait 更推荐,但 time.sleep() 适用于临时调试。

总结

模块 作用 示例
webdriver 启动浏览器 webdriver.Chrome()
Options 配置浏览器选项 chrome_options.add_argument("--disable-save-password-bubble")
WebDriverWait 显式等待 wait.until(EC.presence_of_element_located((By.ID, "xxx")))
By 定位元素 By.XPATH, By.CLASS_NAME
expected_conditions (EC) 等待条件 EC.element_to_be_clickable((By.CSS_SELECTOR, ".button"))
execute_script 运行 JavaScript driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
switch_to.frame() 切换 iframe driver.switch_to.frame(iframe)
find_elements() 获取多个元素 elements = driver.find_elements(By.TAG_NAME, "iframe")

希望这些详细的解释能帮助你更好地理解 selenium 的工作原理! 🚀