selenium元素定位校验以及遇到的元素操作问题记录
页面元素定位方法及校验
使用比较多的是通过id、class和xpath来对元素进行定位。在定位前可以现在浏览器验证是否可以找到指定的元素。这样就不用每添加一个元素定位都运行代码来检查定位方式表达式是否正确。
-
使用XPATH定位
在浏览器F12,找到元素,在元素区域 Ctrl+F,在输入框输入XPATH表达式。如果可以找到就说明表达式没问题。 -
通过id定位
浏览器F12,找到控制台,在控制台输入document.getElementById(‘具体的元素id’),然后回车,如果可以找到,也说明没问题。 -
通过class定位
F12浏览器,找到控制台,在控制台输入document.getElementsByClassName(‘类名’),然后回车,如果可以找到,说明可以用次方法定位。
例如,百度首页的输入框。
通过id或class来定位,可以找到相应的元素。注意:通过getElementsByClassName()方法返回的是一个列表。document.getElementById(‘kw’)
document.getElementsByClassName(‘s_ipt’)在控制台输入表达式,结果如下:
通过xpath定位,可以使用相对路劲也可以使用绝对路径。但一般使用相对路劲,表达式会更简洁一些。绝对路径:/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input
相对路径://i[@title=‘清空’]/…/input分别在元素模块进行搜索,都能找到唯一一个结果:
对具有属性style=“display: none;” 的元素定位
具有style=“display: none;” 属性的元素,不会显示也不会占用位置,selenium直接定位的话是定位不到的。
但可以使用显式等待,判断元素是否存在于DOM树中来查找,如下:
locator = (By.ID, '元素ID')
element = WebDriverWait(self.driver, timeout, 0.2).until(EC.presence_of_element_located(locator))
点击元素报错ElementClickInterceptedException的解决方法
通常情况下,是因为元素还未加载出来或者被遮挡从而导致元素不可点击。
但有时尽管使用显示等待,等元素可点击时再进行点击,也有概率报错:ElementClickInterceptedException: Message: element click intercepted。
通过在点击前强制等待 0.5秒,也还是有报错的几率。于是尝试在点击报错的情况下,换用js的方式来实现元素点击,目前没遇到报错。如下:
'''此处省略了其他模块的导入'''
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECclass basepage:def find_element(self, locator):by, value = locatorreturn self.driver.find_element(by=by, value=value)def wait_and_find_element(self, locator, timeout=30):'''等待元素可被定位后,返回元素'''try:return WebDriverWait(self.driver, timeout).until(EC.visibility_of_element_located(locator))def click_byjs_if_error(self, locator, timeout=30):""" 如果点击元素报错,则尝试换用js点击 """try:ele = WebDriverWait(self.driver, timeout).until(EC.element_to_be_clickable(locator))ele.click()except ElementClickInterceptedException:ele = self.driver.find_element(locator)self.driver.execute_script("arguments[0].click();", ele)except TimeoutException:ele = self.driver.wait_and_find_element(locator)self.driver.execute_script("arguments[0].click();", ele)
3.5.元素定位报错find_element() argument after * must be an iterable, not method
主要是因为元素定位的命名locator和函数命名重复了。将locator换个名称就好了。如下面的代码中,既存在名为fun_name的函数,也存在名为fun_name的定位元祖。将函数或者元祖更名就好了。
class page:def __init__(self):"""初始化,构造函数"""def find_element(self, locator):by, value = locatorreturn self.driver.find_element(by=by, value=value)def fun_name(self):"""函数具体内容"""fun_name = (By.XPATH, "//i[@title='清空']/../input")def fun_2(self):ele = self.driver.find_element(self.fun_name)
canvas实现的签名功能,用selenium模拟签名
先模拟鼠标按下并移动事件,触发签名。
再获取canvas的上下文,通过canvas的API来实现图片的绘制。
如下:
def sign_by_js(self, locator):"""通过js实现签名,locator为canvas的定位元组"""element = self.wait_and_find_element(locator)script = """var mouseDownEvent = new MouseEvent('mousedown', {'view': window,'bubbles': true,'cancelable': true});var mouseMoveEvent = new MouseEvent('mousemove', {'view': window,'bubbles': true,'cancelable': true,'clientX': 100, // 移动到x坐标100的位置'clientY': 50 // 移动到y坐标50的位置});arguments[0].dispatchEvent(mouseDownEvent); # 触发鼠标按下事件arguments[0].dispatchEvent(mouseMoveEvent);# 触发鼠标移动事件"""self.driver.execute_script(script, element)# 绘制路径,这里写死了,可自由调整script = """var canvas = arguments[0];var ctx = canvas.getContext("2d"); ctx.fillStyle = "black";ctx.beginPath(); // 创建一条路径ctx.moveTo(80, 80); //起点ctx.lineTo(120, 80); //终点ctx.stroke(); // 绘制ctx.font = "Bold 40px 幼圆"; //设置字体ctx.textAlign = "center"; //设置对其方式ctx.fillStyle = "#0000FF"; //设置字体颜色ctx.fillText("文字", 170, 80); //绘制文本,第一个参数为具体的文字,第二、三个参数为需要绘制的位置ctx.closePath();"""self.driver.execute_script(script, element)
相关文章:

selenium元素定位校验以及遇到的元素操作问题记录
页面元素定位方法及校验 使用比较多的是通过id、class和xpath来对元素进行定位。在定位前可以现在浏览器验证是否可以找到指定的元素。这样就不用每添加一个元素定位都运行代码来检查定位方式表达式是否正确。 使用XPATH定位 在浏览器F12,找到元素,在元…...

在AndroidStudio中新建项目时遇到的Gradle下载慢问题,配置错的按我的来,镜像地址不知道哪个网页找的,最主要下载要快
android-studio-2024.2.1.11-windows Android 移动应用开发者工具 – Android 开发者 | Android Developers https://r4---sn-j5o76n7z.gvt1-cn.com/edgedl/android/studio/install/2024.2.1.11/android-studio-2024.2.1.11-windows.exe?cms_redirectyes&met1731775…...
用mv命令替换rm命令
# 用mv命令替换rm命令 主要内容来源自以上博文 rm命令穷凶极恶,以下为替换命令的方式,必做 步骤 修改vim ~/.bashrc加入以下代码 mkdir -p ~/.trash #在家目录下创建一个.trash文件夹(隐藏文件,ls -a 查看) alias rmdel #使用别名…...
电解车间铜业机器人剥片技术是现代铜冶炼过程中自动化和智能化的重要体现
电解车间铜业机器人剥片技术是现代铜冶炼过程中自动化和智能化的重要体现 电解车间铜业机器人剥片技术是现代铜冶炼过程中自动化和智能化的重要体现,它主要应用于铜电解精炼的最后阶段,即从阴极板上剥离出纯铜的过程。以下是该技术的几个关键点ÿ…...

【qt】控件2
1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算,Geometry从黑圈算 程序证明:使用一个按键,当按键按下,qdebug打印各自左上角的坐标(相当于屏幕左上角),以及窗口大小 Widget::Widget(QWid…...

Frida反调试对抗系列(四)百度加固
本文只是交流技术,如有侵权请联系我删除。 知识星球:https://t.zsxq.com/kNlj4 前言: 上一篇文章我们提到 我们使用github开源魔改好的frida server 但是仍然有一些厂商的server不能通过,那么这篇文章针对百度加固 进行快速通…...
Redis 安全
Redis 安全 Redis是一个开源的,高性能的键值存储系统,它通常被用作数据库,缓存和消息代理。由于其高性能和简单的API,Redis在全球范围内被广泛使用。然而,与其他数据库系统一样,Redis的安全性也是至关重要…...

上交大与上海人工智能研究所联合推出医学多语言模型,模型数据代码开源
今天为大家介绍的是来自上海交通大学的王延峰与谢伟迪团队的一篇论文。开源的多语言医学语言模型的发展可以惠及来自不同地区、语言多样化的广泛受众。 来源丨 DrugAI、 机器人的脑电波 论文:https://www.nature.com/articles/s41467-024-52417-z MMedC࿱…...

网络安全:我们的安全防线
在数字化时代,网络安全已成为国家安全、经济发展和社会稳定的重要组成部分。网络安全不仅仅是技术问题,更是一个涉及政治、经济、文化、社会等多个层面的综合性问题。从宏观到微观,网络安全的重要性不言而喻。 宏观层面:国家安全与…...
理解 Python 中的 __getitem__ 方法:在自定义类中启用索引和切片操作
理解 Python 中的 __getitem__ 方法:在自定义类中启用索引和切片操作 在Python中,__getitem__是一个特殊方法,属于数据模型方法之一,它使得Python对象能够支持下标访问和切片操作。这个方法提供了一种机制,允许类的实…...

【数据结构】【线性表】【练习】反转链表
申明 该题源自力扣题库19,文章内容(代码,图表等)均原创,侵删! 题目 给你单链表的头指针head以及两个整数left和right,其中left<right,请你反转从位置left到right的链表节点&…...

vue2+3 —— Day5/6
自定义指令 自定义指令 需求:当页面加载时,让元素获取焦点(一进页面,输入框就获取焦点) 常规操作:操作dom “dom元素.focus()” 获取dom元素还要用ref 和 $refs <input ref"inp" type&quo…...
汽车资讯新视角:Spring Boot技术革新
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

关于win11电脑连接wifi的同时,开启热点供其它设备连接
背景: 我想要捕获手机流量,需要让手机连接上电脑的热点。那么问题来了,我是笔记本电脑,只能连接wifi上网,此时我的笔记本电脑还能开启热点供手机连接吗?可以。 上述内容,涉及到3台设备&#x…...

【Apache Paimon】-- 2 -- 核心特性 (0.9.0)
目录 1、实时更新 1.1、实时大批量更新 1.2、支持定义合并引擎 1.3、支持定义更新日志生成器 2、海量数据追加处理 2.1、append table 2.2、快速查询 3、数据湖功能(类比:hudi、iceberg、delta) 3.1、支持 ACID 事务 3.2、支持 Time…...

golang对日期格式化
1.对日期格式化为 YYYY-mm-dd, 并且没有数据时,返回空 import ("encoding/json""time" )type DateTime time.Timetype SysRole struct {RoleId int64 gorm:"type:bigint(20);primary_key;auto_increment;角色ID;" json:&quo…...

【数据结构与算法】排序
文章目录 排序1.基本概念2.分类2.存储结构 一.插入排序1.1直接插入排序1.2折半插入排序1.3希尔排序 二.选择排序2.1简单选择排序2.2堆排序 三.交换排序3.1冒泡排序3.2快速排序 四.归并排序五.基数排序**总结** 排序 1.基本概念 排序(sorting)又称分类&…...
前端常见的几个包管理工具详解
文章目录 前端常见的几个包管理工具详解一、引言二、包管理工具详解1、npm1.1、npm的安装与使用 2、yarn2.1、yarn的安装与使用 3、pnpm3.1、pnpm的安装与使用 三、步骤二4、包管理工具的选择 四、总结优缺点对比 前端常见的几个包管理工具详解 一、引言 在前端开发的世界里&…...

PyAEDT:Ansys Electronics Desktop API 简介
在本文中,我将向您介绍 PyAEDT,这是一个 Python 库,旨在增强您对 Ansys Electronics Desktop 或 AEDT 的体验。PyAEDT 通过直接与 AEDT API 交互来简化脚本编写,从而允许在 Ansys 的电磁、热和机械求解器套件之间无缝集成。通过利…...

腾讯云存储COS上传视频报错
bug表现为:通过COS上传视频时报错"Class \"QCloud\\COSSTS\\Sts\" not found" 修复办法为:找到文件crmeb/services/upload/storage/Cos.php 将Sts引入由QCloud\COSSTS\Sts;改为crmeb\services\upload\extend\cos\Sts; 修改后重启服…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...