当前位置: 首页 > ai >正文

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.alertprint(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) # 获取当前URLprint(driver.page_source) # 获取页面源码(用于调试)

    4. 等待机制(关键!)

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

    • 隐式等待:全局设置,等待所有元素加载(不推荐单独使用)
    
    driver.implicitly_wait(10) # 等待10秒,超时则报错
    • 显式等待:针对特定元素设置等待条件(推荐)
    
    from selenium.webdriver.support.ui import WebDriverWaitfrom 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切换到iframedriver.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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport 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)

    http://www.xdnf.cn/news/15662.html

    相关文章:

  • STM32之L298N电机驱动模块
  • 【iOS】MRC与ARC
  • Fish Speech:开源多语言语音合成的革命性突破
  • 伺服电机与步进电机要点详解
  • 专题:2025智能体研究报告|附70份报告PDF、原数据表汇总下载
  • 质变科技亮相可信数据库发展大会,参编《数据库发展研究报告2025》
  • Linux学习之认识Linux的基本指令
  • 前端性能优化“核武器”:新一代图片格式(AVIF/WebP)与自动化优化流程实战
  • 多模态大模型重构人机交互,全感官时代已来
  • 微服务项目总结
  • 短视频矩阵系统:选择与开发的全方位指南
  • Python网络爬虫实现selenium对百度识图二次开发以及批量保存Excel
  • Java学习------使用Jemter测试若依项目自定义的功能
  • Unity 常见数据结构分析与实战展示 C#
  • APIs案例及知识点串讲(下)
  • CES Asia 2025备受瞩目,跨国企业锁定亚洲战略首发契机
  • 基于Ubuntu22.04源码安装配置RabbitVCS过程记录
  • ARM64高速缓存,内存属性及MAIR配置
  • 基于华为openEuler系统安装DailyNotes个人笔记管理工具
  • Java全栈面试实录:从Spring Boot到AI大模型的深度解析
  • Glary Utilities (PC维护百宝箱) v6.24.0.28 便携版
  • 云原生 DevOps 实战之Jenkins+Gitee+Harbor+Kubernetes 构建自动化部署体系
  • 密码学基础概念详解:从古典加密到现代密码体系
  • 外网访问基于 Git 的开源文件管理系统 Gogs
  • Anime.js 超级炫酷的网页动画库之SVG路径动画
  • 信息检索革命:Perplexica+cpolar打造你的专属智能搜索中枢
  • GI6E 加密GRID電碼通信SHELLCODE載入
  • 论文review SfM MVS VGGT: Visual Geometry Grounded Transformer
  • 需要保存至服务器的:常见编辑、发布文章页面基础技巧
  • 配置本地git到gitlab并推送