当前位置: 首页 > news >正文

解决selenium元素定位不到疑难杂症

//蓝色为个人总结性语言可能有误差,红色为重点语言,紫色为注释内容,这个为自学笔记和心得,学习资料来自于码尚教育B站一个视频

//开始之前请确保安装好selenium并测试完环境

一、八大元素定位(基础中的基础)

class By: 
"""Set of supported locator strategies.""" 
ID = "id" 
XPATH = "xpath" 
LINK_TEXT = "link text" 
PARTIAL_LINK_TEXT = "partial link text" 
NAME = "name" 
TAG_NAME = "tag name" 
CLASS_NAME = "class name" 
CSS_SELECTOR = "css selector“

自行回忆检测

二、页面未加载完成

页面上的元素可能由于网络延迟,JavaScript渲染等原因导致未加载完成,使用selenium元素定位会找不到

解决方式:

添加对应的等待时间,让元素充分加载完成之后再进行具体定位的操作

1.显示等待(用的最多最可靠)

#下载 pip install selenium.webdriver.
#导入包
from selenium.webdriver.support import expected_conditions as ECel = WebDriverWait(driver, 
5).until(EC.presence_of_element_located((By.XPATH, '//* 
[@id="1"]/div/h3/a'))) 
# driver.find_element(By.XPATH, '//*[@id="1"]/div/h3/a').click() 
el.click() 

2.隐式等待

# 隐式等待 
driver.implicitly_wait(3) 

3.强制等待

impot time'

Time.sleep()

三、框架内元素不可找

.iframeframe内的元素
如果目标元素位于一个iframe或者frame的子页面中,那么直接使用selenium无法对该元素进行定位
一旦涉及iframeframe子页面元素嵌套,那么需要要先切换成功之后再进行元素定位操作

# 当元素在子页面的frame元素中需要进行切换定位

driver.switch_to.frame(driver.find_element(By.XPATH, '/html/frameset/frame[1]')) //大框架frame的定

driver.find_element(By.XPATH, '//*[@id="navs"]/ul/li[2]/a').//click()真正元素定位

四.元素id或者属性变化

当页面中同一个元素每次值不一样的时候,那么使用常规定位元素的方式会出错

需要使用xpath提供的对应方法,进行手写xpath定位元素操作

以**开头

以**结尾

以及包含**

//*[@id="auto-id-ri6QaGIEhN3bTxsA"]

//*[@id="auto-id-ghlNbd98dkqJFidB"]

//*[@id="auto-id-4SCakBx15gzHDRud"]

# 定位以 auto-id- 开头的 id 元素
element = driver.find_element(By.XPATH, '//*[starts-with(@id, "auto-id-")]')

通过分析前台金融页面,登录成功和失败的提示信息:

成功://*[@id="fanwe_success_box"]/table/tbody/tr/td[2]/div[2]

失败://*[@id="fanwe_error_box"]/table/tbody/tr/td[2]/div[2]

# print(driver.find_element(By.XPATH, '//*

[@id="fanwe_error_box"]/table/tbody/tr/td[2]/div[2]').text)

# 不管是正例和反例的提示信息都要进行获取

# 可以通过手写xpath以**开头进行定位

text = driver.find_element(By.XPATH, '//*[starts-

with(@id,"fanwe_")]/table/tbody/tr/td[2]/div[2]').text

//把变化的去掉留下固定的就好

五.元素被遮挡

有时候元素可能被其他元素遮挡,如弹框,广告等信息,导致selenium无法完成交互
可以通过编写JavaScript及哦啊本完成生成之后再进行对应的操作
def close_msg(self):# 处理可能出现的弹窗if "确定" in self.driver.page_source:self.driver.find_element(By.XPATH, '//*[text()="确定"]').click()

六、元素不可交互

如果元素时通过JavaScript脚本动态生成,那么元素可能不在html中,使用selenium无法完成直接定位
可以通过编写JavaScript脚本执行对元素的强制操作或者属性修改之后再进行定位操作
因为selenium支持JavaScript脚本编写执行,可以直接调用对应的方法进行操作

七、警告框处理

警告框
警告框属于JavaScript脚本执行机制结果
一般的警告框有一下的分类
alert
confifirm
prompt
input
div
.....
解决警告的方法
获取警告框的元素
获取警告框的提示信息
关闭警告框
通过确定按钮进行关闭
通过取消按钮进行关闭
针对一些警告框可以进行输入,那么进行定位之后输入即可
 
3,发送请求 
driver.get(url) 
driver.maximize_window() 
driver.find_element(By.ID, 'alerta').click() 
# 从当前页面切换到警告框里面 
time.sleep(2) 
alert = driver.switch_to.alert 
# 获取警告框文本内容 
time.sleep(2) 
print(alert.text) 
# # 取消警告框 
# alert.dismiss() 
# time.sleep(2) 
# 点击确认:取消警告框 
alert.accept() 

八、内化为自己经验

参加完ccf,当时还找到了一个软件测试的面试,面试官就问了我这个过程中遇见了什么问题,怎么解决的,我说web自动化测试确实遇见了一个元素一直定位不到的问题,先尝试了显示等待,不可行,后面观察是不是在frame框架里面,成功解决问题,没有什么经验也可以按我这个模版现编。

http://www.dtcms.com/a/285874.html

相关文章:

  • TCL 电视安装 APK 文件主要有 U 盘安装——仙盟创梦IDE
  • nastools继任者?极空间部署影视自动化订阅系统『MediaMaster』
  • echarts dataZoom 文本显示不完整
  • 响应式编程入门教程第六节:进阶?Combine、Merge、SelectMany 与错误处理
  • 【怜渠客】简单实现手机云控Windows电脑锁屏
  • MySQL中的锁有哪些
  • 【软件重构】如何避免意外冗余
  • 一文入门深度学习(以医学图像分割为例)
  • 【机器学习深度学习】LoRA 与 QLoRA:大模型高效微调的进阶指南
  • 【华为机试】70. 爬楼梯
  • 快速安装GitLab指南
  • mix-blend-mode的了解使用
  • git 介绍与使用教程
  • LP-MSPM0G3507学习--05管脚中断
  • 如何 ASP.NET Core 中使用 WebSocket
  • HTTP性能优化实战技术文章大纲
  • final 使用
  • 实现库存显示和状态按钮的Question
  • 数据统计模块后端架构解析:从Controller到SQL的ECharts数据对接实践
  • Spring介绍以及IOC和AOP的实现
  • 某邮生活旋转验证码逆向
  • Ansible + Shell 服务器巡检脚本
  • 如何使用Python将HTML格式的文本转换为Markdown格式?
  • UDP 协议下一发一收通信程序的实现与解析
  • Python - 数据分析三剑客之Pandas
  • docker--容器自启动
  • Vue导出Html为Word中包含图片在Microsoft Word显示异常问题
  • Python MP3 归一化器和长度分割器实用工具开发指南
  • 曼哈顿自注意力MaSA,基于曼哈顿距离的显式空间先验,以线性计算复杂度高效建模全局与局部空间关系,提升视觉任务的性能。
  • Java: 反射机制的 ParameterizedType(参数化类型)