Selenium 详细教程

Selenium 是一个强大的自动化测试工具,广泛用于 Web 自动化测试和爬虫开发。本教程将详细介绍 Selenium 的使用方法。

一、Selenium 基础

1. 安装与环境配置

安装 Selenium:

pip install selenium

下载浏览器驱动:

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)

十一、最佳实践

  1. 使用显式等待:避免使用固定的time.sleep()
  2. 合理使用定位器:优先使用ID、NAME等简单定位器
  3. 异常处理:添加try-except块处理可能出现的异常
  4. 资源清理:确保在结束时调用driver.quit()
  5. 页面对象模式:对于复杂页面,使用页面对象模式提高代码可维护性

    # 页面对象模式示例
    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 自动化脚本或爬虫程序。









results matching ""

    No results matching ""