selenium合集
环境搭建步骤
-
安装selenium
pip install selenium -
安装浏览器
-
安装浏览器驱动
谷歌浏览器:chromdriver.exe
ie浏览器:ieserverdriver.exe
FireFox浏览器:geckodriver.exe
特别注意⚠️:下载驱动版本必须与浏览器版本一致下载地址
-
淘宝镜像:https://npmmirror.com/chromedriver
-
https://chromedriver.storage.googleapis.com/index.html
-
火狐driver:https://github.com/mozilla/geckodriver/releases
-
ie driver:https://seleniumrelease.storage.googleapis.com/index.html
chromedriver.exe文件放置在python安装路径(python.exe所在路径)
mac环境下搭建selenium参考:https://www.cnblogs.com/hq0202/p/16273590.html
chrome 131版本驱动下载地址:https://googlechromelabs.github.io/chrome-for-testing/#stable
浏览器常用操作
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#浏览器最大化
driver.maximize_window()
#最小化
driver.minimize_window()
#指定窗口大小
driver.set_window_size(2000,800)
#浏览器前后退
driver.forward()
driver.back()#浏览器标题及url,获取页面资源(断言)
print(driver.title,driver,current_url,driver.page_source)#截图
driver.get_screenshot_as_file("保存图片路径")#浏览器
driver.close()
driver.quit()
元素定位
driver.find_element_by_id()#通过id定位
driver.find_element_by_name()#通过name定位
driver.find_element_by_tag_name()#通过html标签定位,一般情况下不使用这个
driver.find_element_by_link_text()#通过链接文本定位,就是超链接的文本内容
driver.find_element_by_partial_link_text()#通过部分链接文本定位
driver.find_element_by_class_name()#通过类名定位
返回元素列表[]
driver.find_elements_by_partial_link_text()
driver.find_elements_by_id()#通过id定位
driver.find_elements_by_name()#通过name定位
driver.find_elements_by_class_name()#通过类名定位
driver.find_elements_by_tag_name()#通过html标签定位
xpath定位
绝对路径定位
使用浏览器右键复制绝对路径
绝对路径定位一般不要用,要考虑元素的稳定性
相对路径定位
//开头
- 标签+索引定位
//form/span[1]/input - 唯一定位标签+单个属性
//form[@id=‘form’]/span[1]/input[@id=‘kw’] - 唯一定位标签+多个属性
多个属性使用and
//form[@id=‘form’ and @name=‘f’]/span[1]/input - 标签+部分属性定位
//form/span[1]/input[substring(@class,3)=‘ipt’]
//form/span[1]/input[contains(@class,‘ipt’)]
//input[starts-with(@id,‘k’)] - 通过文本定位
//a[text()=‘新闻’]
实例
路径表达式 | 结果 |
---|---|
bookstore | 选取 bookstore 元素的所有子节点 |
/bookstore | 选取根元素 bookstore。 |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素。 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//@lang | 选取名为 lang 的所有属性。 |
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()< 3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素 |
//title[@lang=‘eng’] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
chrome开发者工具定位元素:
在console中进行调试:
$x 可以通过xpath表达式进行定位
$$ 可以通过css选择器进行定位
调试常用操作:
修改元素的属性:$x(“xx”)[0].attr=“”
点击某个元素: $$(“xxx”)[0].click()
css定位
- 通过绝对路径定位,一般不用
driver.find_element_by_css_selector(“”) - 通过id定位
driver.find_element_by_css_selector(“#kw”) - 通过class定位
driver.find_element_by_css_selector(“.s_ipt”) - 通过属性定位
driver.find_element_by_css_selector(“[autocompplete=‘off’]”)
driver.find_element_by_css_selector(“[autocompplete=‘off’][class=‘s_ipt’]”) - 通过标签定位 标签名+属性/id/class定位
driver.find_element_by_css_selector(“input#kw”)
driver.find_element_by_css_selector(“input.s_ipt”)
driver.find_element_by_css_selector(“input[autocompplete=‘off’]”) - 通过层级定位 层级之间通过>或者空格隔开
driver.find_element_by_css_selector(“form>span>input”) - 通过兄弟节点定位
场景:同一个元素下面有多个相同的元素
第一个元素标签:first-child
第n个元素标签:nth-child(n)
最后元素标签:last-child
driver.find_element_by_css_selector(“div#s-top-left>a:first-child”)
1.定位元素名为tag的元素:tag 对应于xpath ://tag
2.属性限制表达式
- 拥有attr属性的任意元素 [attr] ----对应于xpath : //*[@attr]
- 拥有attr属性的tag元素。tag[attr] ---- 对应于xpath: //tag[@attr]
- attr=value [attr=value]---- 对应于xpath: //*[@attr=‘value’]
- css没有用元素内容进行定位的选择器 xpath://tag[text()=“元素内容”]
例子 | 描述 |
---|---|
.intro | 选择class=intro的所有元素 |
#firstname | 选择id=firstname的所有元素 |
* | 选择所有元素 |
p | 选择所有 元素 |
div,p | 选择所有 和 的所有元素 |
div p | 选择所有 元素内部的所有 元素 |
div>p | 选择父元素为 元素的所有 元素 |
div+p | 选择紧接在 元素之后的所有 元素 |
[target] | 选择带有target属性所有元素 |
[target=_blank] | 选择targer=“_blank"的所有元素 |
p:nth-child(2) | 选择属于其父元素的第二个子元素的每个 元素 |
支持所有定位方式
from selenium.webdriver.common.by import By
driver.find_element(By.xpath,“xx”)
元素的常用操作
四大操作:
- 点击 click()
- 输入 send_keys()
- 获取文本 text
- 获取属性 get_attribute()
等待方式
直接等待
缺点:
- 使用死板,难以衡量具体等待时间,有时间等待也解决不了问题
解决方案:在报错元素操作之前添加等待
原理:强制等待,线程休眠一段时间
隐式等待
隐式等待只能解决元素查找问题,不能解决元素交互问题
问题:难以确定元素加载的具体时间
原理:设置一个等待时间,轮询查找元素是否出现,如果没有出现就抛出异常
隐式等待无法解决的问题
- 元素可以找到,使用点击等操作,出现报错
- 原因:
- 页面元素加载是异步加载过程,通常会html先加载完成,js,css其后
- 元素存在与否是由html决定,元素的交互是由css或js决定
- 隐式等待只关注元素能否找到,不关注元素能否点击或者进行其他的交互
- 解决方案:使用显示等待
显示等待
WebDriverWait(driver实例, 最长等待时间, 轮询时间).until(结束条件)
原理:在最长等待时间内,轮询,是否满足结束条件
多窗口处理
- 先获取到当前窗口句柄(driver.current_window_handle)
- 再获取到所有的窗口句柄(driver.window_handles)最早打开的窗口在列表最前面
- 判断是否想要操作的窗口,如果是,就可以对窗口进行操作;如果不是就跳转到另一个窗口(driver.switch_to_window);
driver.switch_to_window(win[-1])//切换至最后一个窗口
相关文章:
selenium合集
环境搭建步骤 安装selenium pip install selenium 安装浏览器 安装浏览器驱动 谷歌浏览器:chromdriver.exe ie浏览器:ieserverdriver.exe FireFox浏览器:geckodriver.exe 特别注意⚠️:下载驱动版本必须与浏览器版本一致 下载地址 淘宝镜像࿱…...
# Java 发送电子邮件示例
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...
数据结构-单链表
文章目录 一、单链表的概念及结构1.链表的概念2.链表的节点结构3.单链表增删查改操作的实现 一、单链表的概念及结构 1.链表的概念 🍉🍉概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中…...
软件工程期末整理(二)
快速原型开发模型是(适用于客户需求难以清楚定义、规模较小的系统)。(编写系统实施计划)不是系统设计阶段的主要活动 解释:系统实施计划”更侧重于后续的实施与部署阶段,属于项目管理层面的内容 协作性不属于构件的特性在类图中…...
【Python】基于blind-watermark库添加图片盲水印
blind-watermark 是一个用于在图像中添加和提取盲水印的 Python 库。盲水印是一种嵌入信息(如水印)到图像中的方法,使得水印在视觉上不可见,但在需要时可以通过特定的算法进行提取。以下是如何使用 blind-watermark 库来添加和提取…...
GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程
大家好,今天给大家介绍一下:GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程。 文章目录 一、GPU算力平台概述人工智能智能发展为什么需要GPU算力平台 二、注册与登录账号注册流程 三、平台的应用之Anydoor应用启动器选择Anydoor的应用场景Anydoo…...
Django:构建高效Web应用的强大框架
在当今快速发展的Web开发领域,选择一个合适的框架对于项目的成功至关重要。Django,作为Python编程语言中最受欢迎的Web框架之一,凭借其强大的功能、高度的可扩展性和简洁的语法,成为了众多开发者心中的首选。本文将深入探讨Django…...
前端-计算机网络篇
一.网络分类 1.按照网络的作用范围进行分类 (1)广域网WAN(Wide Area Network) 广域网的作用范围通常为几十到几千公里,因而有时也称为远程网(long haul network)。广域网是互联网的核心部分,其任务是长距离运送主机…...
Mybatis-plus
一、简介 MyBatis-Plus(简称MP)是一个MyBatis的增强工具,它在MyBatis的基础上只做增强而不做改变,目的是简化开发、提高效率。MyBatis-Plus提供了许多便捷的功能,如强大的CRUD操作、支持多种主键策略、内置代码生成器…...
跨年烟花C++代码
嘿,朋友们!今天来给大家讲讲一段挺有意思的C代码呀,这段代码主要是用来实现一个烟花效果展示的程序哦,下面咱们一点点来看哈。 效果 1. 开头包含的那些头文件 #include <graphics.h> #include <conio.h> #include &…...
第82期 | GPTSecurity周报
GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…...
关于FPGA中添加FIR IP核(采用了GOWIN EDA)
文章目录 前言一、IP核二、MATLAB文件三、导出系数COE文件1.设计滤波器2.用官方的matlab代码或者直接用文本文件 四、进行模块化设计源文件 前言 FIR滤波器的特点是其输出信号是输入信号的加权和,权值由滤波器的系数决定。每个系数代表了滤波器在特定延迟位置上的“…...
基于机器学习的京东手机商品评论数据可视化分析系统
完整源码项目包获取→点击文章末尾名片!...
jenkins入门13--pipeline
Jenkins-pipeline(1)-基础 为什么要使用pipeline 代码:pipeline 以代码的形式实现,通过被捡入源代码控制, 使团队能够编译,审查和迭代其cd流程 可连续性:jenkins 重启 或者中断后都不会影响pipeline job 停顿&#x…...
Ubuntu24.04.1 LTS+Win11双系统安装记录
Win11相关 1.用DiskGenius删除硬盘分区 2.关闭win11的BitLocker,否则禁用安全启动后开机时需要帐户密钥,很麻烦。 3.在设备管理器中找到独立显卡,右键禁用。等ubuntu装好显卡驱动后,再进入win启用。 Ubuntu相关 1.Ubuntu24.04在…...
【前端开发常用网站汇总-01】
1、仿mac界面代码截图 https://codeimg.io/?utm_sourceappinn.com 2、可视化大屏汇总(在线Demo) https://www.xiongze.net/viewdata/index.html 3、在线Photoshop(实现简单P图) https://ps.gaoding.com/#/ 4、在线生成ico图标(png转icon文件) https://www.bitbug.net/in…...
【Rust自学】10.6. 生命周期 Pt.2:生命周期的语法与例子
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 10.6.1. 生命周期标注语法 生命周期的标注并不会改变引用的生命周期长度。如果某个函数它制定了泛型生命周期参数,那么它就可…...
Three.js教程014:使用tween实现补间动画
补间动画tween 补间动画(Tween Animation)是一种通过平滑过渡的方式,在一段时间内将对象的属性从一个状态变换到另一个状态的动画技术。Three.js 中可以使用 tween.js 来实现补间动画。 【1】导入补间动画库 // 导入tween import * as TWEEN from "three/examples/j…...
Mac软件介绍之录屏软件Filmage Screen
软件介绍 Filmage Screen 是一款专业的视频录制和编辑软件,适用于 Mac 系统 可以选择4k 60fps,可以选择录制电脑屏幕,摄像头录制,可以选择区域录制。同时也支持,简单的视频剪辑。 可以同时录制电脑麦克风声音 标准…...
MySQL使用navicat新增触发器
找到要新增触发器的表,然后点击设计,找到触发器标签。 根据实际需要,填写相关内容,操作完毕,点击保存按钮。 在右侧的预览界面,可以看到新生成的触发器脚本...
深入理解 DOM:构建动态 Web 页面的基石
在 Web 开发的世界里,DOM (Document Object Model) 就像一位无声的英雄,默默地支撑着我们每天浏览的各种动态网页。你可能每天都在和它打交道,却未必真正了解它。那么,DOM 到底是什么?它为什么如此重要?让我…...
如何构建多层决策树
构建一颗多层的决策树时,通过递归选择最佳划分特征(依据 信息增益 或 基尼系数)对数据集进行划分,直到满足停止条件(例如叶节点纯度达到要求或树的深度限制)。以下是基于 信息增益 和 基尼系数 的递推公式和…...
人工智能 前馈神经网络练习题
为了构建一个有两个输入( X 1 X_1 X1、 X 2 X_2 X2)和一个输出的单层感知器,并进行分类,我们需要计算权值 w 1 w_1 w1和 w 2 w_2 w2的更新过程。以下是详细的步骤和计算过程: 初始化参数 初始权值:…...
stable diffusion安装mov2mov
第一步: 下载mov2mov,地址:https://gitcode.com/gh_mirrors/sd/sd-webui-mov2mov 下载包到web-ui的sd-webui-aki-v4.10\extensions文件夹面解压 第二步:在文件夹中调出cmd窗口,执行下列命令, git restore…...
人工智能学习框架概述
1. 引言 随着人工智能(AI)技术的快速发展,各种学习框架应运而生,为研究人员和开发者提供了便利。这些框架不仅简化了复杂的算法实现,还提供了用于构建、训练和评估模型的工具和环境。本文将对目前流行的人工智能学习框…...
(二)WebGL的渲染管线初识
WebGL的渲染管线可以被看作是将一组数据(例如模型、纹理、颜色等)经过一系列处理阶段,最终生成图像并显示在屏幕上的过程。为了帮助你理解这一过程,我将通过一个通俗易懂的移动例子来一步步详细讲解WebGL 的渲染管线及其关键绘制原…...
1. 使用springboot做一个音乐播放器软件项目【前期规划】
背景: 现在大部分音乐软件都是要冲会员才可以无限常听的。对于喜欢听音乐的小伙伴,资金又比较紧张,是那么的不友好。作为程序员的我,也是喜欢听着歌,敲着代码。 最近就想做一个音乐播放器的软件,在内网中使…...
在macOS上安装MySQL
macOS的MySQL有多种不同的形式: 1、本机包安装程序,它使用本机macOS安装程序(DMG)引导您完成MySQL的安装。有关详细信息,请参阅第2.4.2节,“使用本机包在macOS上安装MySQL”。您可以将包安装程序与macOS一…...
使用vue项目中,使用webpack模板和直接用vue.config来配置相关插件 区别是什么,具体有哪些提现呢
在 Vue 项目中,使用 Webpack 模板 和 vue.config.js 来配置相关插件的主要区别在于配置的复杂度、灵活性和易用性。以下是两者的详细对比: 1. Webpack 模板 Webpack 模板是 Vue CLI 早期版本(如 Vue CLI 2.x)中提供的项目初始化模…...
ansible-性能优化
一. 简述: 搞过运维自动化工具的人,肯定会发现很多运维伙伴们经常用saltstack和ansible做比较,单从执行效率上来说,ansible确实比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息队列[暂没深入了解]),但其实…...
Nginx:认证与授权
认证(Authentication)和授权(Authorization)是确保 Web 应用安全的重要机制。Nginx 提供了多种方式来实现这些功能,以保护资源免受未授权访问。 认证(Authentication):验证用户的身份,确认请求来自合法用户。通常涉及用户名和密码、令牌或其他形式的身份验证。授权(A…...
【项目实战1】五子棋游戏
目录 C语言编程实现五子棋:: game.h game.c 1.打印菜单 2.打印棋盘 3.玩家下棋 4.判断五子连珠 5.判断输赢 6.游戏运行 game.c完整源代码展示 test.c C语言编程实现五子棋:: game.h #pragma once #include<stdio.h> …...
【VUE】a链接下载跨域文件直接打开而非下载(解决办法)
背景:a链接下载跨域文件时,浏览器默认会打开文件,而非直接下载 <a :href"url" :download"fileName">下载</a>data() {return {url: http://xxxxx.mp4,fileName: xxxxx.mp4} }解决方式 服务器设置HTTP请求头…...
消息队列RabbitMQ
目录 为什么需要消息队列? 什么是消息队列? 如何技术选型? WorkQueues模型 Fanout交换机 Direct交换机 Topic交换机 声明队列交换机 消息转换器 消息可靠性问题 1.发送者的可靠性 生产者重连 生产者确认 Spring AMQP生产者消费确认…...
Windows11环境下设置MySQL8字符集utf8mb4_unicode_ci
1.关闭MySQL8的服务CTRLshiftESC,找到MySQL关闭服务即可 2.找到配置文件路径(msi版本默认) C:\ProgramData\MySQL\MySQL Server 8.0 3.使用管理员权限编辑my.ini文件并保存 # Other default tuning values # MySQL Server Instance Config…...
css出现边框
前言 正常情况下,开启 contenteditable 属性后会出现 “黑色边框”。 如下图所示,很影响美观: 您可能想去掉它,就像下面这样: 解决方案 通过选择器,将 focus 聚焦时移除 outline 属性即可。 如下代码所示&a…...
Qt QDockWidget详解以及例程
Qt QDockWidget详解以及例程 引言一、基本用法二、深入了解2.1 窗口功能相关2.2 停靠区域限制2.3 在主窗体布局 引言 QDockWidget类提供了一个可以停靠在QMainWindow内的小窗口 (理论上可以在QMainWindow中任意排列),也可以作为QMainWindow上的顶级窗口浮动 (类似一…...
node.js内置模块之---stream 模块
stream 模块的作用 在 Node.js 中,stream 模块是一个用于处理流(stream)的核心模块。流是一种处理数据的抽象方式,允许程序处理大量数据时不会一次性将所有数据加载到内存中,从而提高性能和内存效率。通过流࿰…...
EdgeX规则引擎eKuiper
EdgeX 规则引擎eKuiper 一、架构设计 LF Edge eKuiper 是物联网数据分析和流式计算引擎。它是一个通用的边缘计算服务或中间件,为资源有限的边缘网关或设备而设计。 eKuiper 采用 Go 语言编写,其架构如下图所示: eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源…...
SpringBoot | 基于 MyBatis 的分页与模糊查询的开发模板
关注:CodingTechWork 引言 在开发 Web 应用时,常常需要处理复杂的查询需求,尤其是在涉及到用户管理功能时,分页查询和模糊查询是常见的需求之一。 本文将通过一个具体的示例,展示如何使用 MyBatis实现分页和模糊查…...
数据库(3)--针对列的CRUD操作
1.Create 新增 语法: insert into 表名 (列名)values (列)... 创建一个学生表用于演示: create table if not exists student( id bigint comment 编号, name varchar(20) comment 姓名 ); 1.1直接增加…...
利用Java爬取1688商品详情API接口:技术与应用指南
引言 1688作为中国领先的B2B电子商务平台,拥有海量的商品信息。对于商家和市场研究人员来说,能够从1688获取商品详情信息,对于市场分析、竞品研究等具有重要价值。本文将详细介绍如何使用Java编写爬虫程序,以合法、高效的方式获取…...
安装vue脚手架出现的一系列问题
安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一:可以使用管理员权限进行安装。方法二:更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发,今日着手准备开发一个新的 vue 项目时,在…...
git命令收集
强制丢弃所有修改,和仓库代码一致 git reset --hard 更新子模块 git submodule update每个子模块 重置到最新节点 git submodule foreach --recursive git reset --hard清除每个子模块未跟踪的文件 git submodule foreach --recursive git clean -fd清理未跟踪的…...
IDEA中Maven依赖包导入失败报红的潜在原因
在上网试了别人的八个问题总结之后依然没有解决: IDEA中Maven依赖包导入失败报红问题总结最有效8种解决方案_idea导入依赖还是报红-CSDN博客https://blog.csdn.net/qq_43705131/article/details/106165960 江郎才尽之后突然想到一个原因:<dep…...
c/c++ 里的进程间通信 , 管道 pipe 编程举例
(1)以下是一个网上的使用 pipe 编程的范例: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h>int main() {int pipefd…...
【Java】JVM内存相关笔记
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。 程序计数器&am…...
[项目实战2]贪吃蛇游戏
目录 贪吃蛇游戏:: 一、游戏效果及功能实现: 1.规则 2.基本功能实现 3.技术要点 …...
PySide6的样式表
PySide6 提供了对 Qt 样式表(Qt Style Sheets,简称 QSS)的支持,这是一种类似于 CSS 的样式表语言,用于自定义 Qt 应用程序的外观。 1. 什么是 Qt 样式表(QSS) Qt 样式表是一种声明性的样式表语…...
计算机网络之---局域网
什么叫局域网 局域网(LAN,Local Area Network) 是指在一个相对较小的区域内,如家庭、办公室、学校、企业等,连接多个计算机和设备的网络。局域网的特点是覆盖范围小、传输速度快、构建成本较低。 局域网的主要特点&…...