【Python爬虫实战】深入解析 Selenium:从元素定位到节点交互的完整自动化指南

#1024程序员节|征文#

  🌈个人主页:易辰君-CSDN博客
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

前言

Selenium 是进行网页自动化操作的强大工具,在测试、数据抓取、用户行为模拟等领域广泛应用。本指南将带您详细了解如何在 Selenium 中查找和定位页面元素,并深入介绍各种节点交互方法,包括点击、输入文本、选择选项等操作。无论您是初学者还是经验丰富的开发者,本篇文章将帮助您掌握 Selenium 自动化的核心技能,实现更高效的网页自动化操作。


一、查找节点

在 Selenium 中,查找节点(即网页元素)是执行自动化操作的核心步骤。Selenium 提供多种方式来定位网页元素,例如通过 ID、类名、标签名、CSS 选择器、XPath 等,方便我们查找和操作页面中的特定元素。

(一)find_element()find_elements()

  • find_element():返回匹配条件的第一个元素。

  • find_elements():返回匹配条件的所有元素的列表。

(二)常见的定位方法

Selenium 提供了多种定位方式,每种方式都适合不同的场景。以下是主要的定位方法:

2.1 通过 ID 定位

ID 是页面中元素的唯一标识,适用于查找特定的单一元素。

from selenium.webdriver.common.by import Byelement = driver.find_element(By.ID, "element_id")

2.2 通过类名定位

类名通常用于样式的设置,页面上可能有多个元素共享同一个类名。如果只需要找到第一个匹配的元素,可以用 find_element,否则使用 find_elements 来查找所有匹配的元素。

element = driver.find_element(By.CLASS_NAME, "class_name")
elements = driver.find_elements(By.CLASS_NAME, "class_name")

2.3 通过标签名定位

可以使用 HTML 标签名(例如 divph1 等)来定位元素,这种方法通常用于查找同类型的元素。

element = driver.find_element(By.TAG_NAME, "tag_name")
elements = driver.find_elements(By.TAG_NAME, "tag_name")

2.4 通过 CSS 选择器定位

CSS 选择器是非常灵活和强大的定位方式,适用于复杂的元素定位需求。可以使用类、ID、层级关系等来定位元素。

element = driver.find_element(By.CSS_SELECTOR, "css_selector")
elements = driver.find_elements(By.CSS_SELECTOR, "css_selector")

CSS 选择器的例子:

  • 类选择器:".class_name"

  • ID 选择器:"#element_id"

  • 层级选择器:"div > p"

  • 属性选择器:"input[name='username']"

2.5 通过 XPath 定位

XPath 是一种用于定位 XML 元素的路径语言,非常适合查找嵌套较深、复杂的 HTML 元素。

element = driver.find_element(By.XPATH, "//div[@class='example']")
elements = driver.find_elements(By.XPATH, "//div[@class='example']")

XPath 的例子:

  • 绝对路径:"/html/body/div[1]/p"

  • 相对路径:"//div[@class='example']"

  • 层级选择:"//div[@id='main']/p[1]"

(三)示例

以下是一个示例代码,演示如何使用多种定位方式查找元素并打印其文本内容:

from selenium import webdriver
from selenium.webdriver.common.by import By# 初始化 WebDriver
driver = webdriver.Chrome()
driver.get("https://example.com")# 使用不同方法查找元素并打印文本内容
try:# 通过 ID 查找element_by_id = driver.find_element(By.ID, "element_id")print("ID:", element_by_id.text)# 通过类名查找element_by_class = driver.find_element(By.CLASS_NAME, "class_name")print("Class Name:", element_by_class.text)# 通过标签名查找element_by_tag = driver.find_element(By.TAG_NAME, "h1")print("Tag Name:", element_by_tag.text)# 通过 CSS 选择器查找element_by_css = driver.find_element(By.CSS_SELECTOR, ".class_name")print("CSS Selector:", element_by_css.text)# 通过 XPath 查找element_by_xpath = driver.find_element(By.XPATH, "//div[@class='example']")print("XPath:", element_by_xpath.text)except Exception as e:print("Error locating element:", e)# 关闭浏览器
driver.quit()

(四)常见场景及技巧

  • 查找多个相同类型的元素:使用 find_elements() 返回所有匹配的元素,例如获取页面上所有按钮。

  • 动态内容:对于动态加载的内容,可以使用显式等待(WebDriverWait)等待元素加载后再查找。

  • 组合定位:有时需要结合多个条件来定位元素,例如 CSSXPath 结合使用。

(五)显示等待示例

在查找节点之前等待元素出现,以避免因页面加载较慢而导致的定位失败。

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.presence_of_element_located((By.ID, "element_id"))
)
print("Element found:", element.text)

(六)查找节点总结

查找节点是 Selenium 自动化测试和数据抓取的关键步骤。通过多种定位方法和技巧,可以精确地找到页面元素,结合显式等待提高定位的稳定性,适应不同类型的页面布局和内容。掌握这些方法后,可以灵活应对网页自动化任务中的复杂定位需求。


二、节点交互

在 Selenium 中,节点交互是指与网页元素(节点)进行操作的过程,如点击、输入文本、清除文本、提交表单等。通过这些交互操作,可以模拟用户的真实行为,从而完成自动化任务。以下是常见的节点交互方法。

(一)点击元素

使用 click() 方法模拟用户点击按钮、链接等元素。

button = driver.find_element(By.ID, "submit_button")
button.click()

(二)输入文本

使用 send_keys() 方法向输入框、文本域等元素中输入文本。可以模拟用户在输入框中输入内容。

search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Selenium WebDriver")

(三)清除文本

使用 clear() 方法清除输入框中的现有文本内容。通常在重新输入前需要先清空已有内容。

text_field = driver.find_element(By.ID, "input_field")
text_field.clear()  # 清除已有内容
text_field.send_keys("New Text")  # 输入新内容

(四)提交表单

在表单元素上调用 submit() 方法,可以提交表单。通常用于搜索框、登录表单等。

search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Selenium WebDriver")
search_box.submit()  # 提交表单

(五)获取元素属性

使用 get_attribute() 方法获取元素的特定属性值,例如链接的 href、图片的 src 等。

link = driver.find_element(By.ID, "link_id")
print(link.get_attribute("href"))  # 获取链接的 href 属性

(六)获取元素文本

使用 text 属性获取元素的文本内容,例如标题、段落内容等。

paragraph = driver.find_element(By.CLASS_NAME, "description")
print(paragraph.text)  # 输出元素的文本内容

(七)选择下拉菜单选项

使用 Select 类来操作 <select> 下拉菜单,可以选择选项值或文本。

from selenium.webdriver.support.ui import Selectdropdown = Select(driver.find_element(By.ID, "dropdown_id"))
dropdown.select_by_visible_text("Option Text")  # 根据文本选择
dropdown.select_by_value("option_value")  # 根据值选择
dropdown.select_by_index(2)  # 根据索引选择

(八)鼠标悬停和其他高级操作

使用 ActionChains 类可以执行一些复杂的鼠标和键盘操作,如鼠标悬停、右键单击、双击、拖拽等。

from selenium.webdriver.common.action_chains import ActionChains# 初始化 ActionChains
actions = ActionChains(driver)# 鼠标悬停
element = driver.find_element(By.ID, "hover_element")
actions.move_to_element(element).perform()# 右键单击
actions.context_click(element).perform()# 双击
actions.double_click(element).perform()# 拖放操作
source = driver.find_element(By.ID, "source_element")
target = driver.find_element(By.ID, "target_element")
actions.drag_and_drop(source, target).perform()

(九)模拟键盘操作

使用 send_keys() 方法可以模拟按键操作,配合 Keys 类实现回车、删除、选择全选等操作。

from selenium.webdriver.common.keys import Keysinput_field = driver.find_element(By.ID, "input_field")
input_field.send_keys("Selenium")  # 输入文本
input_field.send_keys(Keys.RETURN)  # 模拟回车
input_field.send_keys(Keys.CONTROL, 'a')  # 全选
input_field.send_keys(Keys.DELETE)  # 删除

(十)等待元素可点击

在执行点击等操作之前,可以使用显式等待确保元素已经加载并可点击,以提高稳定性。

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.element_to_be_clickable((By.ID, "clickable_element"))
)
element.click()

(十一)滚动页面

在页面内容较长时,可以滚动页面以确保元素可见。

# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 滚动到特定元素
element = driver.find_element(By.ID, "target_element")
driver.execute_script("arguments[0].scrollIntoView();", element)

(十二)完整示例

以下是一个完整的示例,展示了如何使用各种节点交互方法。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select
import timedriver = webdriver.Chrome()
driver.get("https://example.com")# 输入文本并提交
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Selenium WebDriver")
search_box.submit()# 等待页面加载
time.sleep(3)# 点击元素
button = driver.find_element(By.ID, "submit_button")
button.click()# 获取元素属性和文本
link = driver.find_element(By.ID, "link_id")
print("Link href:", link.get_attribute("href"))
print("Link text:", link.text)# 选择下拉菜单选项
dropdown = Select(driver.find_element(By.ID, "dropdown_id"))
dropdown.select_by_visible_text("Option Text")# 鼠标悬停
actions = ActionChains(driver)
element = driver.find_element(By.ID, "hover_element")
actions.move_to_element(element).perform()# 模拟按键
input_field = driver.find_element(By.ID, "input_field")
input_field.send_keys("Text Input")
input_field.send_keys(Keys.CONTROL, 'a')
input_field.send_keys(Keys.DELETE)# 关闭浏览器
driver.quit()

(十三)节点交互总结

Selenium 提供了丰富的节点交互方法,帮助实现网页的自动化操作。通过对元素进行点击、输入文本、选择下拉选项、鼠标悬停等操作,可以模拟用户的多种行为,完成自动化测试或数据抓取任务。掌握这些交互方法可以显著提高自动化脚本的灵活性和可靠性。


三、总结

Selenium 提供了强大且灵活的元素定位和节点交互功能。通过掌握 ID、类名、CSS 选择器、XPath 等定位方法,以及点击、输入、清除文本、提交表单等交互操作,可以灵活地自动化各种网页任务。借助显式等待、滚动页面、模拟键盘输入等高级功能,您的自动化脚本将变得更加可靠和智能。希望本文为您的 Selenium 自动化之旅提供了全面的帮助,为您在网页自动化操作中带来更高的效率和成功率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/458974.html

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

相关文章

Sqoop的安装配置及使用

Sqoop安装前需要检查之前是否安装了Tez,否则会产生版本或依赖冲突&#xff0c;我们需要移除tez-site.xml&#xff0c;并将hadoop中的mapred-site.xml配置文件中的mapreduce驱动改回成yarn&#xff0c;然后分发到其他节点&#xff0c;hive里面配置的tez也要移除&#xff0c;然后…

实战应用WPS WebOffice开放平台服务

概述 根据公司的业务需要&#xff0c;主要功能是在线编辑文档&#xff0c;前端的小伙伴进行的技术调研&#xff0c;接入的是WPS WebOffice&#xff0c;这里只阐述技术介入的步骤、流程和遇到的坑进行的一些总结。 实践 WPS WebOffice 开放平台进行认证 在开始之前&#xff…

大数据-193 Apache Tez - DAG 作业计算框架 核心解释 工作原理 配置集成

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Anki插件Export deck to html的改造

在Anki中进行复习时&#xff0c;每次只能打开一条笔记。如果积累了很多笔记&#xff0c;有时候会有将它们集中输出成一个pdf进行阅读的想法。Anki插件Export deck to html&#xff08;安装ID&#xff1a;1897277426&#xff09;就有这个功能。但是&#xff0c;这个插件目前存在…

岛津分子泵软件TMP系列分子泵EI-D系列控制电源 EI Monitor(232和485控制)

岛津分子泵软件TMP系列分子泵EI-D系列控制电源 EI Monitor(232和485控制)

探索Unity:从游戏引擎到元宇宙体验,聚焦内容创作

unity是实时3D互动内容创作和运营平台&#xff0c;包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助Unity将创意变成现实。提供一整套完善的软件解决方案&#xff0c;可用于创作、运营和变现任何实时互动的2D和3D内容&#xff0c;支持平台包括手机、…

图为大模型一体机新探索,赋能智能家居行业

在21世纪的今天&#xff0c;科技的飞速进步正以前所未有的速度重塑着我们的生活方式。从智能手机到物联网&#xff0c;从大数据到人工智能&#xff0c;每一项技术创新都在为人类带来前所未有的便利与效率。其中&#xff0c;图为AI大模型一体机作为人工智能领域的最新成果&#…

DiskGenius一键修复磁盘损坏

下午外接磁盘和U盘都出现扇区损坏&#xff0c;估计就是在开着电脑&#xff0c;可能是电脑运行的软件还在对磁盘进行读写&#xff0c;不小心按到笔记本关机键&#xff0c;重新开机读写磁盘分区变得异常卡顿&#xff0c;估摸就是这个原因导致扇区损坏。在进行读写时&#xff0c;整…

深度学习:YOLO v1网络架构、损失值及NMS极大值抑制

引言 随着深度学习的发展&#xff0c;物体检测&#xff08;Object Detection&#xff09;成为计算机视觉领域的一项重要任务。传统的物体检测方法往往依赖于手工设计的特征和滑窗搜索策略&#xff0c;效率低下且效果有限。近年来&#xff0c;基于深度学习的方法&#xff0c;尤…

leetcode-63-不同陆路径II

题解&#xff1a; 1、设dp[i][j]为到达(i,j)点的路径。当grid[i][j]1时,dp[i][j]0;否则dp[i][j]为到达(i-1,j)的最多路径与到达(i,j-1)的最多路径之和。当(i,j)位于第一行时&#xff0c;dp[i][j]dp[i][j-1]。当(i,j)位于第一列时&#xff0c;dp[i][j]dp[i-1][j]。 2、初始化M…

MATLAB锂电概率分布模型

&#x1f3af;要点 概率分布等效电路模型结合了路径相关速率能力及状态估计中滞后效应。纠正了充电状态中时间误差累积及避免开路电压中电压滞后现象。使用电流方向和电池容量相关函数描述开路电压&#xff0c;并使用微分方程描述电压滞后现象。模型结构基于一级相变的材料机制…

新华三H3CNE网络工程师认证—OSPF路由协议

OSPF是典型的链路状态路由协议&#xff0c;是目前业内使用非常广泛的IGP协议之一。本博客将对OSPF路由协议进行总结。 OSPF目前针对IPv4协议使用的是OSPFVersion2(RFC2328)&#xff1b; 针对IPv6协议使用OSPFVersion3(RFC2740)。如无特殊说明本章后续所指的OSPF均为OSPF Versi…

监督学习之逻辑回归

逻辑回归&#xff08;Logistic Regression&#xff09; 逻辑回归是一种用于二分类&#xff08;binary classification&#xff09;问题的统计模型。尽管其名称中有“回归”二字&#xff0c;但逻辑回归实际上用于分类任务。它的核心思想是通过将线性回归的输出映射到一个概率值…

【MATLAB源码-第193期】基于matlab的网络覆盖率NOA优化算法仿真对比VFINOA,VFPSO,VFNGO,VFWOA等算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 NOA&#xff08;Network Optimization Algorithm&#xff0c;网络优化算法&#xff09;是一个针对网络覆盖率优化的算法&#xff0c;它主要通过优化网络中节点的分布和配置来提高网络的整体覆盖性能。网络覆盖率是衡量一个无…

基于STM32G0的USB PD协议学习(3)

0、前言 STM32这个平台资源确实很不错&#xff0c;但是里面的PD代码是一个lib库文件&#xff0c;没有开源。可以做来玩玩&#xff0c;但是如果要满足USB-IF认证需求的话&#xff0c;谨慎&#xff01;&#xff01;&#xff01; 这段时间较为繁忙&#xff0c;断更有点严重... …

植物健康,Spring Boot来保障

5系统详细实现 5.1 系统首页 植物健康系统需要登录才可以看到首页。具体界面的展示如图5.1所示。 图5.1 系统首页界面 5.2 咨询专家 可以在咨询专家栏目发布消息。具体界面如图5.2所示。 图5.2 咨询专家界面 5.3 普通植物检查登记 普通员工可以对普通植物检查登记信息进行添…

Linux之权限(2)

权限&#xff08;2&#xff09; 操作&#xff1a;有VS没有 只有文件的拥有者或者root&#xff0c;能修改自己的权限 Linux下能执行真的是一个可执行文件可执行权限 user,group,other和我自己进行身份对比&#xff0c;依次只对比一次 8进制数值表示方法 chmod ax /home/abc.…

基于vue、VantUI、django的程序设计

首先构建vue项目&#xff0c;构建项目点这里 安装 npm install axios axios简介 Axios 是一个基于 promise 的 HTTP 库&#xff0c;用于发起请求和接收响应&#xff0c;实现异步操作 基本使用 axios对象 请求响应拦截 在utils文件夹里新建ajax.js 创建一个axios对象并…

云智慧完成华为原生鸿蒙系统的适配, 透视宝 APM 为用户体验保驾护航

2024 年 10 月 22 日&#xff0c;首个国产移动操作系统 —— 华为原生鸿蒙操作系统 HarmonyOS NEXT 正式面世&#xff0c;成为继 iOS 和 Android 后的全球第三大移动操作系统。HarmonyOS NEXT&#xff0c;从系统内核、数据库根基&#xff0c;到编程语言创新、AI&#xff08;人工…

【WebGis开发 - Cesium】三维可视化项目教程---图层管理拓展图层透明度控制

目录 引言一、为什么要开发图层透明度控制功能二、开发思路整理1. cesium图层api查询1.1 imageryLayer 透明度1.2 primitive 透明度 三、代码编写1. 修改原有图层管理代码2. 新增页面结构3. 编写图层透明度控制方法 四、总结 引言 本教程主要是围绕Cesium这一开源三维框架开展的…