出现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中,最后再进行元素定位。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值