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; 修改后重启服…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 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 系统…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
