> 技术文档 > selenium库工作原理

selenium库工作原理


详细介绍 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 Optionschrome_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\") # 进一步隐藏自动化标志# 传递给 WebDriverdriver = 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 WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Bydriver.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\")# 通过 XPathelement = 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 timetime.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 的工作原理! 🚀