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.pswp.cn/diannao/92068.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/diannao/92068.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    【算法训练营Day14】二叉树part4

    文章目录找树左下角的值路径总和总结&#xff1a;递归函数的返回值路径总和 II总结&#xff1a;二叉树递归的思考从中序与后序遍历序列构造二叉树找树左下角的值 题目链接&#xff1a;513. 找树左下角的值 解题逻辑&#xff1a; 使用层序遍历&#xff0c;将最后一层的第一个元…

    工资系统如何计算工资

    工资系统计算工资是一个集成数据收集、规则应用、自动核算和合规审核的自动化过程&#xff0c;以下是其核心原理和步骤&#xff0c;结合技术实现与法规要求进行说明&#xff1a;⚙️ 一、工资系统的基本框架与数据准备系统初始化与规则配置企业信息设置&#xff1a;录入公司名称…

    车载通信架构 --- DoIP协议通信

    我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

    基于Event Sourcing和CQRS的微服务架构设计与实战

    基于Event Sourcing和CQRS的微服务架构设计与实战 业务场景描述 在电商系统中&#xff0c;订单的高并发写入与复杂的状态流转&#xff08;下单、支付、发货、退货等&#xff09;给传统的CRUD模型带来了挑战&#xff1a; 数据一致性难保证&#xff1a;跨服务事务处理复杂&#x…

    初级安全课第二次作业

    &#xff08;一&#xff09;xss-labs 1~8关 1、前期准备 &#xff08;1&#xff09;打开小皮面板&#xff0c;并启动Apache和MySQL&#xff08;2&#xff09;将 xss-labs放到 phpstudy_pro 的 WWW 目录下&#xff08;3&#xff09;访问连接&#xff1a;http://localhost/xss-la…

    从零搭建智能搜索代理:LangGraph + 实时搜索 + PDF导出完整项目实战

    传统的AI聊天系统往往局限于预训练数据的知识范围&#xff0c;无法获取实时信息。本文将详细阐述如何构建一个基于LangGraph的智能代理系统&#xff0c;该系统能够智能判断何时需要进行网络搜索、有效维护对话上下文&#xff0c;并具备将对话内容导出为PDF文档的功能。 本系统…

    C语言分支和循环语句——猜数字游戏

    分支语句的语法形式1. if(表达式)语句;2. if(表达式)语句1;else语句2;3. Switch(表达式){ case 1: break;case 2: break;case 3: break; default: break; }循环语句的语法形式1. while(表达式)语句 ;2. for&#xff08;表达…

    Python设计模式深度解析:原型模式(Prototype Pattern)完全指南

    Python设计模式深度解析&#xff1a;原型模式&#xff08;Prototype Pattern&#xff09;完全指南前言什么是原型模式&#xff1f;模式的核心组成实际案例&#xff1a;游泳比赛管理系统游泳者数据结构原型模式的实现深拷贝 vs 浅拷贝&#xff1a;核心概念解析浅拷贝&#xff08…

    SAP-ABAP:SAP万能长度计算:DYNAMIC_OUTPUT_LENGTH 深度解析

    &#x1f4cf; SAP ABAP 万能长度计算&#xff1a;DYNAMIC_OUTPUT_LENGTH 深度解析核心作用&#xff1a;智能计算数据对象在列表/ALV中的实际显示宽度 | 关键优势&#xff1a;多字节字符处理 | 格式感知 | 动态适配&#x1f50d; 一、核心功能与技术特性 &#x1f4ca; 数据类型…

    20250720-2-Kubernetes 调度-资源限制对Pod调度的影响(1)_笔记

    一、创建一个Pod的工作流程&#xfeff;1. k8s架构解析&#xfeff;组件交互模式: Kubernetes采用list-watch机制的控制器架构&#xff0c;实现组件间交互的解耦。各组件通过监控自己负责的资源&#xff0c;当资源发生变化时由kube-apiserver通知相关组件。类比说明: 类似小卖铺…

    mobaxteam x11传输界面避坑

    mobaxteam x11传输界面避坑 文章目录mobaxteam x11传输界面避坑1 windows系统必须下载xing2 配置1 windows系统必须下载xing 因为windows系统本身没有x服务。 2 配置 如图

    flink sql如何对hive string类型的时间戳进行排序

    在 Flink SQL 中对 Hive 表的 STRING 类型时间戳进行排序&#xff0c;需要先将字符串转换为时间类型&#xff0c;再基于时间类型排序。以下是具体方法和示例&#xff1a; 一、核心解决方案 1. 字符串转 TIMESTAMP 后排序 若 Hive 中的时间戳格式为 yyyy-MM-dd HH:mm:ss&#xf…

    Linux:线程控制

    线程概念线程&#xff08;Thread&#xff09;是进程&#xff08;Process&#xff09; 中的一个执行单元&#xff0c;是操作系统能够进行运算调度的最小单位。线程也被称为“轻量级进程”&#xff08;Lightweight Process, LWP&#xff09;。一个进程可以包含多个线程&#xff0…

    React 学习(4)

    核心API———createRoot、render方法1.createRoot 方法是创建react的根容器&#xff0c;就是react元素的插入位置&#xff0c;插入的dom会被转化成react元素&#xff0c;根容器内的内容都会被react管理&#xff0c;原有dom都会被删除。react17 根容器创建、渲染方式&#xff0…

    ASP .NET Core 8集成Swagger全攻略

    Swagger (现在称为 OpenAPI) 是一个用于描述 RESTful API 的规范&#xff0c;ASP.NET Core 内置支持通过 Swashbuckle 库生成 Swagger 文档。以下是在 ASP.NET Core 8 中实现 Swagger 的完整步骤。1、添加Swagger NuGet 包dotnet add package Swashbuckle.AspNetCore2、添加Swa…

    【iOS】源码阅读(六)——方法交换

    文章目录方法交换什么是Method-Swizzling方法交换核心API**1. 获取方法对象****2. 添加/替换方法实现****3. 交换方法实现****4. 获取方法信息****5. 修改方法实现****使用示例&#xff1a;完整的 Method-Swizzling 流程****注意事项**使用方法交换注意事项线程安全方法交换的影…

    mysql运维问题解决:MySQL主从延迟(锁阻塞与读写分离)

    小亦平台会持续给大家科普一些运维过程中常见的问题解决案例&#xff0c;运维朋友们可以在常见问题及解决方案专栏查看更多案例 问题概述 告警事件&#xff1a; 2023-07-28 03:31:39.571 首次触发主从延迟告警&#xff08;延迟1515秒&#xff09;2023-07-28 07:41:37 告警解除…

    SSH 密钥

    什么是 SSH 密钥 SSH 密钥就像是你电脑的“身份证”和“钥匙”&#xff0c; 用来安全登录另一台电脑&#xff08;服务器&#xff09;&#xff0c;而不需要每次输入密码。SSH 密钥是一种安全登录远程服务器的方式&#xff0c;由一对加密的“钥匙”组成&#xff1a;一个公钥 一个…

    st-Gcn训练跳绳识别模型一:数据标注工具和标注流程

    目录 工具展示和使用说明 工具标注后文件展示说明 json转换成单个npy文件 数据获取补充 工具展示和使用说明 文件名labelV.py集于PySide6实现&#xff1a; 通过选择视频来选择你要标注的视频&#xff0c;然后选择保存路径&#xff1a; 然后视频两个类别。当你看见视频中的人…

    springboot跨域问题 和 401

    springboot跨域问题 和 401 1.跨域import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotatio…