Python Selenium 库学习指南

Python Selenium 库学习指南

目录

  1. Selenium 基础介绍
    • Selenium 是什么
    • 安装 Selenium
    • Selenium 的工作原理
  2. Selenium 基本用法
    • 启动浏览器
    • 定位元素
    • 常见操作:点击、输入、滚动
  3. 高级用法
    • 切换窗口与标签页
    • 模拟鼠标操作与键盘输入
    • 动态加载的网页处理
  4. 等待机制
    • 显式等待与隐式等待
    • 等待条件与时间限制
  5. Selenium 与浏览器交互
    • 模拟用户行为
    • 上传与下载文件
  6. Selenium 与 JavaScript 的交互
    • 执行 JavaScript 代码
    • 获取 JavaScript 渲染的内容
  7. 常见问题与解决方案
    • 报错与调试
    • 遇到反爬虫机制时的处理
  8. Selenium 实战:自动化测试与爬虫应用
    • 自动化测试的基本框架
    • 使用 Selenium 爬取动态网页数据
  9. 总结与扩展

第一章:Selenium 基础介绍

1.1 Selenium 是什么

Selenium 是一个强大的浏览器自动化工具,它可以模拟用户在浏览器中的操作,如点击按钮、输入文本、滚动页面等。它最初用于 Web 应用的自动化测试,但在数据抓取和爬虫领域也得到了广泛应用,特别是抓取动态加载的网页内容。

Selenium 可以与多种浏览器配合使用,包括 Chrome、Firefox、Edge、Safari 等,它通过 WebDriver 接口与浏览器交互。

1.2 安装 Selenium

安装 Selenium 非常简单,首先需要安装 selenium 库。在终端或者命令行中运行以下命令:

pip install selenium

Selenium 需要与浏览器驱动程序(如 ChromeDriver 或 GeckoDriver)配合使用,浏览器驱动程序负责控制浏览器的行为。以 Chrome 浏览器为例,你需要下载与浏览器版本匹配的 chromedriver

  1. 下载地址:ChromeDriver
  2. 解压并将其路径添加到系统的环境变量中,或者在代码中指定路径。

1.3 Selenium 的工作原理

Selenium 通过 WebDriver 与浏览器交互。WebDriver 是浏览器的接口,允许你通过编程控制浏览器的行为。例如,启动浏览器、访问网页、执行点击操作、获取页面元素等。

Selenium 与浏览器的通信是通过 HTTP 协议实现的,WebDriver 会向浏览器发送 HTTP 请求,而浏览器则根据请求执行相应操作。


第二章:Selenium 基本用法

2.1 启动浏览器

首先,我们需要启动浏览器并加载网页。以下是启动 Chrome 浏览器并访问网页的基本代码:

from selenium import webdriver# 指定浏览器驱动路径(如果已添加环境变量则可省略)
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')# 访问指定 URL
driver.get('https://www.example.com')# 打印网页标题
print(driver.title)# 关闭浏览器
driver.quit()

2.2 定位元素

在 Selenium 中,元素的定位是与浏览器交互的关键步骤。你可以通过多种方法来定位元素,常见的有:

  • By.ID:根据元素的 id 属性定位
  • By.NAME:根据元素的 name 属性定位
  • By.XPATH:使用 XPath 表达式定位元素
  • By.CSS_SELECTOR:使用 CSS 选择器定位元素
  • By.CLASS_NAME:根据类名定位元素
  • By.TAG_NAME:根据标签名定位元素
示例:根据 ID 定位并点击一个按钮
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()# 访问网页
driver.get('https://www.example.com')# 定位并点击按钮
button = driver.find_element(By.ID, 'submit-button')
button.click()driver.quit()
示例:使用 XPath 定位元素
# 定位并获取元素文本
element = driver.find_element(By.XPATH, '//h1')
print(element.text)

2.3 常见操作

在 Selenium 中,常见的操作包括点击、输入文本、清空文本框、滚动页面等。

2.3.1 点击元素
button = driver.find_element(By.ID, 'submit-button')
button.click()
2.3.2 输入文本
input_field = driver.find_element(By.NAME, 'username')
input_field.send_keys('my_username')
2.3.3 清空输入框
input_field.clear()
2.3.4 滚动页面
from selenium.webdriver.common.action_chains import ActionChains# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 或者滚动到指定元素
element = driver.find_element(By.ID, 'target-element')
ActionChains(driver).move_to_element(element).perform()

第三章:高级用法

3.1 切换窗口与标签页

在 Selenium 中,你可以在多个窗口或标签页之间进行切换。每个浏览器窗口都有一个唯一的句柄(handle),你可以通过句柄来切换窗口。

示例:切换窗口
# 获取当前窗口句柄
main_window = driver.current_window_handle# 打开新窗口并获取新窗口句柄
driver.find_element(By.ID, 'new-window').click()
new_window = driver.window_handles[1]# 切换到新窗口
driver.switch_to.window(new_window)# 在新窗口中进行操作
driver.find_element(By.ID, 'some-element').click()# 切换回主窗口
driver.switch_to.window(main_window)

3.2 模拟鼠标操作与键盘输入

Selenium 支持模拟鼠标点击、双击、右键点击等操作,以及键盘输入(如按下 Enter 键)。

模拟鼠标操作
from selenium.webdriver.common.action_chains import ActionChains# 鼠标悬停在一个元素上
element = driver.find_element(By.ID, 'hover-element')
actions = ActionChains(driver)
actions.move_to_element(element).perform()# 右键点击
actions.context_click(element).perform()
模拟键盘输入
from selenium.webdriver.common.keys import Keys# 输入文本并按 Enter 键
input_field = driver.find_element(By.NAME, 'search')
input_field.send_keys('Python')
input_field.send_keys(Keys.RETURN)

3.3 动态加载的网页处理

有些网页的内容是通过 JavaScript 动态加载的,Selenium 可以帮助你处理这些动态加载的网页。

示例:等待网页加载
import time# 等待页面加载完毕
time.sleep(3)# 处理动态加载的内容
dynamic_element = driver.find_element(By.ID, 'dynamic-content')
print(dynamic_element.text)

第四章:等待机制

4.1 显式等待与隐式等待

在 Selenium 中,网页内容的加载可能需要一些时间,特别是在动态加载的页面上。为了解决这一问题,Selenium 提供了等待机制,分为显式等待和隐式等待。

4.1.1 隐式等待

隐式等待是设置一个全局的等待时间,当查找元素时,如果元素没有马上出现,Selenium 会等待一定的时间再去查找。

driver = webdriver.Chrome()
driver.implicitly_wait(10)  # 设置等待时间为 10 秒driver.get('https://www.example.com')
element = driver.find_element(By.ID, 'some-element')
4.1.2 显式等待

显式等待是为某个特定的元素设置等待条件,直到条件满足或超时为止。通常配合 WebDriverWaitexpected_conditions 使用。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.get('https://www.example.com')# 等待元素加载完成,最多等待 10 秒
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'some-element'))
)print(element.text)

第五章:Selenium 与浏览器交互

5.1 模拟用户行为

Selenium 允许你模拟用户的各种行为,几乎可以完成任何在浏览器中手动操作的任务。这包括点击、拖动、键盘输入、滚动等。

5.1.1 模拟点击行为

点击行为通常用来模拟用户点击网页中的按钮或链接。使用 click() 方法可以模拟点击操作。

# 定位按钮并点击
button = driver.find_element(By.ID, 'submit-button')
button.click()
5.1.2 模拟输入文本

通过 send_keys() 方法,Selenium 可以模拟用户在输入框中输入文本。你可以输入普通文本,也可以输入特殊的按键(如 EnterTab 等)。

# 定位输入框并输入文本
input_field = driver.find_element(By.NAME, 'search')
input_field.send_keys('Python Selenium')# 模拟按下回车键
input_field.send_keys(Keys.RETURN)
5.1.3 鼠标拖动与放置

Selenium 可以模拟鼠标拖动操作,例如拖动一个元素并放置到另一个位置。

from selenium.webdriver.common.action_chains import ActionChains# 定位源元素与目标元素
source_element = driver.find_element(By.ID, 'draggable')
target_element = driver.find_element(By.ID, 'droppable')# 模拟拖拽操作
actions = ActionChains(driver)
actions.drag_and_drop(source_element, target_element).perform()

5.2 上传与下载文件

Selenium 也可以模拟文件上传和下载操作,这对于自动化测试非常有用。

5.2.1 上传文件

上传文件是通过 send_keys() 方法将文件路径输入到文件选择框中来完成的。确保你的页面中有一个 <input type="file"> 元素。

# 定位上传文件的输入框并发送文件路径
file_input = driver.find_element(By.ID, 'file-upload')
file_input.send_keys('/path/to/your/file.txt')# 提交上传表单
submit_button = driver.find_element(By.ID, 'submit')
submit_button.click()
5.2.2 下载文件

Selenium 本身不直接支持文件下载,但你可以通过修改浏览器设置来实现自动下载。对于 Chrome 浏览器,你可以配置下载目录并禁止弹出下载对话框。

from selenium import webdriver# 设置下载路径
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")  # 无头模式
chrome_options.add_argument("--disable-gpu")
chrome_options.add_experimental_option("prefs", {"download.default_directory": "/path/to/your/download/directory","download.prompt_for_download": False,  # 禁止弹出下载对话框
})driver = webdriver.Chrome(options=chrome_options)
driver.get('http://example.com/download-link')# 执行下载操作
download_button = driver.find_element(By.ID, 'download')
download_button.click()

第六章:Selenium 与 JavaScript 的交互

6.1 执行 JavaScript 代码

Selenium 允许你通过 execute_script() 方法在浏览器中执行 JavaScript 代码。这对于动态网页的处理或需要控制浏览器的行为时非常有用。

6.1.1 执行简单的 JavaScript
# 执行 JavaScript 代码,滚动页面到底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
6.1.2 获取 JavaScript 渲染的内容

有些网页内容是通过 JavaScript 动态渲染的,Selenium 允许你获取这些动态生成的内容。例如,可以通过 execute_script() 获取页面的 HTML 内容。

# 获取页面渲染后的 HTML
page_html = driver.execute_script("return document.documentElement.outerHTML")
print(page_html)
6.1.3 执行自定义的 JavaScript 代码

你也可以通过 execute_script() 执行自定义的 JavaScript 代码,控制页面行为。

# 让页面元素改变颜色
driver.execute_script("document.body.style.backgroundColor = 'yellow';")

第七章:常见问题与解决方案

7.1 Selenium 常见错误与调试

在使用 Selenium 时,可能会遇到一些常见的错误,以下是一些常见问题及解决方案。

7.1.1 元素未找到错误 (NoSuchElementException)

当 Selenium 无法定位到某个元素时,会抛出 NoSuchElementException 异常。常见原因包括元素尚未加载、定位方法错误等。

解决方案:

  • 使用等待机制,确保元素加载完成后再进行操作。
  • 检查元素的定位方式是否正确。
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, 'submit-button'))
)
element.click()
7.1.2 超时错误 (TimeoutException)

TimeoutException 通常发生在等待元素时超时。如果页面加载过慢或网络不稳定,可能导致此错误。

解决方案:

  • 增加等待时间。
  • 使用 WebDriverWait 等待页面加载或某个元素的出现。
from selenium.webdriver.support.ui import WebDriverWait# 等待页面加载完毕
driver.get('https://www.example.com')
WebDriverWait(driver, 15).until(lambda driver: driver.execute_script("return document.readyState") == "complete")
7.1.3 浏览器闪退或崩溃

浏览器闪退或崩溃通常与系统环境、驱动版本、浏览器版本不匹配等因素有关。

解决方案:

  • 确保浏览器和浏览器驱动的版本一致。
  • 使用无头模式(Headless)来减少资源占用。
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")  # 无头模式
driver = webdriver.Chrome(options=chrome_options)

第八章:Selenium 实战

8.1 自动化测试的基本框架

Selenium 常用于 Web 应用的自动化测试,自动化测试能够模拟用户的操作,确保应用程序的功能正常。常见的测试框架有 unittestpytest 等。以下是一个使用 unittest 的基本示例:

import unittest
from selenium import webdriver
from selenium.webdriver.common.by import Byclass TestWebsite(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()self.driver.get('https://www.example.com')def test_title(self):self.assertEqual(self.driver.title, 'Example Domain')def test_button_click(self):button = self.driver.find_element(By.ID, 'submit-button')button.click()self.assertTrue(self.driver.find_element(By.ID, 'next-page'))def tearDown(self):self.driver.quit()if __name__ == '__main__':unittest.main()

8.2 使用 Selenium 爬取动态网页数据

动态加载网页内容通常使用 JavaScript 进行渲染,Selenium 能够处理这些动态网页。以下是一个使用 Selenium 抓取动态数据的例子:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import timedriver = webdriver.Chrome()
driver.get('https://quotes.toscrape.com/js/')# 等待动态内容加载
time.sleep(3)# 获取页面中的所有引言
quotes = driver.find_elements(By.CLASS_NAME, 'quote')
for quote in quotes:text = quote.find_element(By.CLASS_NAME, 'text').textauthor = quote.find_element(By.CLASS_NAME, 'author').textprint(f'"{text}" - {author}')driver.quit()

第九章:总结与扩展

通过本篇文章,你应该已经掌握了 Selenium 的基础使用、常见操作以及一些高级技巧。以下是一些扩展内容,你可以继续深入学习:

  • 浏览器调试:了解如何调试 Selenium 代码,分析网络请求,处理 JavaScript 渲染的问题。
  • 多浏览器支持:学习如何在不同浏览器(如 Firefox、Edge)中使用 Selenium。
  • 分布式爬虫:了解如何结合 Selenium 和分布式爬虫框架(如 Scrapy 或 Celery)来构建大规模的爬虫。
  • 性能优化:学习如何优化 Selenium 脚本的执行速度,例如使用无头浏览器,减少冗余的等待时间等。

Selenium 是一个功能强大的工具,可以应用于自动化测试、数据抓取和许多其他领域。希望这篇教程能够帮助你掌握 Selenium 的基本用法,进一步提升你在 Python 编程中的技能。如果有任何问题,欢迎随时提问!

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

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

相关文章

React第二十二章(useDebugValue)

useDebugValue useDebugValue 是一个专为开发者调试自定义 Hook 而设计的 React Hook。它允许你在 React 开发者工具中为自定义 Hook 添加自定义的调试值。 用法 const debugValue useDebugValue(value)参数说明 入参 value: 要在 React DevTools 中显示的值formatter?:…

【漏洞分析】DDOS攻防分析

0x00 UDP攻击实例 2013年12月30日&#xff0c;网游界发生了一起“追杀”事件。事件的主角是PhantmL0rd&#xff08;这名字一看就是个玩家&#xff09;和黑客组织DERP Trolling。 PhantomL0rd&#xff0c;人称“鬼王”&#xff0c;本名James Varga&#xff0c;某专业游戏小组的…

【 PID 算法 】PID 算法基础

一、简介 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&#xff09;、Differential&#xff08;微分&#xff09;的缩写。也就是说&#xff0c;PID算法是结合这三种环节在一起的。粘一下百度百科中的东西吧。 顾名思义&#xff0c;…

PyTorch使用教程(1)—PyTorch简介

PyTorch是一个开源的深度学习框架&#xff0c;由Facebook人工智能研究院&#xff08;FAIR&#xff09;于2016年开发并发布&#xff0c;其主要特点包括自动微分功能和动态计算图的支持&#xff0c;使得模型建立更加灵活‌。官网网址&#xff1a;https://pytorch.org。以下是关于…

PyTorch框架——基于深度学习YOLOv5神经网络水果蔬菜检测识别系统

基于深度学习YOLOv5神经网络水果蔬菜检测识别系统&#xff0c;其能识别的水果蔬菜有15种&#xff0c;# 水果的种类 names: [黑葡萄, 绿葡萄, 樱桃, 西瓜, 龙眼, 香蕉, 芒果, 菠萝, 柚子, 草莓, 苹果, 柑橘, 火龙果, 梨子, 花生, 黄瓜, 土豆, 大蒜, 茄子, 白萝卜, 辣椒, 胡萝卜,…

Mac玩Steam游戏秘籍!

Mac玩Steam游戏秘籍&#xff01; 大家好&#xff01;最近有不少朋友在用MacBook玩Steam游戏时遇到不支持mac的问题。别担心&#xff0c;我来教你如何用第三方工具Crossover来畅玩这些不支持的游戏&#xff0c;简单又实用&#xff01; 第一步&#xff1a;下载Crossover 首先&…

【网络篇】IP知识

IPv4首部与IPv6首部 IPv4相对于IPv6的好处&#xff1a; 1.IPv6可自动配置&#xff0c;即使没有DHCP服务器也可以实现自动分配IP地址&#xff0c;实现即插即用。 2.IPv6包首部长度采用固定40字节&#xff0c;删除了选项字段&#xff0c;以及首部校验和&#xff0c;简化了首部…

我的年度总结

这一年的人生起伏&#xff1a;从曙光到低谷再到新的曙光 其实本来没打算做年度总结的&#xff0c;无聊打开了帅帅的视频&#xff0c;结合自己最近经历的&#xff0c;打算简单聊下。因为原本打算做的内容会是一篇比较丧、低能量者的呻吟。 实习生与创业公司的零到一 第一段工…

Vue脚手架开发 Vue2基础 VueRouter的基本使用 vue-router路由案例

vue-router路由 Vue脚手架开发&#xff0c;创建项目&#xff1a;https://blog.csdn.net/c_s_d_n_2009/article/details/144973766 Vue Router&#xff0c;Vue Router | Vue.js 的官方路由&#xff0c;Vue.js 的官方路由&#xff0c;为 Vue.js 提供富有表现力、可配置的、方便…

Windows远程桌面网关出现重大漏洞

微软披露了其Windows远程桌面网关&#xff08;RD Gateway&#xff09;中的一个重大漏洞&#xff0c;该漏洞可能允许攻击者利用竞争条件&#xff0c;导致拒绝服务&#xff08;DoS&#xff09;攻击。该漏洞被标识为CVE-2025-21225&#xff0c;已在2025年1月的补丁星期二更新中得到…

c语言----------内存管理

内存管理 目录 一。作用域1.1 局部变量1.2 静态(static)局部变量1.3 全局变量1.4 静态(static)全局变量1.5 extern全局变量声明1.6 全局函数和静态函数1.7 总结 二。内存布局2.1 内存分区2.2 存储类型总结2.3内存操作函数1) memset()2) memcpy()3) memmove()4) memcmp() 2.4 堆…

【2024年华为OD机试】 (C卷,100分)- 堆栈中的剩余数字(Java JS PythonC/C++)

一、问题描述 题目描述 向一个空栈中依次存入正整数&#xff0c;假设入栈元素 n(1<n<2^31-1)按顺序依次为 nx…n4、 n3、n2、 n1, 每当元素入栈时&#xff0c;如果 n1n2…ny(y 的范围[2,x]&#xff0c; 1<x<1000)&#xff0c;则 n1~ny 全部元素出栈&#xff0c;重…

Java安全—SPEL表达式XXESSTI模板注入JDBCMyBatis注入

前言 之前我们讲过SpringBoot中的MyBatis注入和模板注入的原理&#xff0c;那么今天我们就讲一下利用以及发现。 这里推荐两个专门研究java漏洞的靶场&#xff0c;本次也是根据这两个靶场来分析代码&#xff0c;两个靶场都是差不多的。 https://github.com/bewhale/JavaSec …

51单片机入门基础

目录 一、基础知识储备 &#xff08;一&#xff09;了解51单片机的基本概念 &#xff08;二&#xff09;掌握数字电路基础 &#xff08;三&#xff09;学习C语言编程基础 二、开发环境搭建 &#xff08;一&#xff09;硬件准备 &#xff08;二&#xff09;软件准备 三、…

基于Java的百度AOI数据解析与转换的实现方法

目录 前言 一、AOI数据结构简介 1、官网的实例接口 2、响应参数介绍 二、Java对AOI数据的解析 1、数据解析流程图 2、数据解析实现 3、AOI数据解析成果 三、总结 前言 在当今信息化社会&#xff0c;地理信息数据在城市规划、交通管理、商业选址等领域扮演着越来越重要的…

【WEB】网络传输中的信息安全 - 加密、签名、数字证书与HTTPS

文章目录 1. 概述2. 网络传输安全2.1.什么是中间人攻击2.2. 加密和签名2.2.1.加密算法2.2.2.摘要2.2.3.签名 2.3.数字证书2.3.1.证书的使用2.3.2.根证书2.3.3.证书链 2.4.HTTPS 1. 概述 本篇主要是讲解讲一些安全相关的基本知识&#xff08;如加密、签名、证书等&#xff09;&…

shell练习2

需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 #!/bin/bashnmap -sn 192.168.1.0/24 | grep Nmap scan report for | awk {print $5} 注意&#xff1a;当运行 bash ip.sh 时出现 nmap: command not found 的错误…

【运维自动化-作业平台】魔法变量到底如何使用之主机列表类型

蓝鲸作业平台&#xff0c;以下简称作业平台或JOB平台 魔法变量&#xff1a;JOB平台执行引擎提供的特有的变量能力用法 脚本中使用&#xff0c;并且需要事先声明&#xff1a;job_import {{变量名}} 声明后&#xff0c;同样是使用 dollar 符 大括号&#xff1a;${变量名}来取值…

活动预告 | CCF开源发展委员会开源供应链安全技术研讨会(2025第一期)——“大模型时代的开源供应链安全风控技术”...

点击蓝字 关注我们 CCF Opensource Development Committee CCF开源发展委员会开源供应链安全工作组&#xff08;以下简称CCF-ODC-OSS&#xff09;将于1月17日下午在北京黄大年茶思屋举行2025年第一期开源供应链安全技术研讨会&#xff0c;此次研讨会主题为“大模型时代的开源供…

XML序列化和反序列化的学习

1、基本介绍 在工作中&#xff0c;经常为了调通上游接口&#xff0c;从而对请求第三方的参数进行XML序列化&#xff0c;这里常使用的方式就是使用JAVA扩展包中的相关注解和类来实现xml的序列化和反序列化。 2、自定义工具类 import javax.xml.bind.JAXBContext; import javax.x…