出现selenium.common.exceptions.NoSuchElementException: Message: Unable to find element with xpath的解决方案
问题:
浏览器中能定位到元素,但是代码中提示找不到元素selenium.common.exceptions.NoSuchElementException: Message: Unable to find element with xpath
问题重现:
1.访问126邮箱 https://www.126.com/
2.使用xpath定位邮箱输入框 //input[@data-type="email"]
3.在chrome浏览器中上面的xpath可以定位到邮箱输入框

4.在代码中使用该xpath定位
from selenium import webdriver
driver = webdriver.Ie(executable_path="g:\\IEDriverServer.exe")
driver.get("https://www.126.com")
mail = driver.find_element_by_xpath("//input[@data-type='email']")
mail.send_keys('chen050706')
5.运行结果:

原因分析:
在chrome中xpath定位表达式能定位到元素,说明这个定位表达式没问题。
那么问题出在哪里呢?
很大的可能性是因为元素放在frame或者iframe中,导致定位不到
分析定位元素的层级,可以看到,邮箱输入框果然是在iframe中

这时候代码中要怎样才能定位到元素呢?
首先要切到iframe中,再进行定位
from selenium import webdriver
driver = webdriver.Ie(executable_path="g:\\IEDriverServer.exe")
driver.get("https://www.126.com")
driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@id,'x-URS-iframe')]"))
mail = driver.find_element_by_xpath("//input[@data-type='email']")
mail.send_keys('chen050706')
这样就定位到了

如果定位iframe中的元素之后,又要定位iframe外面的元素,需要先切出来,再进行定位
driver.switch_to.default_content()
如果切到iframe里,还是定位不到元素,那么可能的原因是:这是一个嵌套的iframe,可以再往上面层级找,看看是不是还被嵌套在另一个iframe里了。
举个栗子:
<iframe1>
<iframe2>
<input data-placeholder="邮箱帐号或手机号码" name="email" data-type="email" data-loginname="loginEmail" data-required="true" class="j-inputtext dlemail j-nameforslide" type="text" autocomplete="off" tabindex="1" spellcheck="false" id="auto-id-1565047000421" placeholder="邮箱帐号或手机号码" style="width: 198px;">
</iframe2>
</iframe1>
因为代码里有很多层级,可能一眼看不出来,可能看到的是元素在iframe2层级中,实际iframe2又嵌在iframe1中
这时候要先切到iframe1中,再切到iframe2中,最后再进行元素定位。
智能推荐
xcrun unable to find simctl 解决
遇到报错: 打开Xcode > Preferences > Locations 更改一下 Command Line Tools选项就可以了。...
web安全简易规范123
web安全,大公司往往有专门的安全开发流程去保证,有专门的安全团队去维护,而对于中小网络公司,本身体量小,开发同时兼带运维工作,时间精力有限,但是,同样需要做一些力所能及的必要的事情。有时候,安全威胁并不是因为你的防盗窗被人撬开了,而是你晚上睡觉的时候忘了关门,而关上门对开发来说也许只是举手之劳。 1、不要用root,确定使用的中间件和框架是否默认打开了后门 我们总会在线上使用部署一些中间件、开源...
html5拖放--15行js代码实现两个div内容互换
本文首发于我的个人博客:http://cherryblog.site/ ,欢迎大家前去参观 本文项目地址,sortable插件地址:https://github.com/sunshine940326/sortable demo地址:https://github.com/sunshine940326/drag 在写我们后台的管理程序中需要有一个拖放的功能,然后我们有一个这样的功能,实现11个固定且大...
git切换分支报错,不管什么标题名字,都报非法字符,所以就不起名字了。
切换分支的时候,报了标题这么个错误,error: ”xxx did not match any file(s) known to git. 看见不能切换分支,我首先 git status 查看了一下当前状态,如下图 然后,就会发现,其实我的这个错误非常明显,就是在我的 beat 分支下有文件修改,所以切换不了。ok,解决方法: 1. 如果修改的这些文件没什么用,完全可以删除。(我这儿的...
猜你喜欢
Oracle分析函数之LEAD和LAG实际应用
Oracle分析函数之LEAD和LAG实际应用 在前几天的工作中按照客户的需求,需要对客户信息进行数据分析,即某人存在多个状态的账号,将客户信息账号状态分析出结果,和客户确认汇报,根据保留规则,保留唯一账号,以保证程序可用性。起初,根据聚合函数进行查询分析,需要写一大串的SQL,即不美观又复杂,很容易产生错误。后续想到Oracle分析函数中的lead和lag,SQL简洁了很多且容易产生报告数据。 ...
小知识积累(不断更新中)
判断变量的类型(数组,对象) tyopof:不推荐,因为无法区别数组与对象,数组是对象的子对象 instanceof:可以使用 还可以用来判断是否属于函数 Object.prototype.toString.call():最兼容,推荐使用 定时器的执行顺序或机制 js是单线程的,浏览器遇到setTimeout或者setInterval会把定时器推入浏览器的待执行事件队列里面但是不执行,先执行完当前...
ROS自学实践(6):ROS进行激光SLAM建图——gmapping
本节主要记录运行ROS自带的SLAM建模包gmapping方法,为后续理解这些代码,建立自己的SLAM算法打下基础。 基于粒子滤波算法 二维栅格地图 需要里程计信息 1.通过命令行安装gmapping包 2.配置gmapping节点 3.运行gazebo模型及gmapping节点 4.打开rviz 添加laserscan、map、robotmodel模型 5.移动小车,建立模型 6.保存当前地图 ...
face-api.js中加入MTCNN:进一步支持使用JS实时进行人脸跟踪和识别
如果你现在正在阅读这篇文章,那么你可能已经阅读了我的介绍文章(JS使用者福音:在浏览器中运行人脸识别)或者之前使用过face-api.js。如果你还没有听说过face-api.js,我建议你先阅读介绍文章再回来阅读本文。 和往常一样,本文中为你准备了一个代码示例。我们将解析一个小的应用程序,这个程序将在浏览器中访问摄像头图像执行实时人脸检测和人脸识别,让我们开始吧! 使用face-api.js进行...
Centos yum安装tomcat8 (阿里云的端口坑!!!)
1.官网下载上传至服务器并解压 2.将解压下来的文件移动到自己的目录下 3.进入tomcat 的bin目录启动服务 4.配置 5.阿里云的端口 阿里云服务器 阿里云控制台打开端口:...
