Selenium定位不到元素常见原因及解决办法

新手爬虫出现报错“ no such element: Unable to locate element” 新手爬虫出现报错“ no such element: Unable to locate element” 简介 来自一个自学爬虫的Python小白的经历:通过网络上的教学视频,模仿编程。由于视频资源比较老旧,技术更新较快,所以有些方面难以做到用视频教学代码成功运行。此篇只记录产生的问题,包括已经解决和未解决的。再次申明,只是小白,只是简单的记录问题。 案例:斗鱼直播板块主播页面照片地址,所属标签,热度值,以及主播名字 初始代码如下: from selenium import webdriver import 阅读详情
AI摘要

本文探讨了Python结合Selenium进行Web自动化测试时常见的元素定位问题及其解决方法,包括iframe处理、XPath技巧、动态ID应对等,适用于各种复杂的Web页面。

Python3 Selenium定位不到元素常见原因及解决办法

一、问题描述

**  在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况:**

**  报错信息: no such element: Unable to locate element: {“method”:“xpath”,“selector”:“xpath”}**

二、分析以及解决方案

1,原因一以及解决方案

(1)原因:

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

(2)解决方案:

如果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,原因二以及解决方案

(1)原因:

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

(2)解决方案:

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

**  <2>.提高下写xpath的水平.**

**  **如何检验编写的Xpath是否正确?

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

**  例如:find_element_by_xpath("//input[@id=‘kw’]")**

img


3,原因三以及解决方案

(1)原因

**  ******页面还没有加载出来,就对页面上的元素进行的操作:****这种情况一般说来,可以设置等待,等待页面显示之后再操作,这与人手工操作的原理一样:

(2)解决方案

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

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

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

**  导入时间模块。**

**  import time**

**  time.sleep(3)**

4,原因四以及解决方案

(1)原因

**  ******动态id定位不到元素:****每次调用页面出现的元素的ID会动态随机分配。

(2)解决方案

**  如果发现是动态id,推荐使用xpath的相对路径方法查找到该元素。**

**  **img

5,原因五以及解决方案

(1)原因

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

(2)解决方案

[复制代码](javascript:void(0)😉

'''
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 as e:
    print "登录失败"
else:
    print "登录成功"
    time.sleep(3)
finally:
    print "测试记录:已测试"
driver.close()

[复制代码](javascript:void(0)😉

6,原因六以及解决方案

(1)原因

**  ******不可见元素定位:****如上百度登录代码,通过名称为tj_login查找的登录元素,有些是不可见的。

(2)解决方案

**  加一个循环判断,找到可见元素(is_displayed())点击登录即可。**

7,原因七以及解决方案

(1)原因

**  ******firefox安全性强,不允许跨域调用出现报错:****因为firefox安全性强,不允许跨域调用。

(2)解决方案

**  Firefox 要取消XMLHttpRequest的跨域限制的话,**

**  第一是从 about:config 里设置:signed.applets.codebase_principal_support = true; (地址栏输入about:config 即可进行firefox设置)**

**  第二就是在open的代码函数前加入类似如下的代码:**

try{
    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
} catch (e) {
    alert("Permission UniversalBrowserRead denied.");
}

8,原因八以及解决方案

(1)原因

**  ******窗口切换:****窗口句柄还处在上一个窗口,导致无法定位新窗口的元素。

(2)解决方案

[复制代码](javascript:void(0)😉

String currentWindow = driver.getWindowHandle();//获取当前窗口句柄
Set<String> handles = driver.getWindowHandles();//获取所有窗口句柄
for(String windowId : handles){
    if(!windowId.equals(currentWindow)){
        driver.switchTo().window(windowId);
        System.out.println(driver.getCurrentUrl());
        break;
     }
}    

[复制代码](javascript:void(0)😉

【Python】selenium使用find_element时解决【NoSuchElementException】问题的方法 NoSuchElementException是 Selenium WebDriver 中的一种异常,我们在写selenium.find_element 的时候也比较常见,它会在我们要尝试定位一个不存在的元素时抛出这类错误。 阅读详情

相关推荐

selenium 定位不到元素的几种情况

后面的数字会随着你每次登陆而变化,此时就无法通过。这个需要增加一定等待时间,显示等待时间可以通过。此时需要通过以下语句切换到默认的。页面没有加载出来就需要点击页面上的元素。这个是因为在描述路径的时候没有按照。等待欢迎页的图片出现再进行其他操作。里边的某一个元素的方法定位此元素。安全性强,不允许跨域调用出现报错。上面一段代码注释掉的部分为通过。来定位此元素,但是由于该元素在。的相对路径方法查找到该元素。由于需要定位的元素在某一个。里边,所以有时通过单独的。的情况,此时如果当前处在。造成找不到元素的情况出现。

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 799

Python3 Selenium定位不到元素常见原因及解决办法

Python3 Selenium定位不到元素常见原因及解决办法 一、问题描述   在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况:   报错信息: no such element: Unable to locate element: {"method":"xpath","selector":"xpath"} 二、分析以及解决方案 1,原因一以及解...

weixin_30597269的博客 3305

〖进阶篇1〗YAML参数解析:从nav2_params.yaml看机器人导航调优

本文深入解析了ROS2 Nav2导航系统中关键的nav2_params.yaml文件,提供了从定位、行为树、运动控制到环境感知等核心模块的参数调优实战指南。文章通过具体场景案例,如狭窄走廊、动态仓库和高精度对接,详细阐述了如何调整AMCL粒子数、控制器权重、代价地图膨胀半径等参数,以解决机器人导航中的犹豫、碰撞和精度问题,帮助开发者实现从“能用”到“好用”的进阶。

m9n0o的博客 417

selenium定位不到元素的几种原因

1.网络延迟,导致代码已经跳转到下一页面,但是网页还没有跳转,导致元素定位不到 2.页面中有frame,iframe表单,没有切换表单再定位 3.页面中frame,iframe表单的name,id属性是动态的,无法通过name,id定位 4.button通过a标签实现,定位a标签要通过xpath,或css_selector(’[属性名=属性值]’) 5.页面中有弹窗,需要切换至弹窗再定位 6.窗口句柄还处在上一个窗口,导致无法定位新窗口的元素。需要切换至新窗口句柄。 ...

ht17826836901的博客 5330

ros2的unity仿真配置(ros2-for-unity)

可以看到unity中输出了Hello World,验证完毕!可以看到unity上监听的/chatter。

m0_63671696的博客 4093

ESP32 TWAI CAN库实战:从零构建CyberGear微电机控制框架

本文详细介绍了如何利用ESP32的TWAI控制器和Arduino环境,从零构建一个面向对象的CyberGear微电机控制框架。该框架将复杂的CAN通信协议封装为简洁的API,开发者无需深究底层细节,即可轻松实现电机的速度、位置和扭矩控制,大幅简化机器人关节、云台等项目的开发流程。

oil88的博客 499

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

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

NHB234567的博客 1494

【keras】走近VGG16卷积神经网络

        VGG16是一个16层的卷积神经网络模型,输入数据的维度为224*224*3,即长宽均为224像素的RGB彩色图片,VGG16模型的权重由ImageNet训练而来。由于其具有简单实用的优点,因此,在图像分类和目标检测任务中得到了较为广泛的应用。 1.卷积神经网络的基本概念 1.1卷积         简单的将其理解为一种数学运算,具体的计算过程如下图所示:       ...

XYZ 1万+

Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)_python+selenium页面定位总是找不到

为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】

2401_89312078的博客 750

OKCC呼叫中心部署实战指南:从零搭建高效外呼系统

本文提供OKCC呼叫中心系统的完整部署实战指南,从服务器选型、操作系统准备到详细安装步骤和性能优化,帮助企业从零搭建高效外呼系统。重点介绍FreeSWITCH核心组件的安装配置技巧,以及常见问题排查方法,助力企业提升客户服务效率。

weixin_29275257的博客 163

Visual Studio Code 打开java项目

在 Visual Studio Code 中打开并运行一个 Java 项目之前,你需要确保你已经完成了一些初始设置。

2674

【Python+Selenium】定位不到元素常见原因及解决办法

这个是最常见的原因,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位。解决方案:如果iframe有name或id的话,直接使用switch_to_frame("name值")或switch_to_frame("id值")。如下:126网易免费邮-你的专业电子邮局')('x-URS-iframe') #需先跳转到iframe框架。

weixin_67553250的博客 2231

【UE5】虚幻引擎Gameplay框架

游戏实例(UGameInstance)会在引擎启动时实例化,并保持活跃直至引擎关闭。这是一种管理器类,在游戏中不存在实体,但会追踪数据和运行代码。在联网多人游戏中,游戏实例不会被复制,而是独立存在于服务器以及所有互联的客户端上。所有你希望在关卡加载间保持的内容都应存于游戏实例中。例如,游戏实例是管理游戏保存系统的到地方。游戏实例还可以充当任意数量的 游戏实例子系统 的管理器,这些子系统由游戏实例创建和销毁,并且与游戏实例本身具有相同的生命周期。在线子系统就属于这类子系统。

一个写程序的 1795

Python+Selenium 定位不到元素常见原因及解决办法

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

zhangsiyuan1998的博客 1144

C#里用HttpListener实现WEB API接口服务端

本文介绍了一个基于WinForm的HTTP服务实现方案。该方案使用HttpListener类创建了一个支持JSON POST请求处理的轻量级Web服务器,主要特点包括:1) 纯线程方式实现请求监听和处理;2) 提供标准化的JSON响应格式;3) 支持自定义请求处理逻辑;4) 包含完整的日志记录功能。代码示例展示了如何初始化服务、处理不同类型的请求(包括JSON POST),并提供了线程安全的UI更新机制。该实现适用于需要简单HTTP接口的Windows桌面应用程序,可作为程序间通信的基础设施。

大坡3D软件开发 228

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: locals()
下一篇: Linux使用selenium
Pert-
博客等级 码龄8年 1072粉丝 400原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值