selenium入门超详细教程——网页自动化操作

文章目录

  • 简介
  • 一、环境安装
    • 1.selenium安装
    • 2.安装浏览器驱动
      • 2.1 确定浏览器版本
      • 2.2 下载驱动
  • 二、基础用法
    • 1.对页面进行操作
      • 1.1 初始化浏览器对象
      • 1.2 访问页面
      • 1.3 设置浏览器大小
      • 1.4 前进后退
      • 1.5 获取页面基础属性
    • 2.定位页面元素
    • 3.模拟鼠标操作
      • 3.1 常用操作
    • 4.模拟键盘操作
      • 4.1 常用操作
    • 5. 延时等待
      • 5.1 强制等待
      • 5.2 隐式等待
      • 5.3 显式等待
    • 6.切换操作
      • 6.1 窗口切换
      • 6.2 表单切换
    • 7. 对Cookie操作
  • 三、高级用法
    • 1.execute_script方法
      • 1.1 判断元素是否存在
      • 1.2 滑动滚轮到页面底端
      • 1.3 滑动滚轮至页面元素出现
      • 1.4 滑动至动态元素可见
    • 2.xpath方法
      • 2.1 文本定位
      • 2.2 模糊定位
      • 2.3 逻辑定位
      • 2.4 轴定位
  • 总结
  • 参考

简介

Selenium是广泛使用的模拟浏览器运行的库,它是一个用于Web应用程序测试的工具。 Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,并且支持大多数现代 Web 浏览器。下面就进入正式的学习阶段。

一、环境安装

1.selenium安装

激活虚拟环境

activate nlptorch

通过pip安装

pip install selenium

2.安装浏览器驱动

针对不同的浏览器,需要安装不同的驱动。
下面以安装 Chrome 驱动作为演示。

2.1 确定浏览器版本

点击chrome浏览器最右侧的“三个点”图标,然后点击弹出的“帮助”中的“关于Google Chrome”,查看自己的版本信息。这里我的版本是94,这样在下载对应版本的 Chrome 驱动即可。
在这里插入图片描述

2.2 下载驱动

打开 下载Chrome驱动网页。单击对应的版本。
在这里插入图片描述
根据自己的操作系统,选择下载。
在这里插入图片描述

下载完成后,压缩包内只有一个 exe 文件。
在这里插入图片描述

将 chromedriver.exe 保存到任意位置,并把当前路径保存到环境变量。(建议将其保存到anaconda的安装目录下,这样不需要再添加环境变量了)
添加成功后使用下面代码进行测试。

from selenium import webdriver
# Chrome浏览器
driver = webdriver.Chrome()

如果能弹出Chrome浏览器,则说明安装成功。

二、基础用法

1.对页面进行操作

1.1 初始化浏览器对象

前期我们将Chrome驱动添加到环境变量了,所以我们可以直接初始化界面。(或者也可以通过指定绝对路径的方式)

from selenium import webdriver
# 初始化浏览器为chrome浏览器
browser = webdriver.Chrome()
# 指定绝对路径的方式(可选)
path = r'C:\Users\Gdc\.wdm\drivers\chromedriver\win32\96.0.4664.45\chromedriver.exe'
browser = webdriver.Chrome(path)
# 关闭浏览器
browser.close()

1.2 访问页面

进行页面访问使用的是get方法,传入参数为待访问页面的URL地址即可。

from selenium import webdriver
# 初始化浏览器为chrome浏览器
browser = webdriver.Chrome()
# 访问百度首页
browser.get(r'https://www.baidu.com/')
# 关闭浏览器
browser.close()

1.3 设置浏览器大小

set_window_size()方法可以用来设置浏览器大小(就是分辨率),而maximize_window则是设置浏览器为全屏。

from selenium import webdriver
import time  browser = webdriver.Chrome()# 设置浏览器大小:全屏
browser.maximize_window()   
browser.get('https://www.baidu.com')  
time.sleep(2)# 设置分辨率 500*500
browser.set_window_size(500,500)  
time.sleep(2)# 关闭浏览器
browser.close()

1.4 前进后退

前进后退也是我们在使用浏览器时非常常见的操作,这里forward()方法可以用来实现前进,back()可以用来实现后退。

from selenium import webdriver
import time  browser = webdriver.Chrome()# 设置浏览器全屏
browser.maximize_window()   
browser.get('https://www.baidu.com')  
time.sleep(2)# 打开淘宝页面
browser.get('https://www.bilibili.com/')  
time.sleep(2)# 后退到百度页面
browser.back()  
time.sleep(2)# 前进的淘宝页面
browser.forward() 
time.sleep(2)# 关闭浏览器
browser.close()

1.5 获取页面基础属性

当我们用selenium打开某个页面,有一些基础属性如网页标题、网址、浏览器名称、页面源码等信息

from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.baidu.com') # 网页标题
print(browser.title)
# 当前网址
print(browser.current_url)
# 浏览器名称
print(browser.name)
# 网页源码
print(browser.page_source)

在这里插入图片描述

2.定位页面元素

使用 selenium 定位页面元素的前提是你已经了解基本的页面布局及各种标签含义,当然如果之前没有接触过,现在我也可以带你简单的了解一下。
以我们熟知的 百度为例,我们进入首页,按 【F12】 进入开发者工具。红框中显示的就是页面的代码,我们要做的就是从代码中定位获取我们需要的元素。
在这里插入图片描述
我们在实际使用浏览器的时候,很重要的操作有输入文本、点击确定等等。对此,Selenium提供了一系列的方法来方便我们实现以上操作。通过webdriver对象的 find_element(by=“属性名”, value=“属性值”),主要包括以下这八种。

属性函数
CLASSfind_element(by=By.CLASS_NAME, value=‘’)
XPATHfind_element(by=By.XPATH, value=‘’)
LINK_TEXTfind_element(by=By.LINK_TEXT, value=‘’)
PARTIAL_LINK_TEXTfind_element(by=By.PARTIAL_LINK_TEXT, value=‘’)
TAGfind_element(by=By.TAG_NAME, value=‘’)
CSSfind_element(by=By.CSS_SELECTOR, value=‘’)
IDfind_element(by=By.ID, value=‘’)

还是以百度举例子
在这里插入图片描述
可以看到这个对应的class,name以及id分别是这些,通过以下语句都可以定位到这个元素。

from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get('https://www.baidu.com') 
element=browser.find_element(by=By.CLASS_NAME,value='s_ipt')
element=browser.find_element(by=By.ID,value='kw')

3.模拟鼠标操作

既然是模拟浏览器操作,自然也就需要能模拟鼠标的一些操作了,这里需要导入ActionChains 类。

from selenium.webdriver.common.action_chains import ActionChains

3.1 常用操作

这个其实就是页面交互操作中的点击click()操作。

操作函数
右击context_click()
双击double_click()
拖拽double_and_drop()
悬停move_to_element()
执行perform()

4.模拟键盘操作

引入Keys类

from selenium.webdriver.common.keys import Keys

4.1 常用操作

操作函数
删除键send_keys(Keys.BACK_SPACE)
空格键send_keys(Keys.SPACE)
制表键send_keys(Keys.TAB)
回退键send_keys(Keys.ESCAPE)
回车send_keys(Keys.ENTER)
全选send_keys(Keys.CONTRL,‘a’)
复制send_keys(Keys.CONTRL,‘c’)
剪切send_keys(Keys.CONTRL,‘x’)
粘贴send_keys(Keys.CONTRL,‘x’)
键盘F1send_keys(Keys.F1)

5. 延时等待

如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候尝试在get方法执行完成时获取网页源代码可能并非浏览器完全加载完成的页面。所以,这种情况下需要设置延时等待一定时间,确保全部节点都加载出来。
三种方式:强制等待、隐式等待和显式等待

5.1 强制等待

就很简单了,直接time.sleep(n)强制等待n秒,在执行get方法之后执行。

5.2 隐式等待

implicitly_wait()设置等待时间,如果到时间有元素节点没有加载出来,就会抛出异常。

5.3 显式等待

设置一个等待时间和一个条件,在规定时间内,每隔一段时间查看下条件是否成立,如果成立那么程序就继续执行,否则就抛出一个超时异常。

WebDriverWait的参数说明WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver: 浏览器驱动

timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)

poll_frequency: 每次检测的间隔时间,默认是0.5秒

ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常

until(method,message=‘’)

method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False

message: 如果超时,抛出TimeoutException,将message传入异常

until_not(method,message=‘’): 与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。

from selenium.webdriver.support import expected_conditions as EC
# 判断标题是否和预期的一致
title_is
# 判断标题中是否包含预期的字符串
title_contains
# 判断指定元素是否加载出来
presence_of_element_located
# 判断所有元素是否加载完成
presence_of_all_elements_located
# 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0,传入参数是元组类型的locator
visibility_of_element_located
# 判断元素是否可见,传入参数是定位后的元素WebElement
visibility_of
# 判断某个元素是否不可见,或是否不存在于DOM树
invisibility_of_element_located
# 判断元素的 text 是否包含预期字符串
text_to_be_present_in_element
# 判断元素的 value 是否包含预期字符串
text_to_be_present_in_element_value
#判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it
#判断是否有alert出现
alert_is_present
#判断元素是否可点击
element_to_be_clickable
# 判断元素是否被选中,一般用在下拉列表,传入WebElement对象
element_to_be_selected
# 判断元素是否被选中
element_located_to_be_selected
# 判断元素的选中状态是否和预期一致,传入参数:定位后的元素,相等返回True,否则返回False
element_selection_state_to_be
# 判断元素的选中状态是否和预期一致,传入参数:元素的定位,相等返回True,否则返回False
element_located_selection_state_to_be
#判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
staleness_of

6.切换操作

6.1 窗口切换

在 selenium 操作页面的时候,可能会因为点击某个链接而跳转到一个新的页面(打开了一个新标签页),这时候 selenium 实际还是处于上一个页面的,需要我们进行切换才能够定位最新页面上的元素。

窗口切换需要使用 switch_to.windows() 方法。

首先我们先看看下面的代码。

上面代码在点击跳转后,使用 switch_to 切换窗口,window_handles 返回的 handle 列表是按照页面出现时间进行排序的,最新打开的页面肯定是最后一个,这样用 driver.window_handles[-1] + switch_to 即可跳转到最新打开的页面了。

那如果打开的窗口有多个,如何跳转到之前打开的窗口,如果确实有这个需求,那么打开窗口是就需要记录每一个窗口的 key(别名) 与 value(handle),保存到字典中,后续根据 key 来取 handle 。

6.2 表单切换

很多页面也会用带 frame/iframe 表单嵌套,对于这种内嵌的页面 selenium 是无法直接定位的,需要使用 switch_to.frame() 方法将当前操作的对象切换成 frame/iframe 内嵌的页面。

switch_to.frame() 默认可以用的 id 或 name 属性直接定位,但如果 iframe 没有 id 或 name ,这时就需要使用 xpath 进行定位。下面先写一个包含 iframe 的页面做测试用。

7. 对Cookie操作

cookies 是识别用户登录与否的关键,爬虫中常常使用 selenium + requests 实现 cookie持久化,即先用 selenium 模拟登陆获取 cookie ,再通过 requests 携带 cookie 进行请求。

webdriver 提供 cookies 的几种操作:读取、添加删除。

get_cookies:以字典的形式返回当前会话中可见的 cookie 信息。
get_cookie(name):返回 cookie 字典中
key == name 的 cookie 信息
add_cookie(cookie_dict):将 cookie 添加到当前会话中
delete_cookie(name):删除指定名称的单个 cookie
delete_all_cookies():删除会话范围内的所有cookie

from selenium import webdriver
browser = webdriver.Chrome()
# 知乎发现页
browser.get('https://www.zhihu.com/explore')
# 获取cookie
print(f'Cookies的值:{browser.get_cookies()}')
# 添加cookie
browser.add_cookie({'name':'才哥', 'value':'帅哥'})
print(f'添加后Cookies的值:{browser.get_cookies()}')
# 删除cookie
browser.delete_all_cookies()
print(f'删除后Cookies的值:{browser.get_cookies()}')
# 总结

三、高级用法

1.execute_script方法

比如下拉进度条,模拟javaScript,使用execute_script方法来实现。

1.1 判断元素是否存在

def is_element_exist(browser,xpath):try:element=browser.find_element(by=By.XPATH,value=xpath)flag=Trueexcept:flag=Falsereturn flag

1.2 滑动滚轮到页面底端

temp_height=0
x=1000
y=1000
while True:js="var q=document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop={}".format(x)browser.excute_script(js)time.sleep(0.5)x+=ycheck_height=browser.excute_script("return document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop;")if check_height=temp_height:breaktemp_height=check_height

1.3 滑动滚轮至页面元素出现

将上面两者结合,就可以实现。

temp_height=0
x=1000
y=1000
while True:js="var q=document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop={}".format(x)browser.excute_script(js)time.sleep(0.5)x+=ycheck_height=browser.excute_script("return document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop;")if check_height=temp_height:breaktemp_height=check_height

1.4 滑动至动态元素可见

当我们需要定位的元素是动态元素,或者我们不确定它在哪时,可以先找到这个元素然后再使用JS操作

target = driver.find_element_by_id('id')driver.execute_script("arguments[0].scrollIntoView();", target)

2.xpath方法

XPath是一门在XML文档中查找信息的语言,被用于在XML文档中通过元素和属性进行导航。有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
XPath路径表达式

表达式描述
nodename选取此节点的所有子节点(div)
/从根节点选取
//选择任意位置的某个节点
.选取当前节点
选取当前节点的父节点
@选取属性

XPath语法通配符

通配符描述
*匹配任何元素节点
@*匹配任何属性节点
node()匹配任何类型节点

2.1 文本定位

使用text()元素的text内容 如://button[text()=“登录”]

2.2 模糊定位

使用contains() 包含函数 如://button[contains(text(),“登录”)]、//button[contains(@class,“btn”)]
匹配以xx结尾的属性值 如://input[starts-with(@id,“login-”)]、//input[ends-with(@id,“ogin-email”)]

2.3 逻辑定位

使用逻辑运算符 – and、or;如://input[@name=“phone” and @datatype=“m”] 可以根据一个元素的多个属性进行定位,确保唯一性

2.4 轴定位

轴定位是根据父节点,兄弟节点等节点来定位本节点,使用语法: 轴名称 :: 节点名称,使用较多场景:页面显示为一个表格样式的数据列

描述表达式
定位当前节点后的所有节点//标签名[@属性=属性值]/follow::标签名[@属性=属性值]
定位同一节点后的所有同级节点//标签名[@属性=属性值]/follow-sibling::标签名[@属性=属性值]
定位当前节点的所有子节点//标签名[@属性=属性值]/child::标签名[@属性=属性值]
定位当前节点前的所有节点//标签名[@属性=属性值]/preceding::标签名[@属性=属性值]
定位同一个节点前的所有同级节点//标签名[@属性=属性值]/preceding-sibling::标签名[@属性=属性值]
定位当前节点的所有父节点//标签名[@属性=属性值]/parent::标签名[@属性=属性值]
定位当前节点的所有祖父节点//标签名[@属性=属性值]/ancestor::标签名[@属性=属性值]
xpath='//span[text()=''/ancestor::div[3]/check-box]'
element=browser.find_element(by=By.XPATH,value=xpath)

总结

selenium的基础用法已经介绍完了,让我们实际操作起来吧,有什么问题欢迎在评论区留言,希望大家能够点赞收藏!!!


参考

selenium用法详解【从入门到实战】
selenium的基本操作——入门级(快速上手)
2 万字带你了解 Selenium 全攻略

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

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

相关文章

测评Copilot和ChatGPT-4o从PDF创建PPT功能

关于 Copilot 由 PDF 创建 PPT,之前已经发过几篇文档说明: Copilot for Microsoft 365 现已支持从PDF创建Word和PPT Copilot读PDF文献一键生成PPT,吓傻了导师 Copilot一键将PDF转为PPT,治好了我的精神内耗 今天来测评对比 Cop…

在LabVIEW中使用Modbus

NI 提供了三种主要机制与 Modbus 设备进行接口:(1) 高级 OPC 服务器,(2) Modbus I/O 服务器,以及 (3) 在 NI LabVIEW 软件中通过 LabVIEW 实时或 LabVIEW 数据记录与监控控制(DSC)模块引入的低级 Modbus API。 LabVIE…

黑马Java零基础视频教程精华部分_8_学生管理系统

系列文章目录 文章目录 系列文章目录一、业务分析二、结合业务流程图编写代码1、Student.java代码:2、StudentSystem.java代码:3、标号(‌label)‌ 三、学生管理系统升级版 一、业务分析 需求文档如图所示: 根据需求…

【初阶数据结构篇】单链表的实现(赋源码)

文章目录 单链表的实现代码位置概念与结构概念:结构: 链表的性质链表的分类单链表的实现单链表的创建和打印及销毁单链表的创建单链表的打印单链表的销毁 单链表的插入单链表头插单链表尾插单链表在指定位置之前插入数据单链表在指定位置之后插入数据 单…

SAP MM学习笔记47 - 实地棚卸(库存盘点)

上一章讲了SAP MM模块种的出力管理(消息管理)。 SAP MM学习笔记46 - 购买中的出力管理(消息管理)-CSDN博客 本章讲库存盘点的相关内容。 - 库存盘点分3步走:实地棚卸票登录,检数入力,差异分析及转记 - SAP中还提供了…

学习笔记 韩顺平 零基础30天学会Java(2024.7.22)

P407 接口使用细节2 P407 接口课堂练习 对于最后一个的输出:B因为实现了A的接口,所以和继承一样,B可以访问A的变量 P409 接口VS继承 接口对单继承机制(是指只能继承一个类)进行了补充 也可以理解为,子类通过…

24种设计模式介绍与6大设计原则(电子版教程)

前言 您是一个初级的 coder,可以从中领会到怎么设计一段优秀的代码;您是一个高级程序员,可以从中全面了解到设计模式以及 Java 的边角技术的使用;您是一个顶级的系统分析师,可以从中获得共鸣,寻找到项目公共问题的解决…

安全哈希算法:SHA算法

🎯 主题简介 SHA(Secure Hash Algorithm)是比MD5更安全的哈希算法。通过案例形式了解SHA算法的原理、实现方法及注意细节。无论你是Python爱好者还是JavaScript高手,这篇内容都将为你提供一个深入了解SHA算法的机会。 &#x1f…

Spring Boot集成screw实现数据库文档生成

1.什么是screw? 在企业级开发中、我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有、要么有、但都是手写、后期运维开发,需要手动进行维护到文档中&…

免费【2024】springboot 成都奥科厨具厂产品在线销售系统设计与实现

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

【期末考试复习】学术英语阅读

文章目录 前言1. 一篇学术论文的组成部分2. this unit2.1 Unit 1 标题第一类:陈述句结构(Declarative Sentence Structure)第二类:名词群结构(Nominal Group Construction)第三类:复合结构&…

面向切面编程(AOP)

通知类型 Grep Console插件可右键选中日志高亮显示 正常情况 异常情况(around after和目标方法在一起,目标方法异常后,around after不执行) 通知顺序 execution 需要匹配两个没有任意交集的方法时,可以使用两个execution annotation 自定义…

面试 SQL整理 常见的SQL面试题:大厂经典60题(一)

目录 SQL基础知识整理: 数据库基础知识 为什么要使用数据库 数据保存在内存 数据保存在文件 数据保存在数据库 什么是SQL? 什么是MySQL? 数据库三大范式是什么 mysql有关权限的表都有哪几个 MySQL的binlog有有几种录入格式?分别有什么区别&…

搭建自己的金融数据源和量化分析平台(一):系统架构设计

0x00 前言 由于某得的数据实在是太贵,某花顺免费版又不提供专业的数据分析工具,Tushare也开始收费,因此决定基于python和MySQL搭建一个自己的金融数据库。期望做到仅依靠交易所、巨潮资讯网等官方的公开数据实现,尽量不依靠某花顺…

绿联UGOS Pro系统虚拟机部署Windows 11详细教程(跳账户登录,安装内存驱动)

绿联UGOS Pro系统虚拟机部署Windows 11详细教程(跳账户登录,安装内存驱动) 哈喽小伙伴们好,我是Stark-C~ 自从绿联更新UGOS Pro系统之后,简直犹如脱胎换骨般,为大家带来了前所未有的全新体验,…

基于单片机控制的红外热释电家庭防盗报警器硬件系统设计

【摘要】 随着社会的发展和人们安全意识的提高,传统的家庭防盗系统不能适应现代生活中多变的环境。本文设计开发的红外热释电家庭防盗报警器能改善传统防盗系统结构复杂,计算繁琐、价格昂贵、监控盲区等缺陷,主要由单片机模块、复位电路模块、…

在vue中优雅地异步引入(懒加载)腾讯地图API

背景 接到一个需求需要在网站首页显示使用腾讯地图展示公司所在地。一开始我直接全局引入了腾讯地图js,结果发现在用户打开登陆页面的时候首页比较缓慢,为了提高用户登陆的加载效率,需要优化为异步引入。 思路 根据官网的示例,…

MyCat 分片

更多内容,前往IT-BLOG 如今随着互联网的发展,数据的量级也是呈指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它…

BACnet物联网关BL103:Modbus协议转BACnet/MSTP

随着物联网技术在楼宇自动化与暖通控制系统中的迅猛发展,构建一种既经济高效又高度可靠的协议转换物联网关成为了不可或缺的核心硬件组件。在此背景下,我们钡铼特别推荐一款主流的BAS(楼宇自动化系统)与BACnet物联网关——BL103&a…