Selenium 详细教程
Selenium 是一个强大的自动化测试工具,广泛用于 Web 自动化测试和爬虫开发。本教程将详细介绍 Selenium 的使用方法。
一、Selenium 基础
1. 安装与环境配置
安装 Selenium:
pip install selenium
下载浏览器驱动:
- ChromeDriver
- GeckoDriver (Firefox)
- EdgeDriver 将驱动文件放在系统 PATH 路径或项目目录中。
2. 基本使用
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# 启动浏览器
driver = webdriver.Chrome() # 或 Firefox(), Edge()
# 打开网页
driver.get("https://www.google.com")
# 查找元素并输入
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Python Selenium")
search_box.send_keys(Keys.RETURN)
# 等待页面加载
time.sleep(3)
# 获取页面标题
print(driver.title)
# 关闭浏览器
driver.quit()
二、元素定位方法
Selenium 提供了多种元素定位方式:
# 通过ID
element = driver.find_element(By.ID, "element-id")
# 通过名称
element = driver.find_element(By.NAME, "element-name")
# 通过类名
element = driver.find_element(By.CLASS_NAME, "element-class")
# 通过标签名
element = driver.find_element(By.TAG_NAME, "div")
# 通过链接文本
element = driver.find_element(By.LINK_TEXT, "Click Here")
# 通过部分链接文本
element = driver.find_element(By.PARTIAL_LINK_TEXT, "Click")
# 通过CSS选择器
element = driver.find_element(By.CSS_SELECTOR, "div.class-name")
# 通过XPath
element = driver.find_element(By.XPATH, "//div[@class='class-name']")
查找多个元素
elements = driver.find_elements(By.CLASS_NAME, "item")
for element in elements:
print(element.text)
三、元素操作
1. 常用操作
# 点击元素
element.click()
# 输入文本
element.send_keys("text")
# 清除输入
element.clear()
# 获取文本
text = element.text
# 获取属性值
value = element.get_attribute("attribute-name")
# 检查元素是否可见
is_visible = element.is_displayed()
# 检查元素是否启用
is_enabled = element.is_enabled()
# 检查元素是否被选中
is_selected = element.is_selected()
2. 特殊键操作
from selenium.webdriver.common.keys import Keys
element.send_keys(Keys.RETURN) # 回车
element.send_keys(Keys.TAB) # 制表符
element.send_keys(Keys.ESCAPE) # ESC键
element.send_keys(Keys.CONTROL, 'a') # Ctrl+A
四、等待机制
1. 隐式等待
driver.implicitly_wait(10) # 等待最多10秒
2. 显式等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待元素出现
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "element-id"))
)
# 等待元素可点击
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "element-id"))
)
# 其他常用条件
EC.title_is("Page Title") # 标题等于
EC.title_contains("Partial") # 标题包含
EC.visibility_of_element_located((By.ID, "element-id")) # 元素可见
EC.text_to_be_present_in_element((By.ID, "element-id"), "text") # 元素包含文本
五、浏览器操作
1. 窗口和标签页
# 获取当前窗口句柄
current_window = driver.current_window_handle
# 获取所有窗口句柄
all_windows = driver.window_handles
# 切换到新窗口
for window in all_windows:
if window != current_window:
driver.switch_to.window(window)
# 打开新标签页
driver.execute_script("window.open('');")
# 关闭当前窗口
driver.close()
# 最大化窗口
driver.maximize_window()
# 设置窗口大小
driver.set_window_size(1024, 768)
2. 导航
# 前进
driver.forward()
# 后退
driver.back()
# 刷新
driver.refresh()
3. Cookies
# 获取所有cookies
cookies = driver.get_cookies()
# 获取特定cookie
cookie = driver.get_cookie("cookie_name")
# 添加cookie
driver.add_cookie({"name": "cookie_name", "value": "cookie_value"})
# 删除cookie
driver.delete_cookie("cookie_name")
# 删除所有cookies
driver.delete_all_cookies()
六、高级功能
1. JavaScript 执行
# 执行JavaScript
driver.execute_script("alert('Hello Selenium!');")
# 滚动到元素
element = driver.find_element(By.ID, "element-id")
driver.execute_script("arguments[0].scrollIntoView();", element)
# 获取页面标题
title = driver.execute_script("return document.title;")
2. 文件上传
file_input = driver.find_element(By.XPATH, "//input[@type='file']")
file_input.send_keys("/path/to/file.txt")
3. 截图
# 截取屏幕
driver.save_screenshot("screenshot.png")
# 截取元素
element = driver.find_element(By.ID, "element-id")
element.screenshot("element.png")
七、处理弹窗和警告
# 获取警告框
alert = driver.switch_to.alert
# 获取警告文本
print(alert.text)
# 接受警告
alert.accept()
# 拒绝警告
alert.dismiss()
# 在警告框中输入
alert.send_keys("text")
八、iframe 处理
# 通过ID或名称切换
driver.switch_to.frame("frame-id")
# 通过索引切换
driver.switch_to.frame(0)
# 通过元素切换
frame = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(frame)
# 返回主文档
driver.switch_to.default_content()
# 返回父frame
driver.switch_to.parent_frame()
九、实战案例
案例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 EC
driver = webdriver.Chrome()
driver.get("https://example.com/login")
try:
# 等待元素加载
username = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "username"))
)
password = driver.find_element(By.ID, "password")
login_button = driver.find_element(By.ID, "login-btn")
# 输入凭据并登录
username.send_keys("your_username")
password.send_keys("your_password")
login_button.click()
# 验证登录成功
WebDriverWait(driver, 10).until(
EC.title_contains("Dashboard")
)
print("登录成功!")
finally:
driver.quit()
案例2:爬取动态加载内容
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
import time
driver = webdriver.Chrome()
driver.get("https://example.com/infinite-scroll")
try:
# 获取初始高度
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# 滚动到底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 等待加载
time.sleep(2)
# 计算新高度
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# 提取所有项目
items = driver.find_elements(By.CLASS_NAME, "item")
for item in items:
print(item.text)
finally:
driver.quit()
十、常见问题解决
1. 元素定位失败
- 使用显式等待
- 尝试不同的定位方式
- 检查元素是否在iframe中
- 检查元素是否在Shadow DOM中
2. 处理动态ID
# 使用部分属性匹配
element = driver.find_element(By.XPATH, "//div[contains(@id, 'partial-id')]")
3. 处理Shadow DOM
shadow_host = driver.find_element(By.CSS_SELECTOR, "shadow-host")
shadow_root = driver.execute_script("return arguments[0].shadowRoot", shadow_host)
shadow_element = shadow_root.find_element(By.CSS_SELECTOR, "shadow-element")
4. 无头模式
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--headless") # 启用无头模式
options.add_argument("--disable-gpu") # 禁用GPU加速
driver = webdriver.Chrome(options=options)
十一、最佳实践
- 使用显式等待:避免使用固定的
time.sleep()
- 合理使用定位器:优先使用ID、NAME等简单定位器
- 异常处理:添加try-except块处理可能出现的异常
- 资源清理:确保在结束时调用
driver.quit()
页面对象模式:对于复杂页面,使用页面对象模式提高代码可维护性
# 页面对象模式示例 class LoginPage: def __init__(self, driver): self.driver = driver self.username = (By.ID, "username") self.password = (By.ID, "password") self.login_button = (By.ID, "login-btn") def login(self, username, password): self.driver.find_element(*self.username).send_keys(username) self.driver.find_element(*self.password).send_keys(password) self.driver.find_element(*self.login_button).click()
通过本教程,你应该已经掌握了 Selenium 的核心功能和使用方法。实际应用中,可以根据具体需求组合使用这些技术,构建强大的 Web 自动化脚本或爬虫程序。