【自动化】Python SeleniumUtil 工具 开启开发者模式 自动安装油猴用户脚本等
【自动化】Python SeleniumUtil 工具
【Python】使用Selenium 操作浏览器 自动化测试 记录-CSDN博客文章浏览阅读58次。文章浏览阅读42次。【附件】Selenium chromedriver 驱动及浏览器下载。【附件】Selenium chromedriver 驱动及浏览器下载-CSDN博客。3.安装Chrome浏览器驱动。2.安装 selenium。1.安装python。https://blog.csdn.net/G971005287W/article/details/144557463
【学习记录】浏览器指纹相关学习记录(指纹介绍、获取指纹、修改指纹、随机指纹保护隐私等)-CSDN博客文章浏览阅读762次,点赞18次,收藏7次。可以识别是同一个用户。https://blog.csdn.net/G971005287W/article/details/144528762
【自动化】Python SeleniumUtil 油猴 工具 自动安装用户脚本-CSDN博客文章浏览阅读2次。【自动化】Python SeleniumUtil 工具-CSDN博客。【自动化】Python SeleniumUtil 油猴 工具。【自动化】Python SeleniumUtil 工具。https://blog.csdn.net/G971005287W/article/details/144565736
Python SeleniumUtil
import timefrom selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass SeleniumUtil:class 标签页:@staticmethoddef 切换到新窗口句柄(driver, before_handles, after_handles):# 检查是否有新的窗口句柄出现new_handles = after_handles - before_handlesif new_handles:# 切换到新打开的标签页new_window = new_handles.pop()driver.switch_to.window(new_window)return Trueelse:return False@staticmethoddef 获取所有已知窗口句柄(driver):return set(driver.window_handles)@staticmethoddef 切换到第一个窗口(driver):# 切换到第一个窗口driver.switch_to.window(driver.window_handles[0])@staticmethoddef 切换到当前窗口(driver):# 存储窗口的 IDoriginal_window = driver.current_window_handleprint(original_window)# 检查没有打开其他的窗口assert len(driver.window_handles) == 1class Driver:#初始化浏览器@staticmethoddef 初始化驱动通过Debug模式(驱动路径, debuggerAddress):# 设置Edge选项options = webdriver.ChromeOptions()# options.add_experimental_option('prefs',{"extensions.ui.developer_mode": True,})options.add_experimental_option("debuggerAddress", debuggerAddress)# C:\\chromedriver\\129.0.6656.0\\chromedriver.exeservice = ChromeService(executable_path = 驱动路径)# 创建一个新的Edge浏览器实例,并启用无痕模式driver = webdriver.Chrome(service = service, options = options)return driver# 如果你只需要确认元素存在,但不立即与其交互,那么可以使用 presence_of_element_located。# 如果你需要确保元素不仅存在而且可以安全地被用户交互(如点击),则应使用 element_to_be_clickableclass 页面元素:@staticmethoddef 判断元素是否存在(driver, 标签, 内容, 超时时间):element = SeleniumUtil.页面元素.获取元素(driver, 标签, 内容, 超时时间)if element is not None:return Trueelse:return False@staticmethoddef 点击元素(元素):if 元素 is not None:元素.click()return Trueelse:return False@staticmethoddef get元素(driver, 需要交互, 类型, 值, 超时时间):if 超时时间 is None:超时时间 = 7if 需要交互 is None:需要交互 = Truetry:wait = WebDriverWait(driver, 超时时间)if 需要交互:元素 = wait.until(EC.element_to_be_clickable((类型, 值)))if 元素 is not None:return 元素else:return driver.find_element(类型, 值)else:元素 = wait.until(EC.presence_of_element_located((类型, 值)))if 元素 is not None:return 元素else:return driver.find_element(类型, 值)except Exception as e:try:return driver.find_element(类型, 值)except Exception as e2:time.sleep(0)return None@staticmethoddef get元素ById(driver, id, 需要交互, 超时时间):return SeleniumUtil.页面元素.get元素(driver, 需要交互, By.ID, id, 超时时间)@staticmethoddef get元素By标签及内容(driver, 标签, 内容, 需要交互, 超时时间):return SeleniumUtil.页面元素.get元素(driver, 需要交互, By.XPATH, f"//{标签}[text()='{内容}']", 超时时间)@staticmethoddef get元素ByName属性(driver, name, 需要交互, 超时时间):return SeleniumUtil.页面元素.get元素(driver, 需要交互, By.NAME, name, 超时时间)@staticmethoddef get元素By标签及属性(driver, 标签, 属性, 属性值, 需要交互, 超时时间):return SeleniumUtil.页面元素.get元素(driver, 需要交互, By.CSS_SELECTOR, f'{标签}[{属性}="{属性值}"]', 超时时间)@staticmethoddef get元素By标签及属性立即(driver, 标签, 属性, 属性值, 需要交互, 超时时间):值 = f'{标签}[{属性}="{属性值}"]'print(值)return driver.find_element(By.CSS_SELECTOR, 值)## @staticmethod# def 获取元素通过标签及属性(driver, 标签, 属性, 属性值):# try:# element = driver.find_element(By.CSS_SELECTOR, f'{标签}[{属性}="{属性值}"]')# return element# except Exception as e:# time.sleep(0)# return Noneclass 扩展程序:@staticmethoddef 打开扩展程序页(driver):driver.get('chrome://extensions')@staticmethoddef 查询开发者模式状态(driver):# 打开目标网页SeleniumUtil.扩展程序.打开扩展程序页(driver)# 使用WebDriverWait等待页面加载完成,代替固定等待时间# time.sleep(5)try:wait = WebDriverWait(driver, 5)time.sleep(1)js = """// window.location.href = 'chrome://extensions'//获取开发者模式状态let flag = document.querySelector("body > extensions-manager").shadowRoot.querySelector("#toolbar").shadowRoot.querySelector("#devMode").getAttribute("aria-pressed");if(flag === 'true'){return true;}else{return false;}"""status = driver.execute_script(js)print(f"当前开发者模式状态-{status}")return statusexcept Exception as e:time.sleep(0)@staticmethoddef 切换开发者模式状态(driver):try:wait = WebDriverWait(driver, 7)time.sleep(1)js = """document.querySelector("body > extensions-manager").shadowRoot.querySelector("#toolbar").shadowRoot.querySelector("#devMode").click();return true;"""driver.execute_script(js)except Exception as e:time.sleep(0)@staticmethoddef 打开开发者模式(driver):SeleniumUtil.扩展程序.修改开发者模式状态(driver, True)@staticmethoddef 修改开发者模式状态(driver, flag):# 打开目标网页SeleniumUtil.扩展程序.打开扩展程序页(driver)# 使用WebDriverWait等待页面加载完成,代替固定等待时间from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC开发者模式状态 = SeleniumUtil.扩展程序.查询开发者模式状态(driver)if 开发者模式状态 == flag:time.sleep(0)else:SeleniumUtil.扩展程序.切换开发者模式状态(driver)print(f"修改开发者模式状态-{flag}")
相关文章:
【自动化】Python SeleniumUtil 工具 开启开发者模式 自动安装油猴用户脚本等
【自动化】Python SeleniumUtil 工具 【Python】使用Selenium 操作浏览器 自动化测试 记录-CSDN博客文章浏览阅读58次。文章浏览阅读42次。【附件】Selenium chromedriver 驱动及浏览器下载。【附件】Selenium chromedriver 驱动及浏览器下载-CSDN博客。3.安装Chrome浏览器驱动…...
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
🗺️博客地图 📍方法一、timedatectl 命令 📍方法二、手动链接 /etc/localtime 📍方法三、修改时区变量 在 Linux 系统中,可以通过以下3种方式将系统时区修改为 CST(中国标准时间,GMT8 或称 …...
android:sharedUserId 应用进程声明介绍
背景 adb install 安装系统软件报错,原因是签名不一致,进程改变。 代码分析 AndroidManifest.xml 定义的 android:sharedUserId 应用归属进程不同,从phone切换到system。 初始配置 <manifest xmlns:android="http://schemas.android.com/apk/res/android"c…...
解锁ApplicationContext vs BeanFactory: 谁更具选择性?
目录 一、聚焦源码回顾 (一)源码分析和理解 (二)简短的回顾对比建议 二、ApplicationContext vs BeanFactory特性对比 (一)主要特性总结 (二)直接建议 三、案例简单说明 &am…...
一篇梳理清楚http请求知识点
HTTP请求是Web开发中的重要组成部分,它涉及到客户端和服务器之间的通信。掌握HTTP请求的知识点对于前端开发和后端开发都至关重要。以下是关于HTTP请求的详细梳理,结合代码进行说明。 1. HTTP请求概述 HTTP(超文本传输协议)是一个…...
Kotlin - 协程结构化并发Structured Concurrency
前言 Kotlin的Project Lead,Roman Elizarov的一片文章https://elizarov.medium.com/structured-concurrency-722d765aa952介绍了Structured Concurrency发展的背景。相对Kotlin1.1时代,后来新增的Structured Concurrency理念,也就是我们现在所…...
新版国标GB28181设备端Android版EasyGBD支持国标GB28181-2022,支持语音对讲,支持位置上报,开源在Github
经过近3个月的迭代开发,新版本的国标GB28181设备端EasyGBD安卓Android版终于在昨天发布到Github了,最新的EasyGBD支持了国标GB28181-2022版,还支持了语音对讲、位置上报、本地录像等功能,比原有GB28181-2016版的EasyGBD更加高效、…...
豆包MarsCode测评:编程效率再提升
豆包MarsCode测评:编程效率再提升 本文正在参与豆包MarsCode AI 编程体验家活动 随着人工智能技术的发展,编程的方式也在悄然发生变化。最近,豆包推出的 AI 编程工具 MarsCode 在开发者社区引发了不小的关注。这是一款支持多种主流编程语言…...
二叉树 -- 堆(详解)
目录 1、堆的概念及结构 2、堆的实现(附代码) 2.1、向下调整算法建堆 3、堆的应用(附代码) 3.1、堆排序 3.2、TOP-K问题 1、堆的概念及结构 如果有一个关键码的集合K { k0,k1 ,k2 ,…,k(n-1) },把它的所有元素…...
【Apache Paimon】-- 11 -- Flink 消费 kakfa 写 S3 File
目录 1、项目构建 2、项目新增和修改 2.1 pom.xml 新增依赖 2.2 本地测试或者 flink on k8s 时,新增 S3FileSystemFactory.java 第一步:创建包=org.apache.flink.fs.s3hadoop 第二步:新增 java 类 S3FileSystemFactory 特别注意 (1)本地测试时需要新增以下内容 (…...
SQL MID()
SQL中的MID()函数是一个用于从指定位置开始截取字符串中指定长度的子串的函数。这个函数在数据库查询和数据处理中经常被使用,特别是在需要从较长的文本字段中提取特定信息时。 MID()函数的基本语法是:SELECT MID(column_name, start, length) FROM tab…...
jsp | servlet | spring forEach读取不了对象List
导致这个问题的原因有很多的,这里讲到的只是原因之一 原因 taglib不认识forEach 解决办法 添加<% taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c" %> (我忘写这个东西了哈哈哈)...
【ArcGIS Pro微课1000例】0063:处理无人机数据(空三、生成DOM、DSM、DTM)
使用ArcGIS Pro 正射拼接处理无人机数据流程化工具,不需要额外产品许可的支持,只需要桌面是高级版许可即可支持。ArcGIS Pro处理无人机摄影测量数据主要内容有:空三、生成DOM、DSM、DTM。 文章目录 一、创建映射项目二、提交自由空三三、添加控制点优化四、提交产品生产一、…...
【pytorch】深度学习计算
1 层和块 块由类(class)表示。它的任何子类都必须定义一个将其输入转换为输出的前向传播函数,并且必须存储任何必需的参数。注意,有些块不需要任何参数。最后,为了计算梯度,块必须具有反向传播函数。 1.1…...
详解磁盘IO、网络IO、零拷贝IO、BIO、NIO、AIO、IO多路复用(select、poll、epoll)
1、什么是I/O 在计算机操作系统中,所谓的I/O就是输入(Input)和输出(Output),也可以理解为读(Read)和写(Write),针对不同的对象,I/O模式可以划分为…...
VPN技术-GRE隧道的配置
GRE隧道的配置 1, 在AR1上配置DHCP接口地址池,AR3上配置DHCP全局地址池 2, PC1获取的IP地址为10.10.10.253,PC2获取的IP地址为10.10.30.253 3,通过ip route-static将目的地址为10.10.30.253的流量引入到Tunnel #配…...
【spring-cloud-gateway总结】
文章目录 什么是gateway如何导入gateway依赖路由配置gateway配置断路器导包配置 什么是gateway 在微服务架构中,gateway网关是一个服务,它作为系统的唯一入口点,处理所有的客户端请求,然后将这些请求路由到适当的服务。提供了几个…...
数组相关简单算法
目录 1. 数据结构与算法 2. 数组中涉及的算法 2.1 2.2 数值型数组相关运算 2.3 数组赋值 2.4 数组复制/反转 2.5 数组查找 2.6 排序 1. 数据结构与算法 《数据结构与算法》是大学些许专业的必修或选修课,主要包含两方面知识: (1&#…...
在VBA中结合正则表达式和查找功能给文档添加交叉连接
在VBA中搜索文本有两种方式可用,一种是利用Range.Find对象(更常见的形式可能是Selection.Find,Selection是Range的子类,Selection.Find其实就是特殊的Range.Find),另一种方法是利用正则表达式,但…...
动手学深度学习-多层感知机-7前向传播、反向传播和计算图
目录 前向传播 前向传播计算图 反向传播 训练神经网络 小结 我们已经学习了如何用小批量随机梯度下降训练模型。 然而当实现该算法时,我们只考虑了通过前向传播(forward propagation)所涉及的计算。 在计算梯度时,我们只调用…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
