Python控制浏览器——selenium模块

Python控制浏览器——selenium模块

目录

  • Python控制浏览器——selenium模块
    • 准备工作
      • 【1】安装selenium
      • 【2】安装浏览器驱动
      • 【3】测试驱动(作者是Edge)
    • 导航和操作窗口
      • 导航
      • 返回
      • 前进
      • 刷新
      • 最大化窗口
      • 切换选项卡
    • 查找和操作元素
      • 8种基本By定位方式
        • [1]ID
        • [2]Name
        • [3]Class
        • [4]Tag 定位
        • [5]Link 文字
        • [6]Partial Link 文字
        • [7]XPath
        • [8]CSS 选择器
      • 元素交互
        • 输入内容
        • 清空文字
        • 点击
        • 提交
        • 内容
        • 属性
        • 其他
      • 常用的交互方法可以分为以下两块
        • 从定位到的元素中获取数据
        • 对定位到的元素的操作
    • 模拟鼠标操作
    • 模拟键盘操作
    • 事件监听
    • 拖拽标签并移动
    • 切换框架
    • 执行JS代码
      • 滚动到页面底部
      • 点击元素
      • 输入文本
    • 页面等待
      • 强制等待
      • 显式等待
      • 隐式等待
    • 操作cookie
      • 示例
    • 无头浏览器
      • Edge无头浏览器模式

准备工作

【1】安装selenium

pip install selenium

如果安装慢可以指定用国内源

pip install selenium -i https://mirrors.aliyun.com/pypi/simple/

【2】安装浏览器驱动

Chrome驱动地址:[http://chromedriver.storage.googleapis.com/index.html]

Edge驱动安装地址:[https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/?form=MA13LH]

Firefox驱动安装地址:[https://github.com/mozilla/geckodriver/releases]

安装成功后将插件放入python解释器根目录中

image-20240401193029120

【3】测试驱动(作者是Edge)

from selenium import webdriverbrowser = webdriver.Edge()
browser.get('https://www.baidu.com')
time.sleep(10)
# 如果不睡眠的话selenium会在运行完程序后自动关闭浏览器

image-20240401201006049

注:如果出现浏览器打不开的情况可能需要检查驱动是否与自己浏览器版本相同

导航和操作窗口

导航

get(url)

作用:导航到指定的url

url = 'https://www.baidu.com/'
driver = webdriver.Edge()
driver.get(url=url)

返回

back()

作用:模拟浏览器的后退按钮,返回上一个访问的页面

driver = webdriver.Edge()
driver.back()

前进

forward()

作用:模拟点击浏览器的前进按钮,使浏览器前进到下一个访问过的页面(当使用了 back() 后)

driver = webdriver.Edge()
driver.forward()

刷新

refresh()

作用:刷新当前页面,重新加载页面内容

driver = webdriver.Edge()
driver.refresh()

最大化窗口

maximize_window()

作用:最大化浏览器窗口,使浏览器窗口占据整个屏幕空间

driver = webdriver.Edge()
driver.maximize_window()

切换选项卡

execute_script()

作用:在当前浏览器中打开一个新的选项卡

browser.execute_script('window.open()')

browser.window_handles

作用:获取所有选项卡句柄

switch_to.window

切换选项卡

# 获取所有选项卡的句柄列表
all_handles = browser.window_handles# 切换到第二个选项卡(下标为1)
browser.switch_to.window(all_handles[1])

查找和操作元素

8种基本By定位方式

by 定位需要需要导入 By 类:from selenium.webdriver.common.by import By

[1]ID
  • 通过元素的 ID 属性进行定位
element = bro.find_element(By.ID, 'element_id')
  • 使用 find_element 方法,通过元素的 ID 属性进行定位。
  • 'element_id' 替换为你要查找的元素的实际 ID。
[2]Name
  • 通过元素的 Name 属性进行定位
element = bro.find_element(By.NAME, 'element_name')
  • 使用 find_element 方法,通过元素的 Name 属性进行定位。
  • 'element_name' 替换为你要查找的元素的实际 Name。
[3]Class
  • 通过元素的 Class 属性进行定位
element = bro.find_element(By.CLASS_NAME, 'element_class')
  • 使用 find_element 方法,通过元素的 Class 属性进行定位。
  • 'element_class' 替换为你要查找的元素的实际 Class。
[4]Tag 定位
  • 通过标签名进行定位
elements = bro.find_elements(By.TAG_NAME, 'div')
  • 使用 find_elements 方法,通过标签名进行定位。
  • 'div' 替换为你要查找的具体标签名,如 'a''span'
[5]Link 文字
  • 精确定位
element = bro.find_element(By.LINK_TEXT, 'link_text')
  • 使用 find_element 方法,通过链接文字进行精确定位。
  • 'link_text' 替换为你要查找的链接文字。
[6]Partial Link 文字
  • 模糊定位
element = bro.find_element(By.PARTIAL_LINK_TEXT, 'partial_link_text')
  • 使用 find_element 方法,通过链接文字进行模糊定位。
  • 'partial_link_text' 替换为你要查找的部分链接文字。
[7]XPath
  • XPath 表达式进行定位
element = bro.find_element(By.XPATH, 'xpath_expression')
  • 使用 find_element 方法,通过 XPath 表达式进行定位。
  • 'xpath_expression' 替换为你要使用的实际 XPath 表达式。
[8]CSS 选择器
element = bro.find_element(By.CSS_SELECTOR, 'css_selector')
  • 使用 find_element 方法,通过 CSS 选择器进行定位。
  • 'css_selector' 替换为你要使用的实际 CSS 选择器

元素交互

输入内容

作用:在name为’name’的input标签中输入123

name = driver.find_element(By.NAME, 'name')
name.send_keys("123")
清空文字
name = driver.find_element(By.NAME, 'name')
name.send_keys("123")
name.clear()
点击
element.click()
提交
element.submit()
内容

注:如果是表单内容则提取无效

element.text()
属性

注:获取元素的value值

element.get_attribute()
其他
element.id             #Selenium所使用的内部ID
element.get_property('background') #获取元素的属性的值
element.get_attribute('id') #获取元素的属性的值
element.location       #不滚动获取元素的坐标
element.location_once_scrolled_into_view  #不滚动且底部对齐并获取元素的坐标
element.parent         #父元素
element.send_keys('')  #向元素内输入值
element.size           #大小
element.screenshot('2.png') #截取元素形状并保存为图片
element.tag_name       #标签名
element.is_selected()  #判断元素是否被选中
element.is_enabled()   #判断元素是否可编辑
element.is_displayed   #判断元素是否显示
element.value_of_css_property('color') #获取元素属性的值
element._upload('2.png') #上传文件

常用的交互方法可以分为以下两块

从定位到的元素中获取数据
el.get_attribute(key)           # 获取key属性名对应的属性值
el.text                        	# 获取开闭标签之间的文本内容
对定位到的元素的操作
el.click()                      # 对元素执行点击操作
el.submit()                     # 对元素执行提交操作
el.clear()                      # 清空可输入元素中的数据
el.send_keys(data)              # 向可输入元素输入数据

模拟鼠标操作

以下操作均属于动作链

导入ActionChains类

from selenium.webdriver.common.action_chains import ActionChains

创建一个动作链对象

action = ActionChains(driver)
操作函数
单击click()
右击context_click()
双击double_click()
拖拽double_and_drop()
悬停move_to_element()
执行perform()

示例:

# 找到需要单击的元素
name = driver.find_element(By.NAME, 'name')
# 对该元素单击
action.click(name).perform()

注:鼠标不要放在selenium浏览器中 否则会对操作产生影响

模拟键盘操作

引入Keys类

from selenium.webdriver.common.keys import Keys
操作函数
删除键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)

示例:

# 定位输入框
name = driver.find_element(By.NAME, 'name')
# 输入123
name.send_keys("123")
# 回车
name.send_keys(Keys.ENTER)

事件监听

# 鼠标左键单击
click(on_element=None) # 单击鼠标左键,不松开
click_and_hold(on_element=None) # 单击鼠标右键
context_click(on_element=None)  # 双击鼠标左键
double_click(on_element=None)      # 拖拽到某个元素然后松开
drag_and_drop(source,target)           # 拖拽到某个坐标然后松开
drag_and_drop_by_offset(source,xoffset,yoffset) # 按下键盘上的某个键
key_down(value,element=None)   # 松开键盘上的某个键
key_up(value, element=None)      # 鼠标从当前位置移动到某个坐标
move_by_offset(xoffset, yoffset)  # 鼠标移动到某个元素
move_to_element(to_element)        # 移动到距某个元素(左上角坐标)多少距离的位置
move_to_element_with_offset(to_element, xoffset, yoffset) # 暂停所有输入(指定持续时间以秒为单位)
pause(seconds)        # 执行所有操作
perform()                       # 结束已经存在的操作并重置
reset_actions()         # 在某个元素位置松开鼠标左键
release(on_element=None)       # 发送某个键或者输入文本到当前焦点的元素
send_keys(*keys_to_send)       # 发送某个键到指定元素
send_keys_to_element(element, *keys_to_send) 

示例:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains# 创建一个 Chrome WebDriver 实例
driver = webdriver.Chrome()# 导航到网页
driver.get("http://www.example.com")# 找到需要点击并按住的元素
element = driver.find_element_by_id("element_id")# 创建一个动作链对象
action = ActionChains(driver)# 执行鼠标点击并按住操作
action.click_and_hold(element).perform()

拖拽标签并移动

drag_and_drop(start, target)

作用:在start处元素按住鼠标并拖拽到target元素再松开

# 创建selenium对象
driver = webdriver.Edge()
# 打开网站
driver.get(url=url)
# 创建动作链对象
action = ActionChains(driver)
# 定义起始元素
drag = driver.find_element(By.ID, 'dragger')
# 定义目标元素
item_list = driver.find_elements(By.CLASS_NAME, 'item ')
# 拖拽
action.drag_and_drop(drag, item_list[0]).perform()

切换框架

driver.switch_to.frame 方法用于切换到指定的iframe或frame中

一般用于处理嵌套的框架(frameset)或内嵌框架(iframe)

# 通过name或id切换到指定的frame
driver.switch_to.frame("frame_name_or_id")# 通过索引切换到指定的frame(索引从0开始)
driver.switch_to.frame(0)# 如果需要切回默认的上下文(主文档),可以使用default_content()方法
driver.switch_to.default_content()

执行JS代码

执行js代码的方法:execute_script('js代码')

滚动到页面底部

browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

点击元素

element = browser.find_element(By.ID,'button_id')
browser.execute_script('arguments[0].click();', element)

输入文本

element = browser.find_element(By.ID,'input_id')
text = 'Hello, World!'
browser.execute_script('arguments[0].value = arguments[1];', element, text)

页面等待

强制等待

time.sleep(5)

显式等待

显式等待也称为智能等待,针对指定元素定位指定等待时间

在指定的时间内寻找元素,直至元素出现将其返回

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECfrom selenium import webdriverurl = 'https://www.doyo.com/'
driver = webdriver.Edge()
driver.get(url=url)
# 设置等待时间为10秒
wait = WebDriverWait(driver, 10)
# 等待元素出现
element = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'Title3')))print(element)

隐式等待

driver.implicitly_wait(10)    
# 在指定的n秒内每隔一段时间尝试定位元素,如果n秒结束还未被定位出来则报错

操作cookie

常用的操作cookie方法

# 获得cookie信息
get_cookies()# 添加cookie
add_cookie(cookie_dict)# 删除特定(部分)的cookie
delete_cookie(name)# 删除所有的cookie
delete_all_cookies()

示例

from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开网页
driver.get("https://www.example.com")# 添加cookie
cookie = {'name': 'example_cookie', 'value': '123456'}
driver.add_cookie(cookie)# 获取当前页面所有cookie信息(列表)
cookie_list = driver.get_cookies()# 删除所有cookie
driver.delete_all_cookies()

无头浏览器

  • 无头浏览器可以在后台运行,无需显示界面,适合自动化测试和爬虫等场景
  • 更快速、更稳定,因为不需要渲染页面
  • 消耗资源较少,适合在服务器环境中运行

Edge无头浏览器模式

from selenium import webdriver
# 在这里导入浏览器设置相关的类
from selenium.webdriver.edge.options import Options# 无可视化界面设置 #edge_options = Options()
# 使用无头模式
edge_options.add_argument('--headless')
# 禁用GPU,防止无头模式出现莫名的BUG
edge_options.add_argument('--disable-gpu')# 将参数传给浏览器
browser = webdriver.Edge(options=edge_options)# 启动浏览器
url = "https://baidu.com"
browser.get(url)
print(browser.title)# 关闭浏览器
browser.quit()

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

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

相关文章

关系(二)利用python绘制热图

关系(二)利用python绘制热图 热图 (Heatmap)简介 热图适用于显示多个变量之间的差异,通过颜色判断彼此之间是否存在相关性。 快速绘制 基于seaborn import seaborn as sns import pandas as pd import numpy as np i…

一个 hipsolver 特征值示例

1,原理 通过雅可比旋转,对对称矩阵计算特征值和特征向量; 通过初等正交变换,每次把其中一个非主对角元素消成零,最终只剩主对角线非零元素为特征值,同时把初等变换累积下来,构成特征向量。 2&a…

CAS(Compare And Swap)

目录 CAS概念 乐观锁与悲观锁 ABA问题 Unsafe类 ​编辑 原子类 基本类型原子类 原子引用类 原子数组 原子更新器类 原子累加器 CAS概念 CAS是Compare And Swap的缩写,中文翻译成:比较并交换,实现无锁并发时常用到的一种技术。它一…

element plus的el-image图片发布到nginx不显示

问题&#xff1a; <el-image alt""src"/img/month-b.png" class"card-icon"style"width: 89px;height: 89px;right: -7px;top: -5px;"/> 部署到nginx二级路由访问地址是&#xff1a; http://192.168.1.207/divided/# 这时候使用…

总结jvm中GC机制(垃圾回收)

前言 本篇博客博主将介绍jvm中的GC机制&#xff0c;坐好板凳发车啦~~ 一.GC相关 1.1回收栈内存 对于虚拟机栈&#xff0c;本地方法栈这部分区域而言&#xff0c;其生命周期与相关线程相关&#xff0c;随线程而生&#xff0c;随线程而灭。并且这三个区域的内存分配与回收具有…

OpenHarmony:全流程讲解如何编写ADC平台驱动以及应用程序

ADC&#xff08;Analog to Digital Converter&#xff09;&#xff0c;即模拟-数字转换器&#xff0c;可将模拟信号转换成对应的数字信号&#xff0c;便于存储与计算等操作。除电源线和地线之外&#xff0c;ADC只需要1根线与被测量的设备进行连接。 一、案例简介 该程序是基于…

github本地仓库push到远程仓库

1.从远程仓库clone到本地 2.生成SSH秘钥&#xff0c;为push做准备 在Ubuntu命令行输入一下内容 [rootlocalhost ~]# ssh-keygen -t rsa < 建立密钥对&#xff0c;-t代表类型&#xff0c;有RSA和DSA两种 Generating public/private rsa key pair. Enter file in whi…

Synchronized锁升级过程

无锁-->偏向锁---> 轻量级锁---->重量级锁 ①、从无锁到偏向锁&#xff1a; 当一个线程首次访问同步块时&#xff0c;如果此对象无锁状态且偏向锁未被禁用&#xff0c;JVM 会将该对象头的锁标记改为偏向锁状态&#xff0c;并记录下当前线程的 ID。此时&#xff0c;对…

Java进阶-反射的详解与应用

本文深入探讨了Java反射机制的核心概念、应用实例及其在现代Java开发中的重要性。文章首先介绍了反射的基本原理和能力&#xff0c;包括在运行时动态获取类信息、操作对象字段和方法的能力。随后&#xff0c;通过具体代码示例&#xff0c;展示了如何利用反射进行字段访问、方法…

3.5网安学习第三阶段第五周回顾(个人学习记录使用)

本周重点 ①SSRF服务器端请求伪造 ②序列化和反序列化 ③Vaudit代码审计 本周主要内容 ①SSRF服务器端请求伪造 一、概述 SSRF: server site request forgery (服务器端请求伪造)。 SSR: 服务端请求&#xff0c;A服务器通过函数向B服务器发送请求。 SSRF发生的前提条件…

Linux:入门篇

文章目录 前言1. Linuxd的安装环境2.Linux的简单介绍2.1 新建目录2.2 新建文件 3.指令到底是什么&#xff1f;4.shell命令以及运行原理5.总结 前言 很多人对于Linux的学习总是感觉无法下手&#xff0c;不知道从何开始学习&#xff0c;相信这篇文章将会为你提供一个清晰的思路。…

高精度算法(加、减、乘、除,使用c++实现)

一、概念 在我们进行计算的过程中&#xff0c;经常会遇到几十位&#xff0c;甚至几百位的数字的计算问题&#xff0c;也有可能会遇到小数点后几十位&#xff0c;几百位的情况&#xff0c;而我们面对这样的情况下&#xff0c; 和 的数据范围显然是不够使用的了。因此这时&am…

Node.js-知识点学习总结归纳

Node.js-知识点学习总结归纳 安装nodenode运行方式通过Node.js直接运行js文件&#xff08;也就不用通过网页html了&#xff09;绝对路径调用:相对路径调用&#xff1a;直接运行js命令&#xff1a; Vscode控制台使用node运行js文件 安装node 这个就不用讲了吧&#xff0c;网上搜…

开源知识库平台Raneto--使用Docker部署Raneto

文章目录 一、Raneto介绍1.1 Raneto简介1.2 知识库介绍 二、阿里云环境2.1 环境规划2.2 部署介绍 三、环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Raneto镜像五、部署Raneto知识库平台5.1 创建挂载目录5.2 编辑config.js文件5.3 编…

Sui Basecamp日程公布,两天超50场密集分享等你来参加

随着4月的来临&#xff0c;我们也怀着激动的心情迎来了Sui全球旗舰品牌会议Sui Basecamp的个位数倒计时。 Sui Basecamp将在4月10–11日巴黎区块链周期间举行&#xff0c;Web3构建者、知名企业和信仰者齐聚一堂&#xff0c;在这里共同创造、学习和建立联系。Basecamp将由具有对…

左值与右值,以及c++11的相关特性。

目录 左值 右值 左值引用总结&#xff1a; 右值引用总结&#xff1a; 右值引用使用场景和意义&#xff1a; 1、左值引用的使用场景&#xff1a; 编译器优化1&#xff1a; 2、移动构造与移动赋值&#xff1a; 3、右值引用的使用场景&#xff1a; 编译器优化2&#xff1a…

excel匹配替换脱敏身份证等数据

假如excel sheet1中有脱敏的身份证号码和姓名&#xff0c;如&#xff1a; sheet2中有未脱敏的数据数据 做法如下&#xff1a; 1、在sheet2的C列用公式 LEFT(A2,6)&REPT("*",8)&RIGHT(A2,4) 做出脱敏数据&#xff0c;用来与sheet1的脱敏数据匹配 2、在sheet…

【卫星家族】 | 高分六号卫星影像及获取

1. 卫星简介 高分六号卫星&#xff08;GF-6&#xff09;于2018年6月2日在酒泉卫星发射中心成功发射&#xff0c;是高分专项中的一颗低轨光学遥感卫星&#xff0c;也是我国首颗精准农业观测的高分卫星&#xff0c;具有高分辨率、宽覆盖、高质量成像、高效能成像、国产化率高等特…

Mysql数据库:故障分析与配置优化

目录 前言 一、Mysql逻辑架构图 二、Mysql单实例常见故障 1、无法通过套接字连接到本地MySQL服务器 2、用户rootlocalhost访问被拒绝 3、远程连接数据库时连接很慢 4、无法打开以MYI结尾的索引文件 5、超出最大连接错误数量限制 6、连接过多 7、配置文件/etc/my.cnf权…

python 哔哩哔哩视频去水印

使用python 去除视频中的水印 1. 需要安装的包 pip install moviepy pip install numpy pip install opencv_python pip install tqdm 2. 代码 import cv2 import numpy as np import glob from moviepy.editor import VideoFileClip import os from tqdm import tqdm# 判…