Selenium 使用指南:从入门到精通

Selenium 使用指南:从入门到精通

Selenium 是一个用于自动化 Web 浏览器操作的强大工具,广泛应用于自动化测试和 Web 数据爬取中。本文将带你从入门到精通地掌握 Selenium,涵盖其基本操作、常用用法以及一个完整的图片爬取示例。

1. 环境配置

1.1 安装 Selenium

在 Python 环境中,可以通过 pip 安装 Selenium:

pip install selenium

1.2 下载 WebDriver

Selenium 需要与特定浏览器的 WebDriver 一起使用。例如,若使用 Chrome 浏览器,需要下载 ChromeDriver 并确保路径已配置好。

1.3 设置 WebDriver 路径

将下载的 WebDriver 解压后,路径可以设置到系统环境变量中,或在代码中指定其位置。

2. Selenium 基本用法

2.1 启动浏览器并打开页面

from selenium import webdriver# 创建 Chrome 浏览器实例并指定 WebDriver 路径
driver = webdriver.Chrome(executable_path=r'C:\Program Files\Google\Chrome\Application\chromedriver.exe')# 打开网页
driver.get('https://www.example.com')# 关闭浏览器
driver.quit()

2.2 查找元素

可以通过多种方式查找页面中的元素:

# 通过 ID
element_by_id = driver.find_element_by_id('element-id')# 通过 name
element_by_name = driver.find_element_by_name('element-name')# 通过 class
element_by_class = driver.find_element_by_class_name('element-class')# 通过 tag
element_by_tag = driver.find_element_by_tag_name('tag-name')# 通过 CSS selector
element_by_css = driver.find_element_by_css_selector('css.selector')# 通过 XPath
element_by_xpath = driver.find_element_by_xpath('//tag[@attribute="value"]')

2.3 交互操作

2.3.1 点击事件
# 查找并点击按钮
button = driver.find_element_by_id('button-id')
button.click()
2.3.2 输入文本
# 查找输入框并输入文本
input_box = driver.find_element_by_name('input-name')
input_box.send_keys('Hello, World!')

2.4 获取元素属性和文本

# 获取属性值
attribute_value = element_by_id.get_attribute('attribute-name')# 获取文本内容
text_content = element_by_id.text

2.5 等待元素加载

在某些情况下,需要等待元素加载完成:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECelement = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'element-id'))
)

2.6 处理弹窗和多窗口

2.6.1 处理 JavaScript 弹窗
# 切换并接受弹窗
alert = driver.switch_to.alert
alert.accept()
2.6.2 切换窗口
# 获取所有窗口句柄
handles = driver.window_handles# 切换到新窗口
driver.switch_to.window(handles[1])

2.7 执行 JavaScript

# 滚动页面到元素
driver.execute_script("arguments[0].scrollIntoView();", element_by_id)

2.8 截图

# 保存当前页面截图
driver.save_screenshot('screenshot.png')

2.9 管理 Cookies

# 获取所有 Cookies
cookies = driver.get_cookies()# 添加新 Cookie
driver.add_cookie({'name': 'key', 'value': 'value'})# 删除一个 Cookie
driver.delete_cookie('key')# 删除所有 Cookies
driver.delete_all_cookies()

3. 高级用法:爬取网页图片

3.1 爬取示例代码

以下是一个使用 Selenium 爬取网页图片的完整示例:

from selenium import webdriver
import os
import urllib.request# 设置 ChromeDriver 路径并打开浏览器
driver = webdriver.Chrome(executable_path='path/to/chromedriver')# 打开目标网页
driver.get('https://www.example.com')# 查找所有图片元素
images = driver.find_elements_by_tag_name('img')# 创建保存图片的文件夹
os.makedirs('downloaded_images', exist_ok=True)# 下载所有图片
for i, img in enumerate(images):src = img.get_attribute('src')if src:print(f"Downloading image {i+1}: {src}")# 下载并保存图片urllib.request.urlretrieve(src, f'downloaded_images/image_{i+1}.jpg')# 关闭浏览器
driver.quit()import urllib.request
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://netflav.com/trending")
element_by_id = driver.find_element(By.ID, 'kw')
element_by_id.send_keys("hello")
driver.find_element(By.ID, 'su').click()
plants = driver.find_elements(By.TAG_NAME, "img")
for idx, img_element in enumerate(plants):img_url = img_element.get_attribute('src')urllib.request.urlretrieve(src, f'image_{idx+1}.jpg')
driver.quit()

3.2 代码解释

  • 导入库并设置 WebDriver:导入 Selenium 和 Python 标准库用于文件操作和 HTTP 请求。
  • 打开网页并获取图片元素:使用 find_elements_by_tag_name('img') 获取所有图片元素。
  • 下载图片:遍历图片元素,获取 src 属性并下载图片到本地。

4. 总结

通过本文的介绍,相信你已经对 Selenium 的基本操作和高级应用有了全面的了解。Selenium 是一个强大且灵活的工具,在自动化测试和数据爬取中都能提供极大便利。通过学习和实践这些功能,可以极大地提升自动化流程的效率。希望这篇文章能帮助你更好地掌握 Selenium。

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

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

相关文章

Sqoop导入MySQL中含有回车换行符的数据

个人博客地址:Sqoop导入MySQL中含有回车换行符的数据 MySQL中的数据如下图: 检查HDFS上的目标文件内容可以看出,回车换行符位置的数据被截断了,导致数据列错位。 Sqoop提供了配置参数,在导入时丢弃掉数据的分隔符&…

掌握API和控制点(从Java到JNI接口)_36 JNI开发与NDK 04

4、 *.so的入口函数&#xff1a;JNI_OnLoad() VM (virtual machine)的角色 Java代码在VM上执行。在执行Java代码的过程中&#xff0c;如果Java需要与本地代码(*.so)沟通时&#xff0c; VM就会把*.so視为插件<Tn>而加载到VM里。然后让Java函数呼叫到这插件<Tn>里的…

[MRCTF2020]Ez_bypass1(md5绕过)

[MRCTF2020]Ez_bypass1(md5绕过) ​​ 这道题就是要绕过md5强类型比较&#xff0c;但是本身又不相等&#xff1a; md5无法处理数组&#xff0c;如果传入的是数组进行md5加密&#xff0c;会直接放回NULL&#xff0c;两个NuLL相比较会等于true&#xff1b; 所以?id[]1&gg…

90,【6】攻防世界 WEB Web_php_unserialize

进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file&#xff0c;默认值为 index.phpprivate $file index.php;// 构造函数&#xff0c;当创建类的实例时会自动调用// 接收一个参数 $file&#xff0c;用于初始化对象的 $file 属…

Jenkins安装部署(以及常见报错解决方案),jdk版本控制器sdkman

目录 零、环境介绍 一、Jenkins安装 1、插件安装以及更换插件源 2、修改jenkins时区 二、sdkman安装&#xff08;可选&#xff09; 1、sdkman常用方法 2、sdkman常用方法演示 2.1、查看可用的jdk 2.2、下载jdk并切换版本 三、jenkins报错解决 1、下载sdkman后systemc…

c语言练习题【数据类型、递归、双向链表快速排序】

练习1&#xff1a;数据类型 请写出以下几个数据的数据类型 整数 a a 的地址 存放a的数组 b 存放a的地址的数组 b的地址 c的地址 指向 printf 函数的指针 d 存放 d的数组 整数 a 的类型 数据类型是 int a 的地址 数据类型是 int*&#xff08;指向 int 类型的指针&#xff09; …

联想拯救者Y9000P IRX8 2023 (82WK) 原厂Win11 家庭中文版系统 带一键还原功能 安装教程

安装完重建winre一键还原功能&#xff0c;和电脑出厂时的系统状态一模一样。自动机型专用软件&#xff0c;全部驱动&#xff0c;主题壁纸&#xff0c;自动激活&#xff0c;oem信息等。将电脑系统完全恢复到出厂时状态。 支持机型 (MTM) : 82WK 系统版本&#xff1a;Windows 1…

深入解析“legit”的地道用法——从俚语到正式表达:Sam Altman用来形容DeepSeek: legit invigorating(真的令人振奋)

深入解析“legit”的地道用法——从俚语到正式表达 一、引言 在社交媒体、科技圈甚至日常对话中&#xff0c;我们经常会看到或听到“legit”这个词。比如最近 Sam Altman 在 X&#xff08;原 Twitter&#xff09;上发的一条帖子中写道&#xff1a; we will obviously deliver …

Vue 图片引用方式详解:静态资源与动态路径访问

目录 前言1. 引用 public/ 目录2. assets/ 目录3. 远程服务器4. Vue Router 动态访问5. 总结6. 扩展&#xff08;图片不显示&#xff09; 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 在 Vue 开发中&#x…

DeepSeek-R1 本地部署教程(超简版)

文章目录 一、DeepSeek相关网站二、DeepSeek-R1硬件要求三、本地部署DeepSeek-R11. 安装Ollama1.1 Windows1.2 Linux1.3 macOS 2. 下载和运行DeepSeek模型3. 列出本地已下载的模型 四、Ollama命令大全五、常见问题解决附&#xff1a;DeepSeek模型资源 一、DeepSeek相关网站 官…

JVM运行时数据区域-附面试题

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直存在&#xff0c;有些区域则是 依赖用户线程的启动和结束而建立和销毁。 1. 程序计…

2月3日星期一今日早报简报微语报早读

2月3日星期一&#xff0c;农历正月初六&#xff0c;早报#微语早读。 1、多个景区发布公告&#xff1a;售票数量已达上限&#xff0c;请游客合理安排行程&#xff1b; 2、2025春节档总票房破70亿&#xff0c;《哪吒之魔童闹海》破31亿&#xff1b; 3、美宣布对中国商品加征10…

C++ Primer 标准库vector

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.6 广播机制核心算法:维度扩展的数学建模

2.6 广播机制核心算法&#xff1a;维度扩展的数学建模 目录/提纲 #mermaid-svg-IfELXmhcsdH1tW69 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IfELXmhcsdH1tW69 .error-icon{fill:#552222;}#mermaid-svg-IfELXm…

【Elasticsearch】硬件资源优化

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

bootstrap.yml文件未自动加载问题解决方案

在添加bootstrap.yml文件后,程序未自动扫描到,即图标是这样的: 查了一些资料,是缺少bootstrap相关依赖,虽然已经添加了spring-cloud-context依赖,但是这个依赖并未引入bootstrap依赖,可能是版本问题,需要手动引入 <dependency><groupId>org.springframework.cloud&…

C++底层学习预备:模板初阶

文章目录 1.编程范式2.函数模板2.1 函数模板概念2.2 函数模板原理2.3 函数模板实例化2.3.1 隐式实例化2.3.2 显式实例化 2.4 模板参数的匹配原则 3.类模板希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 进入STL库学习之前我们要先了解有关模板的…

【玩转 Postman 接口测试与开发2_015】第12章:模拟服务器(Mock servers)在 Postman 中的创建与用法(含完整实测效果图)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十二章 模拟服务器&#xff08;Mock servers&#xff09;在 Postman 中的创建与用法1 模拟服务器的概念2 模拟服务器的创建2.1 开启侧边栏2.2 模拟服务器的两种创建方式2.3 私有模拟器的 API 秘钥的用法…

【算法】回溯算法专题③ ——排列型回溯 python

目录 前置小试牛刀回归经典举一反三总结 前置 【算法】回溯算法专题① ——子集型回溯 python 【算法】回溯算法专题② ——组合型回溯 剪枝 python 小试牛刀 全排列 https://leetcode.cn/problems/permutations/description/ 给定一个不含重复数字的数组 nums &#xff0c;返…

LabVIEW如何高频采集温度数据?

在LabVIEW中进行高频温度数据采集时&#xff0c;选择合适的传感器&#xff08;如热电偶或热电阻&#xff09;和采集硬件是关键。下面是一些建议&#xff0c;帮助实现高效的温度数据采集&#xff1a; 1. 传感器选择&#xff1a; 热电偶&#xff08;Thermocouple&#xff09;&am…