中英文网站是怎么做的,如何做微信朋友圈网站,深圳婚纱摄影网站建设,深圳营销型网站联系方式这篇文章主要介绍了PythonSelenium定位不到元素常见原因及解决办法(报#xff1a;NoSuchElementException),文中通过示例代码介绍的非常详细#xff0c;对大家的学习或者工作具有一定的参考学习价值#xff0c;需要的朋友们下面随着小编来一起学习学习吧
在做web应用的自动…这篇文章主要介绍了PythonSelenium定位不到元素常见原因及解决办法(报NoSuchElementException),文中通过示例代码介绍的非常详细对大家的学习或者工作具有一定的参考学习价值需要的朋友们下面随着小编来一起学习学习吧
在做web应用的自动化测试时定位元素是必不可少的这个过程经常会碰到定位不到元素的情况报selenium.common.exceptions.NoSuchElementException一般可以从以下几个方面着手解决
1.Frame/Iframe原因定位不到元素
这个是最常见的原因首先要理解下frame的实质frame中实际上是嵌入了另一个页面而webdriver每次只能在一个页面识别因此需要先定位到相应的frame对那个页面里的元素进行定位。
解决方案
如果iframe有name或id的话直接使用switch_to_frame(“name值”)或switch_to_frame(“id值”)。如下
driverwebdriver.Firefox()
driver.get(rhttp://www.126.com/)
driver.switch_to_frame(x-URS-iframe) #需先跳转到iframe框架
usernamedriver.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的水平。
可以详看笔者另外一篇博文总结SelenuimPython之元素定位总结及实例说明 该博文详细总结了Xpath的使用多组合定位一般都能实现定位问题。
如何检验编写的Xpath是否正确编写好Xpath路径可以直接复制到搜狐浏览器的firebug查看html源码通过Xpath搜索如下红色框若无报错则说明编写的Xpath路径没错。
find_element_by_xpath(//input[idkw])3.页面还没有加载出来就对页面上的元素进行的操作
这种情况一般说来可以设置等待等待页面显示之后再操作这与人手工操作的原理一样
3.1设置等待时间缺点是需要设置较长的等待时间案例多了测试就很慢
3.2设置等待页面的某个元素出现比如一个文本、一个输入框都可以一旦指定的元素出现就可以做操作。
3.3在调试的过程中可以把页面的html代码打印出来以便分析。
解决方案
导入时间模块。
import time
time.sleep(3)4.动态id定位不到元素
解决方案
如果发现是动态id直接用xpath定位或其他方式定位。
5.二次定位如弹出框登录
如百度登录弹出框登录百度账号需先定位到百度弹出框然后再定位到用户名密码登录。
# codingutf-8Created on 2016-7-20
author: Jennifer
Project:登录百度账号from selenium import webdriver
import timedriver webdriver.Firefox()
driver.get(http://www.baidu.com/)time.sleep(3)#点击登录有些name为tj_login的元素为不可见的点击可见的那个登录按钮即可。
#否则会报ElementNotVisibleException
element0driver.find_elements_by_name(tj_login)
for ele0 in element0:if ele0.is_displayed():ele0.click()#在登录弹出框需先定位到登录弹出框
#否则会报NoSuchElementException
element1driver.find_element_by_class_name(tang-content)
element11element1.find_element_by_id(TANGRAM__PSP_8__userName)
element11.clear()
element11.send_keys(登录名)element2element1.find_element_by_id(TANGRAM__PSP_8__password)
element2.clear()
element2.send_keys(密码)element3element1.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 datetimedriver webdriver.Ie(rC:\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.doframe 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[idfast-way]/ul/li[2]/a).click() # 点击 当日明细查询按钮
time.sleep(2)
try:driver.find_element_by_xpath(//div[idfast-way]/ul/li[2]/a).click() # 点击 当日明细查询按钮
except Exception as e:print(双击这个按钮, e)
time.sleep(3)到此这篇关于PythonSelenium定位不到元素常见原因及解决办法(报NoSuchElementException)的文章就介绍到这了
最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走 这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你