Selenium 教程

下面是一份完整、实用的 Selenium 教程(以 Python 为例),从零基础到进阶,适合初学者和有经验的开发者快速上手。教程基于 Selenium 4.x(最新稳定版)。


一、Selenium 是什么?

Selenium 是一个用于自动化 Web 浏览器的开源工具,支持:

  • 网页自动化测试
  • 网页抓取(爬虫)
  • 模拟用户操作(如登录、点击、填表)

支持语言:Python、Java、C#、Ruby、JavaScript 等
支持浏览器:Chrome、Firefox、Edge、Safari 等


二、环境准备

1. 安装 Python(3.8+)

python --version

2. 安装 Selenium

pip install selenium

3. 下载浏览器驱动(WebDriver)

浏览器下载地址说明
Chromehttps://chromedriver.chromium.org/版本要和 Chrome 浏览器一致
Firefoxhttps://github.com/mozilla/geckodriver/releases
Edgehttps://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

推荐:使用 webdriver-manager 自动管理驱动!

pip install webdriver-manager

三、第一个 Selenium 脚本

# hello_selenium.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# 自动下载并使用匹配的 ChromeDriver
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

try:
    driver.get("https://www.baidu.com")
    print("页面标题:", driver.title)
finally:
    driver.quit()

运行:

python.py hello_selenium.py

四、核心操作大全

1. 打开网页

driver.get("https://httpbin.org")

2. 查找元素(8 种定位方式)

方法示例说明
IDdriver.find_element("id", "kw")最快
Namefind_element("name", "wd")
Class Namefind_element("class name", "s_ipt")
Tag Namefind_element("tag name", "input")
Link Textfind_element("link text", "新闻")完整链接文本
Partial Link Textfind_element("partial link text", "新")部分匹配
XPathfind_element("xpath", "//input[@id='kw']")最强大
CSS Selectorfind_element("css selector", "#kw")推荐

推荐使用 CSS 或 XPath

from selenium.webdriver.common.by import By

element = driver.find_element(By.ID, "kw")
element = driver.find_element(By.XPATH, "//input[@name='wd']")
element = driver.find_element(By.CSS_SELECTOR, "input.s_ipt")

3. 输入文本 & 点击

from selenium.webdriver.common.by import By

# 百度搜索示例
driver.get("https://www.baidu.com")

# 输入搜索词
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("Selenium 教程")

# 点击搜索按钮
search_btn = driver.find_element(By.ID, "su")
search_btn.click()

# 等待结果(后面讲)
import time
time.sleep(3)

4. 获取文本 / 属性

title = driver.title
url = driver.current_url
text = element.text
value = element.get_attribute("value")

五、等待机制(重点!避免元素未加载)

1. 固定等待(不推荐)

time.sleep(2)

2. 隐式等待(全局)

driver.implicitly_wait(10)  # 最多等10秒

3. 显式等待(推荐!精准)

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)

element = wait.until(
    EC.presence_of_element_located((By.ID, "result"))
)
# 或等待可点击
btn = wait.until(EC.element_to_be_clickable((By.ID, "su")))

常用条件:

  • presence_of_element_located:元素存在 DOM
  • visibility_of_element_located:元素可见
  • element_to_be_clickable:可点击
  • title_contains("xxx")

六、处理弹窗、iframe、下拉框

1. Alert 弹窗

alert = driver.switch_to.alert
print(alert.text)
alert.accept()    # 确定
# alert.dismiss() # 取消

2. iframe 切换

driver.switch_to.frame("iframe_id")
# 操作完后切回主文档
driver.switch_to.default_content()

3. Select 下拉框

from selenium.webdriver.support.ui import Select

select = Select(driver.find_element(By.ID, "dropdown"))
select.select_by_visible_text("Option 1")
select.select_by_value("1")
select.select_by_index(0)

七、鼠标 & 键盘操作

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

actions = ActionChains(driver)

# 鼠标悬停
actions.move_to_element(element).perform()

# 双击
actions.double_click(element).perform()

# 右键
actions.context_click(element).perform()

# 拖拽
actions.drag_and_drop(source, target).perform()

# 键盘:回车、Ctrl+A
element.send_keys(Keys.ENTER)
element.send_keys(Keys.CONTROL, "a")

八、截图 & 保存页面

driver.save_screenshot("baidu.png")

# 获取页面源码
html = driver.page_source

九、无头模式(Headless)—— 服务器运行

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")  # 无头
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)

十、完整实战案例:登录网站

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 EC
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
wait = WebDriverWait(driver, 10)

try:
    driver.get("https://httpbin.org/forms/post")

    # 填写表单
    wait.until(EC.presence_of_element_located((By.NAME, "custname"))).send_keys("张三")
    driver.find_element(By.NAME, "custtel").send_keys("13800000000")
    driver.find_element(By.NAME, "custemail").send_keys("zhangsan@example.com")
    driver.find_element(By.NAME, "size").click()  # 小号
    driver.find_element(By.NAME, "topping", value="cheese").click()

    # 提交
    driver.find_element(By.CSS_SELECTOR, "input[type='submit']").click()

    print("提交成功!")
finally:
    driver.quit()

十一、高级技巧

1. 执行 JavaScript

driver.execute_script("alert('Hello Selenium!');")
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

2. 多窗口切换

handles = driver.window_handles
driver.switch_to.window(handles[1])  # 切换到新窗口

3. 处理文件上传

file_input = driver.find_element(By.ID, "upload")
file_input.send_keys("/path/to/file.txt")  # 绝对路径

十二、常见问题 & 解决方案

问题解决方案
session not created驱动版本不匹配 → 用 webdriver-manager
元素找不到使用显式等待 + 正确定位
验证码使用 Cookie 登录 / OCR / 手动跳过
被反爬加随机延迟、Headless、代理、伪装 User-Agent
chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")

十三、推荐资源

  • 官方文档:https://www.selenium.dev/documentation/
  • GitHub:https://github.com/SeleniumHQ/selenium
  • 教程视频:B站搜索 “Selenium Python 教程”
  • 工具:webdriver-manager, selenium-stealth(防检测)

十四、总结:Selenium 学习路线

  1. 掌握基本操作(打开、查找、点击、输入)
  2. 学会等待机制(显式等待)
  3. 处理复杂元素(iframe、alert、select)
  4. 学会调试(打印 title、截图、日志)
  5. 进阶:Page Object 模式、unittest/pytest 集成
  6. 实战:爬取动态网站、自动化测试

现在就动手写第一个脚本吧!

print("你已经学会 Selenium 了!🚀")

需要我生成一个 可运行的完整项目模板(含登录、搜索、翻页、保存数据)吗?回复 yes 我立刻给你!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注