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

Selenium库快速查找网页元素及执行浏览器模拟操作

Selenium 是一个自动化测试工具,主要用于模拟用户在网页上的行为,进行自动化测试。它支持多种浏览器,并且可以在多种操作系统上运行。以下是 Selenium 库的一些主要特点和用途:

  1. 网页自动化测试: Selenium 可以模拟用户在网页上的各种操作,如点击、输入文本、选择下拉框等,从而进行网页自动化测试。这对于确保网站在不同浏览器和操作系统下的兼容性非常重要。

  2. 网页数据提取: Selenium 可以用于抓取网页上的数据,例如爬取网页上的文本、链接、图片等内容,从而进行数据分析或其他处理。

  3. UI 自动化测试: 通过模拟用户在网页上的操作,Selenium 可以对网页的用户界面进行自动化测试,验证网页的交互功能是否正常。

  4. 跨浏览器测试: Selenium 支持多种浏览器,包括 Chrome、Firefox、Edge、Safari 等,可以在这些不同的浏览器上进行测试,确保网页在各种浏览器下的表现一致性。

  5. 跨平台测试: Selenium 可以在不同的操作系统上运行,包括 Windows、Mac、Linux 等,这使得可以在不同平台上进行测试,并确保网页在不同操作系统下的兼容性。

总之,Selenium 是一个强大的自动化测试工具,可以帮助开发人员和测试人员自动化进行网页测试、数据提取和 UI 测试等任务,从而提高开发效率和软件质量。


Selenium库提供了一系列`find_element_by_*`方法,用于查找网页上的元素,返回第一个匹配的元素;
>>>>>>find_elements_by_*`方法查找多个匹配的元素,返回一个元素列表。
这些方法根据不同的定位策略来查找元素。
以下是常用的`find_element_by_*`方法:
1. **find_element_by_id(id)**:根据元素的id属性查找元素。
2. **find_element_by_name(name)**:根据元素的name属性查找元素。
3. **find_element_by_xpath(xpath)**:根据XPath表达式查找元素。
4. **find_element_by_link_text(link_text)**:根据链接文本查找`<a>`元素。
5. **find_element_by_partial_link_text(partial_link_text)**:根据部分链接文本查找`<a>`元素。
6. **find_element_by_tag_name(tag_name)**:根据标签名查找元素。
7. **find_element_by_class_name(class_name)**:根据class属性查找元素。
8. **find_element_by_css_selector(css_selector)**:根据CSS选择器查找元素。

这些方法返回第一个匹配的元素。如果找不到匹配的元素,将抛出NoSuchElementException异常。
示例代码:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.example.com")
# 根据id查找元素element_by_id = driver.find_element_by_id("my_element_id")
# 根据name查找元素element_by_name = driver.find_element_by_name("my_element_name")
# 根据XPath表达式查找元素element_by_xpath = driver.find_element_by_xpath("//div[@id='my_div']")
# 根据链接文本查找元素element_by_link_text = driver.find_element_by_link_text("click here")
# 根据部分链接文本查找元素element_by_partial_link_text = driver.find_element_by_partial_link_text("click")
# 根据标签名查找元素element_by_tag_name = driver.find_element_by_tag_name("div")
# 根据class属性查找元素element_by_class_name = driver.find_element_by_class_name("my_class")
# 根据CSS选择器查找元素element_by_css_selector = driver.find_element_by_css_selector("#my_element_id")
这些方法使您能够根据不同的属性和选择器来定位网页上的元素,从而进行元素操作和交互。
-------------------
`driver.find_elements(By.`是Selenium中使用By类进行元素查找的方法之一。
这些方法返回一个元素列表,您可以对列表中的每个元素执行操作,例如遍历、获取属性、点击等。
>>>>driver.find_element(By是Selenium中使用By类进行元素查找的方法之一。通过这种方式,查找单个元素。

通过这种方式,您可以根据不同的定位策略来查找元素。以下是一些常见的定位策略:
1. **By.ID**:根据元素的id属性来查找元素。
2. **By.NAME**:根据元素的name属性来查找元素。
3. **By.CLASS_NAME**:根据元素的class属性来查找元素。
4. **By.TAG_NAME**:根据元素的标签名来查找元素。
5. **By.LINK_TEXT**:根据元素的链接文本来查找`<a>`元素。
6. **By.PARTIAL_LINK_TEXT**:根据元素的部分链接文本来查找`<a>`元素。
7. **By.XPATH**:根据XPath表达式来查找元素。
8. **By.CSS_SELECTOR**:根据CSS选择器来查找元素。

您可以使用`driver.find_elements(By.`结合上述定位策略来查找多个元素。例如:
from selenium.webdriver.common.by import By
# 根据id查找多个元素elements_by_id = driver.find_elements(By.ID, "element_id")
# 根据name查找多个元素elements_by_name = driver.find_elements(By.NAME, "element_name")
# 根据class查找多个元素elements_by_class_name = driver.find_elements(By.CLASS_NAME, "element_class")
# 根据标签名查找多个元素elements_by_tag_name = driver.find_elements(By.TAG_NAME, "tag_name")
# 根据链接文本查找多个链接元素elements_by_link_text = driver.find_elements(By.LINK_TEXT, "link_text")
# 根据部分链接文本查找多个链接元素elements_by_partial_link_text = driver.find_elements(By.PARTIAL_LINK_TEXT, "partial_link_text")
# 根据XPath表达式查找多个元素elements_by_xpath = driver.find_elements(By.XPATH, "//xpath_expression")
# 根据CSS选择器查找多个元素elements_by_css_selector = driver.find_elements(By.CSS_SELECTOR, "css_selector")
--------------------
页面上的元素对象具有许多方法和属性,可以用于与元素进行交互和获取元素的信息。以下是一些常见的方法和属性:
**方法:**
1. **click()**:点击元素。
2. **send_keys(keys)**:向元素发送键盘输入。
3. **clear()**:清除输入框中的文本。
4. **get_attribute(name)**:获取元素的指定属性值。
5. **is_displayed()**:检查元素是否可见。
6. **is_enabled()**:检查元素是否可用。
7. **is_selected()**:检查元素是否被选中(适用于复选框和单选框)。
8. **submit()**:提交表单。
9. **location**:获取元素在页面中的坐标位置。
10. **size**:获取元素的大小。
11. **screenshot(filename)**:将元素的屏幕截图保存为文件。
12. **value_of_css_property(property_name)**:获取元素的CSS属性值。
**属性:**
1. **text**:获取元素的文本内容。
2. **tag_name**:获取元素的标签名。
3. **id**:获取元素的id属性值。
4. **name**:获取元素的name属性值。
5. **class_name**:获取元素的class属性值。
6. **location_once_scrolled_into_view**:获取元素滚动到视图中的位置(只读属性)。
这些方法和属性使您能够获取元素的信息,执行各种操作,以及进行状态检查,从而实现自动化测试或网页操作任务。
---------------
get_attribute(name) 方法用于获取指定属性的值。该方法允许您检索元素的任何属性,并返回该属性的值。
### 参数:- **name**:要获取的属性的名称。
### 返回值:- 返回指定属性的值,如果属性不存在,则返回 `None`。
### 注意事项:
- 如果元素没有指定的属性,`get_attribute()` 方法将返回 `None`。
- 对于一些特殊属性,例如 `checked`、`selected` 等,返回的值可能是布尔类型。
- 对于一些动态生成的属性,例如 `data-*` 属性,您也可以使用该方法获取它们的值。
以下是一些常见的(name) 属性名称种类:
1. **id**:元素的唯一标识符。
2. **name**:元素的名称。
3. **class** 或 **className**:元素的类名。
4. **value**:元素的值,常用于输入框、下拉列表等。
5. **href**:链接元素的目标 URL。
6. **src**:图像、音频、视频等媒体元素的源 URL。
7. **type**:输入元素的类型,例如文本框、复选框、按钮等。
8. **checked**:复选框或单选框的选中状态。
9. **selected**:下拉列表中选定选项的状态。
10. **disabled**:元素的禁用状态。
11. **title**:元素的标题。
12. **alt**:图像元素的替代文本。
13. **data-* **:自定义数据属性,例如 `data-role`、`data-id` 等。
14. **aria-* **:可访问性属性,例如 `aria-label`、`aria-hidden` 等。
15. **style**:元素的样式属性。
16. **outerHTML**:元素的外部 HTML,包括元素本身及其所有子元素的 HTML 内容。可以用于调试、验证页面结构等用途。
### 示例:
假设有一个 `<input>` 元素如下:
```html
<input id="username" type="text" value="john_doe" data-role="user">
使用 `get_attribute()` 方法来获取不同属性的值:
element = driver.find_element(By.ID, "username")
# 获取id属性的值
id_value = element.get_attribute("id")
print("ID:", id_value)  # 输出:ID: username
# 获取value属性的值
value = element.get_attribute("value")
print("Value:", value)  # 输出:Value: john_doe
# 获取data-role属性的值
data_role = element.get_attribute("data-role")
print("Data Role:", data_role)  # 输出:Data Role: user
# 不存在的属性值
non_existent = element.get_attribute("non-existent")
print("Non Existent Attribute:", non_existent)  # 输出:Non Existent Attribute: None
### 总结:
`get_attribute()` 方法允许您以编程方式检索元素的任何属性,并根据需要使用这些属性值进行后续操作。

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
from selenium.common.exceptions import TimeoutExceptiondriver = webdriver.Chrome()try:# 打开网页driver.get("https://www.hao123.com/")# 获取页面中所有input元素input_elements = driver.find_elements(By.TAG_NAME, "input")# 输出所有的input元素for input_element in input_elements:print(input_element.get_attribute("outerHTML"))# 等待文本框出现在页面上search_input = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'input[data-hook="searchInput"]')))# 输入搜索词search_input.send_keys("Selenium库")# 等待搜索按钮出现在页面上try:search_button = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'input[data-hook="searchSubmit"]')))# 点击搜索按钮search_button.click()except TimeoutException:print("找不到搜索按钮或搜索按钮不可见。")# 在这里可以添加其他恢复措施,比如重新加载页面,或者跳过当前步骤继续执行等。# 等待搜索结果列表的第一个元素出现try:WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, "input[id='kw']"), "Selenium库"))except TimeoutException as e:print(e)finally:# 关闭浏览器driver.quit()
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get('https://forum.sublimetext.com/')table = driver.find_element(By.CSS_SELECTOR, 'table.topic-list')
table_html = table.get_attribute('outerHTML')
print(table_html)# 将网页内容保存到本地文件
with open('seleniumBy.CSS_SELECTOR.html', 'w', encoding='utf-8') as f:f.write(table_html)driver.quit()

相关文章:

Selenium库快速查找网页元素及执行浏览器模拟操作

Selenium 是一个自动化测试工具&#xff0c;主要用于模拟用户在网页上的行为&#xff0c;进行自动化测试。它支持多种浏览器&#xff0c;并且可以在多种操作系统上运行。以下是 Selenium 库的一些主要特点和用途&#xff1a; 网页自动化测试&#xff1a; Selenium 可以模拟用户…...

2024年(第十届)全国大学生统计建模大赛选题参考(一)

本届大赛主题为“大数据与人工智能时代的统计研究”&#xff0c;参赛队围绕主题自拟题目撰写论文。 1. 大数据分析与处理 研究思路 数据收集&#xff1a;首先确定数据来源&#xff0c;例如社交媒体、企业数据库或公开数据集&#xff0c;并使用爬虫技术或API收集数据。数据预…...

EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测

EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测 目录 EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.GCN基于图卷积神经网络的数据分类预测 Matlab2023 2.多输入单输出的分类预测&#xf…...

贪心算法介绍

贪心算法是一种在求解问题时总是做出在当前看来是最好的选择的算法。它不从整体最优上加以考虑&#xff0c;所做出的选择只是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解&#xff0c;关键是贪心策略的选择&#xff0c;选择的贪心策略必须具备无后效性…...

前端常用数据结构

前端常用数据结构 前端常用数据结构数据结构数组栈队列链表单向链表双向链表树前端常用数据结构 什么是数据结构常用的数据结构 JavaScript 如何实现这些数据结构实际场景数据结构 所谓数据结构,是在计算机中组织、管理和存储数据的一种方式。 🙋:你知道哪些数据结构? …...

java设计模式之——单例模式

一&#xff1a;什么是单例模式&#xff1f; 构造函数private之后&#xff0c;还需要提供一个方法&#xff0c;要保证只能初始化一个单例对象&#xff0c;并且需要考虑线程安全的问题。 二&#xff1a;单例模式多种写法&#xff1f; 具体到写法上&#xff0c;主要有5种&#…...

深入理解计算机系统学习笔记

1.1异常处理 处理器中很多事情都会导致异常控制流&#xff0c;此时&#xff0c;程序执行的正常流程被破坏掉。异常可以由程序执行从内部产生&#xff0c;也可以由某个外部信号从外部产 生。 我们的指令集体系结构包括三种不同的内部产生的异常&#xff1a; l)halt指令&#…...

Linux-进程信号

目录 概念信号产生信号注册信号注销信号处理实例 信号的基本应用 概念 进程信号&#xff1a; 概念&#xff1a;信号就是软件中断。信号就是用于向进程通知某个事件的产生&#xff0c;打断进程当前操作&#xff0c;去处理这个事件。 linux中信号的种类&#xff1a;使用kill -l命…...

Linux服务器安装jdk

背景: 安装JDK是我们java程序在服务器运行的必要条件,下面描述几个简单的命令就可再服务器上成功安装jdk 命令总览: yum update -y yum list | grep jdk yum -y install java-1.8.0-openjdk java -version 1.查看可安装版本 yum list | grep jdk 2.如果查不到可先进行 yum upd…...

基于 HBase Phoenix 构建实时数仓(2)—— HBase 完全分布式安装

目录 一、开启 HDFS 机柜感知 1. 增加 core-site.xml 配置项 2. 创建机柜感知脚本 3. 创建机柜配置信息文件 4. 分发相关文件到其它节点 5. 重启 HDFS 使机柜感知生效 二、主机规划 三、安装配置 HBase 完全分布式集群 1. 在所有节点上配置环境变量 2. 解压、配置环境…...

equals()与==的区别

在Java中 可以对基本类型进行比较,比较的是值是否相等 也可以对引用类型(对象)进行比较,比较的是引用变量所指向的空间地址 public static void main(String[] args) {int a 10;int b 10;System.out.println(ab);//true// 基本类型比较,比较值是否相等String s1 new Stri…...

什么是数据采集与监视控制系统(SCADA)?

SCADA数据采集是一种用于监控和控制工业过程的系统。它可以实时从现场设备获得数据并将其传输到中央计算机&#xff0c;以便进行监控和控制。SCADA数据采集系统通常使用传感器、仪表和控制器收集各种类型的数据&#xff0c;例如温度、压力、流量等&#xff0c;然后将这些数据汇…...

基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(五)——多条件搜索并分页展示

前后端数据交互 书接上文&#xff0c;我们上节课通过前后端数据交互实现了分页查询和单条件搜索分页查询的功能&#xff0c;最后留了个小尾巴&#xff0c;就是把其他两个搜索条件&#xff08;email,address&#xff09;也加进来&#xff0c;实现多条件搜索并分页展示。这节课我…...

鸿蒙实战开发Camera组件:【相机】

相机组件支持相机业务的开发&#xff0c;开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发&#xff0c;最常见的操作如&#xff1a;预览、拍照和录像等。 基本概念 拍照 此功能用于拍摄采集照片。 预览 此功能用于在开启相机后&#xff0c;在缓冲区内重复采集…...

政安晨:【深度学习处理实践】(三)—— 处理时间序列的数据准备

在深度学习中&#xff0c;对时间序列的处理主要涉及到以下几个方面&#xff1a; 序列建模&#xff1a;深度学习可以用于对时间序列进行建模。常用的模型包括循环神经网络&#xff08;Recurrent Neural Networks, RNN&#xff09;和长短期记忆网络&#xff08;Long Short-Term M…...

PCL不同格式点云读取速度(Binary和ASCII )

首先说明一点&#xff1a;Binary(二进制)格式点云文件进行读取时要比Ascll码格式点云读取时要快的多&#xff0c;尤其是对于大型的点云文件&#xff0c;如几百万、甚至几千万个点云的情况下。 今天遇到了一种情况&#xff0c;在写项目的时候进行点云读取&#xff0c;读取的时候…...

Neo4J图数据库入门示例

前言 - Neo4j和MySQL的区别 Neo4j 和 MySQL 是两种不同类型的数据库&#xff0c;它们在数据模型、用途、性能和查询语言等方面有着显著的区别。以下是它们的主要区别&#xff1a; 数据模型&#xff1a; Neo4j 是一种图数据库&#xff0c;它使用图数据模型来存储和查询数据。在…...

牛客每日一题之 二维前缀和

题目介绍&#xff1a; 题目链接&#xff1a;【模板】二维前缀和_牛客题霸_牛客网 先举两个简单的例子&#xff0c;来帮大家理解题目&#xff0c;注意理解二维前缀和要先要一维前缀和的基础&#xff0c;不了解的可以看我上一篇博客。 若x11&#xff0c;y11, x23, y2 3,这是要…...

动态规划 Leetcode 70 爬楼梯

爬楼梯 Leetcode 70 学习记录自代码随想录 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到…...

(未解决)macOS matplotlib 中文是方框

reference&#xff1a; Mac OS系统下实现python matplotlib包绘图显示中文(亲测有效)_mac plt 中文值-CSDN博客 module ‘matplotlib.font_manager‘ has no attribute ‘_rebuild‘解决方法_font_manager未解析-CSDN博客 # 问题描述&#xff08;笑死 显而易见 # solve 找到…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...