Selenium 全面指南
Selenium 是一个强大的 Web 自动化工具,支持多种浏览器和语言绑定。
1. Selenium 的基本概念
- WebDriver:Selenium 提供的核心接口,用于控制浏览器操作。
- 显式等待:等待特定条件满足后再执行操作。
- 隐式等待:全局设置一个等待时间,针对所有操作生效。
- 定位器(Locators):用于定位页面元素的方法,如 ID、XPath、CSS 选择器等。
2. Selenium 的主要模块及 API
2.1 WebDriver
WebDriver 是 Selenium 的核心,用于与浏览器进行交互。
2.1.1 初始化浏览器
from selenium import webdriver# 启动 Chrome 浏览器
driver = webdriver.Chrome()# 打开指定网址
driver.get("https://www.example.com")# 最大化窗口
driver.maximize_window()# 关闭浏览器
driver.quit()
2.1.2 浏览器导航
driver.get("https://www.example.com") # 打开网址
driver.back() # 后退
driver.forward() # 前进
driver.refresh() # 刷新页面
2.2 定位元素
Selenium 提供多种方法来定位网页中的元素:
2.2.1 使用 find_element 和 find_elements
from selenium.webdriver.common.by import By# 定位单个元素
element = driver.find_element(By.ID, "element_id")# 定位多个元素
elements = driver.find_elements(By.CLASS_NAME, "class_name")
2.2.2 常用定位器
| 定位器 | 用法示例 |
|---|---|
| ID | driver.find_element(By.ID, "element_id") |
| Name | driver.find_element(By.NAME, "name") |
| Class | driver.find_element(By.CLASS_NAME, "class") |
| Tag | driver.find_element(By.TAG_NAME, "tag") |
| CSS | driver.find_element(By.CSS_SELECTOR, ".class") |
| XPath | driver.find_element(By.XPATH, "//tag[@attr='value']") |
2.3 操作页面元素
2.3.1 输入内容
element = driver.find_element(By.ID, "username")
element.send_keys("test_user")
2.3.2 点击按钮
button = driver.find_element(By.ID, "submit_button")
button.click()
2.3.3 清空输入框
input_field = driver.find_element(By.ID, "input_field")
input_field.clear()
2.3.4 获取元素属性
element = driver.find_element(By.ID, "logo")
print(element.get_attribute("src"))
2.3.5 获取元素文本
element = driver.find_element(By.ID, "welcome_message")
print(element.text)
2.4 等待
Selenium 提供显式等待和隐式等待来处理动态加载页面。
2.4.1 隐式等待
隐式等待是全局设置,等待元素加载完成。
driver.implicitly_wait(10) # 全局等待 10 秒
2.4.2 显式等待
显式等待针对特定元素或条件设置。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 等待元素可见
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "element_id"))
)
2.4.3 常用条件
| 条件 | 描述 |
|---|---|
presence_of_element_located | 元素出现在 DOM 中,但不一定可见。 |
visibility_of_element_located | 元素出现在 DOM 且可见。 |
element_to_be_clickable | 元素可点击。 |
url_changes | 页面 URL 发生变化。 |
alert_is_present | 弹窗出现。 |
2.5 页面操作
2.5.1 窗口操作
# 获取当前窗口句柄
current_window = driver.current_window_handle# 获取所有窗口句柄
all_windows = driver.window_handles# 切换到新窗口
driver.switch_to.window(all_windows[1])
2.5.2 iframe 切换
# 切换到 iframe
driver.switch_to.frame("iframe_name")# 返回主页面
driver.switch_to.default_content()
2.5.3 滚动页面
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
2.6 Cookie 和 JavaScript
2.6.1 操作 Cookie
# 获取所有 Cookies
print(driver.get_cookies())# 添加 Cookie
driver.add_cookie({"name": "test", "value": "123"})# 删除 Cookie
driver.delete_cookie("test")
2.6.2 执行 JavaScript
driver.execute_script("alert('Hello, Selenium!')")
2.7 处理弹窗
# 等待弹窗出现
alert = WebDriverWait(driver, 10).until(EC.alert_is_present())# 获取弹窗文本
print(alert.text)# 接受弹窗
alert.accept()
3. 进阶技巧
3.1 动态 XPath
动态页面的元素属性可能变化,可以使用包含或正则表达式的 XPath:
element = driver.find_element(By.XPATH, "//button[contains(@class, 'submit')]")
3.2 验证页面加载完成
WebDriverWait(driver, 10).until(lambda d: d.execute_script("return document.readyState") == "complete"
)
4. 常见问题和解决方案
-
元素未找到
- 使用显式等待。
- 检查选择器是否正确。
-
元素不可交互
- 检查是否需要滚动或切换到 iframe。
- 确保元素可见。
-
动态加载内容
- 使用
WebDriverWait处理延迟加载的内容。
- 使用
5. 总结
Selenium 提供了丰富的 API,涵盖了浏览器操作、页面元素交互、动态等待等场景。熟练掌握这些 API,可以帮助我们轻松应对;爬虫、 Web 自动化测试的各种挑战。
相关文章:
Selenium 全面指南
Selenium 是一个强大的 Web 自动化工具,支持多种浏览器和语言绑定。 1. Selenium 的基本概念 WebDriver:Selenium 提供的核心接口,用于控制浏览器操作。显式等待:等待特定条件满足后再执行操作。隐式等待:全局设置一个…...
#error: WinSock.h has already been included解决方案
原因: 在工程中使用了 Boot 库之后,使用了socket、tcp 相关的头文件,在其他地方还是包括了头文件<windows.h>,该头文件内包含了<winsock.h>。导致遇到报错问题:WinSock.h has already been included 解决…...
2.Couchbase 的增量查询优化
在 Couchbase 中实现增量查询的优化是关键,尤其当数据量庞大时。通过合适的策略,可以显著提高增量查询的效率,确保系统在处理实时数据时的响应速度和性能。下面是一些针对 Couchbase 增量查询的优化策略。 1. 使用索引优化查询 为了提升增量…...
汽车IVI中控开发入门及进阶(46):FFmpeg
概述: FFmpeg 是领先的多媒体框架,能够解码、编码、 转码、复用、解复用、流、过滤和播放 几乎所有人类和机器创建的东西。它支持最模糊的古老格式,直到最前沿。无论它们是由某个标准委员会、社区还是公司设计的。它还具有高度的可移植性:FFmpeg 在各种构建环境、机器架构…...
Spring Boot 中的 @Scheduled 定时任务以及开关控制
Scheduled注解是Spring框架(包括Spring Boot)中用于实现定时任务的一种方式。以下是对Scheduled注解的详细解析: 一、基本概念 Scheduled注解允许开发者在Spring容器中定义定时任务。通过简单地在一个方法上添加Scheduled注解,S…...
服务器证书原理
CA(Certificate Authority)证书是由 证书颁发机构(CA)本身签名的。具体来说,这取决于 CA 的类型和其在信任链中的位置: 1. 自签名证书 根 CA 证书 是信任链的起点,由 CA 自己签名。它们是信任链…...
重温设计模式--代理、中介者、适配器模式的异同
文章目录 1、相同点2、不同点 1、相同点 目的都是为了更好地处理对象之间的关系:这三种模式都是在软件设计中用于处理对象之间的关联和交互,以达到优化系统结构、增强可维护性等目的。它们都在一定程度上隐藏了对象之间的某些细节或者复杂性,…...
2024第十六届蓝桥杯模拟赛(第二期)-Python
# 2024第十六届蓝桥杯模拟赛(第二期)-Python题解 # 自己改注释# -----------------------1------------------------ # def prime(x): # if x < 2: # return 0 # for i in range(2, int(x ** 0.5) 1): # if x % i 0: # …...
分布式系统中的防抖策略一致性与性能优化
目录 引言分布式系统的挑战防抖策略简介确保多实例间一致性的方法 幂等操作TTL缓存 分布式一致性事件总线或消息队列异步任务调度器客户端或API网关层面的防抖一致性哈希与分区限流和熔断机制 避免锁竞争导致的性能瓶颈Java示例代码结论 引言 在现代软件架构中,…...
项目代码第6讲:UpdownController.cs;理解 工艺/工序 流程、机台信息;前端的“历史 警报/工艺 记录”
一、UpdownController.cs 1、前端传入 当用户在下图的“记录查询”中的 两个界面选项 中,点击“导出”功能时,向后端发起请求,请求服务器下载文件的权限 【权限是在Program.cs中检测的,这个控制器里只需要进行“谁在哪个接口下载了文件”的日志记录】 【导出:是用户把…...
【计算机视觉基础CV-图像分类】03-深度学习图像分类实战:鲜花数据集加载与预处理详解
本文将深入介绍鲜花分类数据集的加载与处理方式,同时详细解释代码的每一步骤并给出更丰富的实践建议和拓展思路。以实用为导向,为读者提供从数据组织、预处理、加载到可视化展示的完整过程,并为后续模型训练打下基础。 前言 在计算机视觉的深…...
大模型应用技术系列(一):大模型应用整体技术栈浅析
RAG相关的技术学习暂时告一段落了,接下来尝试探索新的学习方向。这就引入一个问题:接下来该做什么?为了能进一步推进,我需要有一个整体的视角,从更上层来看整个技术栈,从而确定接下来感兴趣的方向。本文主要探索从更上层的视角来看构建大模型的技术栈,从而进一步确定研究…...
绿色环保木塑复合材料自动化生产线设计书
《绿色环保木塑复合材料自动化生产线设计书》 一、项目概述 随着全球对环境保护和可持续发展的日益重视,绿色环保材料的研发与生产成为了热门领域。木塑复合材料作为一种新型的绿色环保材料,它将木材纤维与塑料通过特定工艺复合而成,兼具木材与塑料的双重特性,具有防水、…...
Sourcegraph 概述
Sourcegraph 报告 Sourcegraph 是一款强大的代码搜索和智能导航工具,专为大型代码库、分布式系统和跨多个仓库的开发环境设计。它能显著提高开发者对复杂系统的理解和维护效率,帮助团队在庞大的代码库中快速找到关键信息。本文将详细讲解 Sourcegraph 的…...
c 保存 csv格式的文件
在C语言中保存数据为CSV(逗号分隔值)格式的文件,你可以使用标准I/O库函数,如fprintf,来将数据写入文件,并确保每个字段之间用逗号分隔。以下是一个简单的示例,说明如何在C语言中创建一个CSV文件…...
C语言扫雷游戏教学(有图形界面)(提供源码+实验报告)(计时+排行榜+难度选择+登录注册+背景音乐)(涉及easyX库)
前言: 本篇文章篇幅较长,请根据自己的需求在目录上跳转对应内容哦!源码及实验报告的获取在文章的后面哦!本人代码水平不佳,希望本文章和项目能带给大家帮助! 目录 前言: 一.成果预览&#x…...
第五节:GLM-4v-9b模型model加载源码解读(模型相关参数方法解读)
文章目录 前言一、GLM-4v-9b模型model加载源码解读1、GLM-4v-9b模型model加载主函数源码2、GLM-4v-9b模型model加载源码源码解读3、GLM-4v-9b自定义模型类源码解读 二、基于GLM-4v-9b模型获取模型输入参数等内容源码解读(from_pretrained-->huggingface)1、from_pretrained函…...
面试经验分享 | 北京渗透测试岗位
更多大厂面试经验的视频经验分享看主页 目录: 所面试的公司:安全大厂 所在城市:北京 面试职位:渗透测试工程师 面试方式:腾讯会议线上面试线下面试 面试过程: 面试官的问题: 1、说一下XSS有哪…...
unity Toggle制作滑动开关
先上效果图 重点是这个Graphic要清空,不然显示不能直接切换,会消失 using DG.Tweening; using UnityEngine; using UnityEngine.UI;public class SwitchToggle : MonoBehaviour {public RectTransform handleRect;public float duration 0.5f;private Vector2 handlePos;To…...
全面解析 Kubernetes 流量负载均衡:iptables 与 IPVS 模式
目录 Kubernetes 中 Service 的流量负载均衡模式 1. iptables 模式 工作原理 数据路径 优点 缺点 适用场景 2. IPVS 模式 工作原理 数据路径 优点 缺点 适用场景 两种模式的对比 如何切换模式 启用 IPVS 模式 验证模式 总结 Kubernetes 中 Service 的流量负载…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
