【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 By

element = 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 Select

dropdown = 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 Keys

input_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 time

driver = 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 自动化之旅提供了全面的帮助,为您在网页自动化操作中带来更高的效率和成功率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库->联合查询

目录 一、联合查询 1.联合查询 2.多表联合查询时MYSQL内部是如何进⾏计算的 3.多表联合查询 3.1语法 3.2指定多个表&#xff0c;进行联合查询 3.3通过表与表中的链接条件过滤掉无效数据 3.4通过指定列查询&#xff0c;精简查询结果​编辑 3.5可以通过给表起别名的方式&…

k8s知识点总结

docker 名称空间 分类 Docker中的名称空间用于提供进程隔离&#xff0c;确保容器之间的资源相互独立。主要分类包括&#xff1a; PID Namespace&#xff1a;进程ID隔离&#xff0c;使每个容器有自己的进程树&#xff0c;容器内的进程不会干扰其他容器或主机上的进程。 NET Nam…

C++11(1)——右值引用、统一初始化、C++发展史

一、C的发展史 1.C的产生 C的起源可以追溯到1979年&#xff0c;当时本贾尼&#xff08;C创始人&#xff09;在贝尔实验室从事计算机科学与软件工程的研究工作。面对项目中复杂的软件开发任务&#xff0c;特别是模拟和操作系统的开发工作&#xff0c;他感受到了现有语言&#…

计算机毕业设计Spark+大模型知识图谱中药推荐系统 中药数据分析可视化大屏 中药爬虫 机器学习 中药预测系统 中药情感分析 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

javascript-Web APLs (三)

事件流 指的是事件完整执行过程中的流动路 说明&#xff1a;假设页面里有个div&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 简单来说&#xff1a;捕获阶段是 从父到子 冒泡阶段是从子到父 实际工作都是使用事件冒泡为主 事件…

11.Three.js使用indexeddb前端缓存模型优化前端加载效率

11.Three.js使用indexeddb前端缓存模型优化前端加载效率 1.简述 在使用Three.js做数字孪生应用场景时&#xff0c;我们常常需要用到大量模型或数据。在访问我们的数字孪生应用时&#xff0c;每次刷新都需要从web端进行请求大量的模型数据或其他渲染数据等等&#xff0c;会极大…

keepalive+mysql8双主

1.概述 利用keepalived实现Mysql数据库的高可用&#xff0c;KeepalivedMysql双主来实现MYSQL-HA&#xff0c;我们必须保证两台Mysql数据库的数据完全一致&#xff0c;实现方法是两台Mysql互为主从关系&#xff0c;通过keepalived配置VIP&#xff0c;实现当其中的一台Mysql数据库…

C++ 实现俄罗斯方块游戏

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

项目实战:基于Linux的Flappy bird游戏开发

一、项目介绍 项目总结 1.按下空格键小鸟上升&#xff0c;不按小鸟下落 2.搭建小鸟需要穿过的管道 3.管道自动左移和创建 4.小鸟撞到管道游戏结束 知识储备 1.C语言 2.数据结构-链表 3.Ncurses库 4.信号机制 二、Ncurses库介绍 Ncurses是最早的System V Release 4.0 (SVr4)中…

nginx上传文件超过限制大小、响应超时、反向代理请求超时等问题解决

1、文件大小超过限制 相关配置&#xff1a; client_max_body_size&#xff1a; Syntax:client_max_body_size size;Default:client_max_body_size 1m;Context:http, server, location 2、连接超时: proxy_read_timeout&#xff1a; Syntax:proxy_read_timeout time;Default…

C++ --- 多线程的使用

目录 一.什么是线程&#xff1f; 线程的特点&#xff1a; 线程的组成&#xff1a; 二.什么是进程&#xff1f; 进程的特点&#xff1a; 进程的组成&#xff1a; 三.线程与进程的关系&#xff1a; 四.C的Thread方法的使用&#xff1a; 1.创建线程&#xff1a; 2.join(…

基于Spring Boot的医疗陪护系统设计与实现(源码+定制+开发)病患陪护管理平台、医疗服务管理系统、医疗陪护信息平台

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

ViT面试知识点

文章目录 VITCLIPSAMYOLO系列问题 VIT 介绍一下Visual Transformer&#xff1f; 介绍一下自注意力机制&#xff1f; 介绍一下VIT的输出方式 介绍一下VIT做分割任务 VIT是将NLP的transformer迁移到cv领域&#xff0c;他的整个流程大概如下&#xff1a;将一张图片切成很多个pat…

【Comsol教程】计算流道中的流量

在进行微流控方面的仿真的时候可能需要计算某一流道中流量的大小&#xff0c;下面展示如何计算。 流量分为质量流量和体积流量&#xff0c;我们常采用体积流量。在COMSOL中有两种方法计算&#xff0c; 1.使用Comsol内置的函数 这里我使用的是蠕动流模块【spf】,定义了3个开放边…

LeetCode 3226. 使两个整数相等的位更改次数

. - 力扣&#xff08;LeetCode&#xff09; 题目 给你两个正整数 n 和 k。你可以选择 n 的 二进制表示 中任意一个值为 1 的位&#xff0c;并将其改为 0。 返回使得 n 等于 k 所需要的更改次数。如果无法实现&#xff0c;返回 -1。 示例 1&#xff1a; 输入&#xff1a; n …

项目升级到.Net8.0 Autofac引发诡异的问题

前两天把项目升级到.Net8.0了&#xff0c;把.Net框架升级了&#xff0c;其他一些第三方库升级了一部分&#xff0c;升级完以后项目跑不起来了&#xff0c;报如下错误&#xff1a; An unhandled exception occurred while processing the request. DependencyResolutionExcepti…

RabbitMQ 七种工作模式介绍

目录 1.简单模式队列 2.WorkQueue(⼯作队列) 3 Publish/Subscribe(发布/订阅) 4 Routing(路由模式) 5.Topics(通配符模式) 6 RPC(RPC通信) 7 Publisher Confirms(发布确认) RabbitMQ 共提供了7种⼯作模式供我们进⾏消息传递,接下来一一介绍它的实现与目的 1.简单模式队列…

自动化测试类型与持续集成频率的关系

持续集成是敏捷开发的一个重要实践&#xff0c;可是究竟多频繁的集成才算“持续”集成&#xff1f; 一般来说&#xff0c;持续集成有3种常见的集成频率&#xff0c;分别是每分钟集成、每天集成和每迭代集成。项目组应当以怎样的频率进行集成&#xff0c;这取决于测试策略&…

操作系统期中复习2-4单元

Chapter-2 第一个图形界面——Xerox Alto 早期操作系统&#xff1a;规模小&#xff0c;简单&#xff0c;功能有限&#xff0c;无结构(简单结构)。&#xff08;MS-DOS,早期UNIX&#xff09; 层次结构&#xff1a;最底层为硬件&#xff0c;最高层为用户层&#xff0c;自下而上构…

2-141 怎么实现ROI-CS压缩感知核磁成像

怎么实现ROI-CS压缩感知核磁成像&#xff0c;这个案例告诉你。基于matlab的ROI-CS压缩感知核磁成像。ROI指在图像中预先定义的特定区域或区域集合&#xff0c;选择感兴趣的区域&#xff0c;通过减少信号重建所需的数据来缩短信号采样时间&#xff0c;减少计算量&#xff0c;并在…