Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)

2023-09-18 14:58:13

这篇文章主要介绍了Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptions.NoSuchElementException),一般可以从以下几个方面着手解决:

1.Frame/Iframe原因定位不到元素:

这个是最常见的原因,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位。

解决方案:

如果iframe有name或id的话,直接使用switch_to_frame(“name值”)或switch_to_frame(“id值”)。如下:

driver=webdriver.Firefox()
driver.get(r'http://www.126.com/')
driver.switch_to_frame('x-URS-iframe') #需先跳转到iframe框架
username=driver.find_element_by_name('email')
username.clear()

如果iframe没有name或id的话,则可以通过下面的方式定位:

#先定位到iframe
elementi= driver.find_element_by_class_name('APP-editor-iframe')
#再将定位对象传给switch_to_frame()方法
driver.switch_to_frame(elementi)

如果完成操作后,可以通过switch_to.parent_content()方法跳出当前iframe,或者还可以通过switch_to.default_content()方法跳回最外层的页面。

2.Xpath描述错误原因:

由于Xpath层级太复杂,容易犯错。但是该定位方式能够有效定位绝大部分的元素,建议掌握。

解决方案:

2.1可以使用Firefox的firePath,复制xpath路径。该方式容易因为层级改变而需要重新编写过xpath路径,不建议使用,初学者可以先复制路径,然后尝试去修改它。

2.2提高下写xpath的水平。

可以详看笔者另外一篇博文总结:Selenuim+Python之元素定位总结及实例说明
该博文详细总结了Xpath的使用,多组合定位一般都能实现定位问题。

如何检验编写的Xpath是否正确?编写好Xpath路径,可以直接复制到搜狐浏览器的firebug查看html源码,通过Xpath搜索:如下红色框,若无报错,则说明编写的Xpath路径没错。

find_element_by_xpath("//input[@id='kw']")

3.页面还没有加载出来,就对页面上的元素进行的操作:

这种情况一般说来,可以设置等待,等待页面显示之后再操作,这与人手工操作的原理一样:

3.1设置等待时间;缺点是需要设置较长的等待时间,案例多了测试就很慢;

3.2设置等待页面的某个元素出现,比如一个文本、一个输入框都可以,一旦指定的元素出现,就可以做操作。

3.3在调试的过程中可以把页面的html代码打印出来,以便分析。

解决方案:

导入时间模块。

import time
time.sleep(3)

4.动态id定位不到元素:

解决方案:

如果发现是动态id,直接用xpath定位或其他方式定位。

5.二次定位,如弹出框登录

如百度登录弹出框登录百度账号,需先定位到百度弹出框,然后再定位到用户名密码登录。

# coding=utf-8
'''
Created on 2016-7-20
@author: Jennifer
Project:登录百度账号
'''
from selenium import webdriver
import time
 
driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")
 
time.sleep(3)
 
#点击登录:有些name为tj_login的元素为不可见的,点击可见的那个登录按钮即可。
#否则会报:ElementNotVisibleException
element0=driver.find_elements_by_name("tj_login")
for ele0 in element0:
  if ele0.is_displayed():
    ele0.click()
 
#在登录弹出框,需先定位到登录弹出框
#否则会报:NoSuchElementException
element1=driver.find_element_by_class_name("tang-content")
element11=element1.find_element_by_id("TANGRAM__PSP_8__userName")
element11.clear()
element11.send_keys("登录名")
 
element2=element1.find_element_by_id("TANGRAM__PSP_8__password")
element2.clear()
element2.send_keys("密码")
 
element3=element1.find_element_by_id("TANGRAM__PSP_8__submit")
element3.click()
element3.submit()
 
try:
  assert "登录名" in driver.page_source
except AssertionError:
  print "登录失败"
else:
  print "登录成功"
  time.sleep(3)
finally:
  print "测试记录:已测试"
driver.close()

补充:报:selenium.common.exceptions.ElementNotVisibleException

代码:

from selenium import webdriver
from PIL import Image
import time
import pandas as pd
import datetime
 
driver = webdriver.Ie(r"C:\Program Files\internet explorer\IEDriverServer2.exe")
driver.get("https://www.cib.com.cn/cn/minipage/page/login-firmalert.html")
print("请输入用户名和帐号密码,实现登录")
input("====按任意键继续====")
 
# print(driver.current_url) # https://corporatebank.cib.com.cn/firm/main/mainx.do
 
frame = driver.find_element_by_id("workframe") # 切换到 iframe 标签中查找
driver.switch_to_frame(frame) # 切入 iframe 标签
 
# driver.switch_to_default_content()  # 切出 iframe 标签 也可以 直接 默认的
 
driver.find_element_by_xpath('//div[@id="fast-way"]/ul/li[2]/a').click() # 点击 当日明细查询按钮
time.sleep(2)
try:
  driver.find_element_by_xpath('//div[@id="fast-way"]/ul/li[2]/a').click() # 点击 当日明细查询按钮
except Exception as e:
  print("=======双击这个按钮========", e)
time.sleep(3)

到此这篇关于Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)的文章就介绍到这了

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!   

更多推荐

【linux】进程创建,进程终止

进程创建,进程终止1.进程创建1.1写时拷贝1.2fork常规用法1.3fork调用失败的原因2.进程终止2.1退出码2.2进程退出场景2.3进程如何退出1.进程创建在前面创建子进程的时候就学过了fork函数,它能从已经存在进程中创建一个新进程,新进程为子进程,而原进程为父进程。当进程调用fork,当控制转移到内核中的

【操作系统笔记】内存布局&内存映射

虚拟内存布局虚拟地址空间大小:32位虚拟地址空间[0~2^32-1]总共4GB64位虚拟地址空间[0~2^64-1]总共16777216TB不管是运行在用户态还是内核态,都需要使用虚拟地址,这是因为计算机硬件要求的,CPU要经过地址转换得到最终的物理地址,软件必须服从硬件的规定。内核态的虚拟空间和某一个程序没有关系,所

[Halcon&3D] 3D手眼标定理论与示例解析

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由丶布布原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.3D手眼标定理论基础二.3D手眼标定流程(eye-to-hand)1、创建标准件

Dajngo06_Template模板

Dajngo06_Template模板6.1Template模板概述模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术静态网页:页面上的数据都是写死的,万年不变动态网页:页面上的数据是从后端动态获取的(后端获取数据库数据然后传递给前端页面)对模板引擎的一般支持和Django模板语言的实现都存在

RobotFrameWork自动化测试环境搭建

前言RobotFramework是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发(ATDD),支持python,java等编程语言(百度百科)。功欲善其事必先利其器,在学习RF之前同

Redis command timed out 处理(InsCode AI 创作助手)

问题详情:redis命令超时异常Rediscommandtimedout;nestedexceptionisio.lettuce.core.RedisCommandTimeoutException:Commandtimedoutafter3second(s)导致Redis命令超时的可能原因Redis服务器负载高:Red

【网络安全】黑客自学笔记

1️⃣前言🚀作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。计算机各领域的知识水平决定你渗透水平的上限🚀【1】比如:你编程水平高,那你在代码审计的时候就会比别人强,写出的漏洞利用工具就会比别人的好用;【2】比如:你数据库知识水平高,那你在进行SQL注入攻击的时候,你就可以写出更多更好的S

GFS分布式存储

glusterFS简介GFS是一个分布式文件系统,只在扩展存储容量,提高性能,并且通过多个互联网络的存储节点的数据进行冗余,以确保数据的可用性和一致性GFS由三个部分组成:存储服务器客户端以及FNS/Samba存储网关组成无元数据服务器:就是保存数据的地方glusterFS特点扩展性和高性能:分布式的特性高可用性:冗余

又一个全新编程语言,诞生了!

最近,编程领域又一个黑马忽然冲进了开发者们的视野并正式开放下载。它的名字叫Mojo,相信有不少小伙伴最近也看到了。Mojo是为AI开发者所准备的编程语言,语法有点像Python。根据Mojo官网的描述,它结合了Python的易用性和C语言的高性能,解锁了AI硬件的可编程性和AI模型的可扩展性。Mojo看起来好像挺能打,

使用Linkerd实现流量管理:学习如何使用Linkerd的路由规则来实现流量的动态控制

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

开学季哪个牌子的电容笔好?ipad2023手写笔推荐

到底是用苹果原装的电容笔,还是用平替的电容笔,这要根据自己的需要来决定,比如经常用在画画上,可以选择苹果原装笔;如果你一天里用来写东西的时间多于用来画画的时间,那你就该考虑一下,买一支更便宜的平替电容笔了。小编整理了一些很实用的电容笔,大家可以参考下哦!一、西圣电容笔官网价格:169元充电方式:独立充电仓西圣虽然低调,

热文推荐