Selenium 攻略:从元素操作到 WebDriver 实战

在自动化测试、网页数据爬取、批量操作网页等场景中,Selenium 无疑是最受欢迎的工具之一。作为一款强大的 Web 自动化工具,它能模拟人类操作浏览器的行为,实现点击、输入、跳转等一系列动作。本文将从基础到进阶,全面解析 Selenium 的核心用法,帮你快速掌握这一工具的精髓。

一、元素定位:找到网页的 "积木"

操作网页的前提是准确定位元素。Selenium 提供了 8 种定位方式,覆盖绝大多数场景:

|-------------------|------------------------------------|-----------------------------|
| 定位方式 | 方法 | 适用场景 |
| id | find_element(By.ID, value) | 元素有唯一 id 属性(推荐优先使用) |
| name | ++find_element++(By.NAME, value) | 元素有 name 属性,且值较唯一 |
| class name | find_element(By.CLASS_NAME) | 元素 class 属性(注意多 class 需取单个) |
| tag name | find_element(By.TAG_NAME) | 通过标签名定位(如<input>),适合批量查找 |
| link text | find_element(By.LINK_TEXT) | 精准匹配链接文本(如<a>标签完整文字) |
| partial link text | find_element(By.PARTIAL_LINK_TEXT) | 模糊匹配链接文本 |
| xpath | find_element(By.XPATH, value) | 复杂结构或无明显属性时(万能定位) |
| css selector | find_element(By.CSS_SELECTOR) | 简洁高效,适合有 CSS 基础的用户 |

示例代码

复制代码
from selenium.webdriver.common.by import By

# 通过id定位用户名输入框

username = driver.find_element(By.ID, "username")

# 通过xpath定位密码输入框

password = driver.find_element(By.XPATH, '//input[@type="password"]')

# 通过css selector定位登录按钮

login_btn = driver.find_element(By.CSS_SELECTOR, ".login-form .submit-btn")

二、元素操作:让网页 "动" 起来

定位元素后,即可通过 Selenium 提供的方法进行交互,常用操作如下:

1. 基础操作

  • 点击:element.click()(按钮、链接等)
  • 输入文本:element.send_keys("内容")(输入框)
  • 清除内容:element.clear()(清空输入框)
  • 获取文本:element.text(获取元素可见文本)
  • 获取属性:element.get_attribute("href")(获取链接 href 属性)

2. 特殊元素处理

  • 下拉框:使用Select类(需导入from selenium.webdriver.support.ui import Select)

    select = Select(driver.find_element(By.ID, "city"))

    select.select_by_visible_text("北京") # 按文本选择

    select.select_by_value("shanghai") # 按value属性选择

    复选框 / 单选按钮:通过click()切换状态,结合is_selected

复制代码
()判断是否选中
复制代码
checkbox = driver.find_element(By.NAME, "agree")

if not checkbox.is_selected():

checkbox.click() # 勾选未选中的复选框
  • 文件上传:通过send_keys传入文件路径(无需点击上传按钮)

    upload_btn = driver.find_element(By.ID, "file-upload")

    upload_btn.send_keys("D:/data.csv") # 传入本地文件路径

  • 弹窗处理:通过driver.switch_to.alert切换到弹窗

    alert = driver.switch_to.alert

    print(alert.text) # 获取弹窗文本

    alert.accept() # 确认弹窗

    alert.dismiss() # 取消弹窗

三、WebDriver 核心方法:掌控浏览器

WebDriver 提供了大量控制浏览器的方法,覆盖导航、窗口、信息获取等场景:

1. 浏览器窗口控制

复制代码
driver.maximize_window() # 最大化窗口

driver.set_window_size(1200, 800) # 设置窗口大小

driver.get_window_size() # 获取窗口大小

2. 导航操作

复制代码
driver.get("https://www.baidu.com") # 打开网页

driver.back() # 后退

driver.forward() # 前进

driver.refresh() # 刷新页面

3. 页面信息获取

复制代码
print(driver.title) # 获取页面标题

print(driver.current_url) # 获取当前URL

print(driver.page_source) # 获取页面源码(用于调试)

4. 等待机制(关键!)

由于网页加载存在延迟,直接操作元素可能导致 "元素未找到" 错误,需通过等待机制解决:

  • 隐式等待:全局设置,等待所有元素加载(不推荐单独使用)

    driver.implicitly_wait(10) # 等待10秒,超时则报错

  • 显式等待:针对特定元素设置等待条件(推荐)

    from selenium.webdriver.support.ui import WebDriverWait

    from selenium.webdriver.support import expected_conditions as EC

    等待10秒,直到id为"submit"的元素可点击

    submit_btn = WebDriverWait(driver, 10).until(

    EC.element_to_be_clickable((By.ID, "submit"))

    )

    submit_btn.click()

  • 强制等待:time.sleep(2)(仅调试用,不建议实际场景使用)

四、进阶技巧:应对复杂场景

1. 多窗口 /iframe 切换

  • 多窗口切换:通过窗口句柄(handle)切换

    获取所有窗口句柄

    handles = driver.window_handles

    切换到新窗口

    driver.switch_to.window(handles[-1])

  • iframe 切换:网页中嵌套 iframe 时,需先切换到 iframe 才能操作内部元素

    通过id切换到iframe

    driver.switch_to.frame("iframe-id")

    操作iframe内元素...

    切回主文档

    driver.switch_to.default_content()

2. 执行 JavaScript

对于 Selenium 难以直接操作的元素(如滚动、隐藏元素),可通过执行 JS 实现:

复制代码
# 滚动到页面底部

driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")

# 点击隐藏元素

hidden_btn = driver.find_element(By.ID, "hidden-btn")

driver.execute_script("arguments[0].click();", hidden_btn)

3. 截图与调试

复制代码
# 截取当前页面并保存

driver.get_screenshot_as_file("error.png")

五、实战案例:自动登录示例

结合上述知识点,实现一个自动登录某网站的流程:

复制代码
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.maximize_window()

try:

# 打开登录页

driver.get("https://example.com/login")

# 显式等待并输入用户名

username = WebDriverWait(driver, 10).until(

EC.presence_of_element_located((By.ID, "username"))

)

username.send_keys("test_user")

# 输入密码

password = driver.find_element(By.ID, "password")

password.send_keys("test_pass123")

# 点击登录按钮

login_btn = driver.find_element(By.CSS_SELECTOR, ".login-btn")

login_btn.click()

# 验证登录成功(等待欢迎信息出现)

welcome_msg = WebDriverWait(driver, 15).until(

EC.text_to_be_present_in_element((By.CLASS_NAME, "welcome"), "欢迎回来")

)

print("登录成功!")

time.sleep(2) # 停留2秒查看结果

finally:

# 关闭浏览器

driver.quit()

六、注意事项

  1. 定位策略选择:优先使用 id/name(效率最高),其次 css selector,复杂场景用 xpath。
  1. 反爬与合规:自动化操作可能触发网站反爬机制,爬取数据需遵守网站 robots 协议和法律法规。
  1. 版本匹配:浏览器驱动版本必须与浏览器版本一致(如 ChromeDriver 114 对应 Chrome 114.x)。
  1. 无头模式:无需显示浏览器窗口时,可启用无头模式提高效率(以 Chrome 为例):

    options = webdriver.ChromeOptions()

    options.add_argument("--headless=new") # 启用无头模式

    driver = webdriver.Chrome(options=options)

相关推荐
Kaydeon1 小时前
【Anaconda】Conda 虚拟环境打包迁移教程
人工智能·pytorch·python·conda
love530love1 小时前
《Anaconda 精简路径治理》系列 · 番外篇Conda 虚拟环境路径结构方案全解——六种路径布局对比、优劣与治理建议
运维·人工智能·windows·python·conda
Yweir5 小时前
Elastic Search 8.x 分片和常见性能优化
java·python·elasticsearch
sztomarch5 小时前
Tshark-Tcpdump
linux·运维·网络·测试工具·tcpdump
小蜗牛狂飙记5 小时前
在github上传python项目,然后在另外一台电脑下载下来后如何保障成功运行
开发语言·python·github
倔强青铜三5 小时前
苦练Python第27天:嵌套数据结构
人工智能·python·面试
倔强青铜三6 小时前
苦练Python第26天:精通字典8大必杀技
人工智能·python·面试
creator_Li7 小时前
python学习笔记
笔记·python·学习
DeniuHe7 小时前
基于Pytorch的人脸识别程序
pytorch·python·深度学习
万粉变现经纪人7 小时前
如何解决pip安装报错ModuleNotFoundError: No module named ‘django’问题
后端·python·pycharm·django·numpy·pandas·pip