Selenium WebDriver元素定位方式+定位失败原因总结

引包部分

from selenium.webdriver.chrome.webdriver import WebDriver#谷歌浏览器为例
from selenium.webdriver.common.by import By#本文采用“By.XXX”的方式
import time#经常需要强制等待、显式等待、隐式等待→等待页面元素布局刷新
self.dr=WebDriver()#在测试类中实例化1个局部浏览器
GlobalDr=WebDriver#或者在测试类中实例化1个全局浏览器

8大定位方式

方式1:By.ID
self.dr.find_element(By.ID,‘XXX’)#通过ID属性定位唯一元素,多个的话默认取第一个
self.dr.find_elements(By.ID, ‘XXX’)#通过ID属性定位多个元素,结果为列表
self.dr.find_elements(By.ID, ‘XXX’)[3]#通过ID属性定位多个元素中的第3个
此处需注意,python中列表索引从0开始,但驱动浏览器执行时,相关执行语言中索引是从1开始哦!
方式2:By.NAME
self.dr.find_element(By.NAME,‘XXX’)#通过NAME属性定位唯一元素,多个的话默认取第一个
self.dr.find_elements(By.NAME, ‘XXX’)#通过NAME属性定位多个元素,结果为列表
self.dr.find_elements(By.NAME, ‘XXX’)[3]#通过NAME属性定位多个元素中的第3个
方式3:By.CLASS_NAME
self.dr.find_element(By.CLASS_NAME,‘XXX’)#通过类名定位唯一元素,多个的话默认取第一个
self.dr.find_elements(By.CLASS_NAME, ‘XXX’)#通过类名定位多个元素,结果为列表
self.dr.find_elements(By.CLASS_NAME, ‘XXX’)[3]#通过类名定位多个元素中的第3个
方式4:By.TAG_NAME
self.dr.find_element(By.TAG_NAME,‘XXX’)#通过标签名定位唯一元素,多个的话默认取第一个
self.dr.find_elements(By.TAG_NAME, ‘XXX’)#通过标签名定位多个元素,结果为列表
self.dr.find_elements(By.TAG_NAME, ‘XXX’)[3]#通过标签名定位多个元素中的第3个
方式5:By.LINK_TEXT
self.dr.find_element(By.LINK_TEXT,‘XXX’)#通过超链接(a标签)的文本定位唯一元素,多个的话默认取第一个
self.dr.find_elements(By.LINK_TEXT, ‘XXX’)#通过超链接(a标签)的文本定位多个元素,结果为列表
self.dr.find_elements(By.LINK_TEXT, ‘XXX’)[3]#通过超链接(a标签)的文本定位多个元素中的第3个
方式6:By.PARTIAL_LINK_TEXT
self.dr.find_element(By.PARTIAL_LINK_TEXT,‘XXX’)#通过超链接(a标签)的部分文本定位唯一元素,多个的话默认取第一个
self.dr.find_elements(By.PARTIAL_LINK_TEXT, ‘XXX’)#通过超链接(a标签)的部分文本定位多个元素,结果为列表
self.dr.find_elements(By.PARTIAL_LINK_TEXT, ‘XXX’)[3]#通过超链接(a标签)的部分文本定位多个元素中的第3个
方式7:By.CSS_SELECTOR(几乎万用,更切合前端CSS样式语言)
self.dr.find_element(By.CSS_SELECTOR,‘XXX’)#通过CSS选择器定位唯一元素,多个的话默认取第一个
self.dr.find_elements(By.CSS_SELECTOR, ‘XXX’)#通过CSS选择器定位多个元素,结果为列表
self.dr.find_elements(By.CSS_SELECTOR, ‘XXX’)[3]#通过CSS选择器定位多个元素中的第3个
未完待续
方式8:By.XPATH(几乎万用,更切合后端XML语言)
self.dr.find_element(By.XPATH,‘XXX’)#通过XPATH定位唯一元素,多个的话默认取第一个
self.dr.find_elements(By.XPATH, ‘XXX’)#通过XPATH定位多个元素,结果为列表
self.dr.find_elements(By.XPATH, ‘XXX’)[3]#通过XPATH定位多个元素中的第3个
xpath细节://div[1] 不同于 (//div)[1] ,前者表示任意层级下的第一个xpath,后者表示全部(//div)中的第一个,xpath不是编程语言,索引是从1开始的

注意

1、其实有些公司为了脚本维护方便,人员交流方便,要求员工统一格式,都使用XPATH或者CSS_SELECTOR;
ps:博主都用过,直接说结论:xpath是万能最优解,而且简单,适合团队推广;css不支持selenium的父节点(/…)、文本【text(),contains()】、appium、子元素的次序范围(position)、前面的兄弟节点(preceding-sibling::*),由此落入下乘;
2.常用的配合等待模式:
①强制等待(单次作用)—time.sleep(XXX)—程序休眠XXX秒后再执行;
②显示等待(单次作用)—
③隐式等待(设定后永久作用)—driver.implicitly(15)
3.运行时NoSuchElement的常见原因:
总-NoSuchElement:动态→sleep→iframe
①等待时间不够,网页元素还未完成刷新布局→增加等待时间即可;
②元素定位方式错误→检查看是不是前端代码更新?
③是不是有框架iframe的切换?是不是有警告框的切换?是不是有新窗口(窗口句柄切换)的跳转?
④你的定位写错了→在浏览器中F12开发者模式Control+Find下用你的定位方式,看能不能定位到元素(XPATH定位法时)?
⑤动态定位属性→换成静态定位属性。
⑥切换window,警告框。
4.配套常用’文本查找’操作:control+find,control+shift+find
5.快速定位语法错误:F2
6.python包安装失败处理方式:①重启重试②直接用批处理文件.bat③不管,后续报错时直接复制他人现成的py模块就行。
7.常见引包错误-循环引用→po模型只允许高层引用底层,不允许同级互相引用,不允许下层引用上层
8.常用pytest批量执行命令:

if __name__=='__main__':
    pytest.main(['-vs','-rs','--lf',f'--html={测试报告路径}',#{用例搜集路径}])

定位失败原因总结:
1、定位写错:前端代码可不是那么稳定,可能已经更新修改了哦,仔细检查,更正定位;
2、等待时间不足(最常见原因):即使有了隐式/显示等待,也不可高枕无忧,因为会有“页面元素已加载,但后端接口还未加载好”的情况,这时老老实实使用time.sleep()吧;
3、元素是动态的:需要寻找不变的规律,或者try except多尝试几次,只使用正确的那一次
3、框架集iframe的切换:查找关键字frame,看是不是有框架集的切换
4、句柄切换:即网页切换,要用WebDriver的switch_window()方法切换
5、警告弹框:要用WebDriver的switch_to.alert方法簇进行操作
6、canvas画布:比较新的前端技术,画布标签,可以用坐标轴处理,如图:
在这里插入图片描述
7、页面循环点击失效:页面元素点击后,地址会发生变化,第二次点击要重新定位
8、元素不可交互:要么换成更大/更小的标签,要么先定位点击父级标签,再点击子级标签
口诀:动态sleep-iframe,句柄警告canvas,循环点击不交互

ps:遇到鼠标悬停的动态隐藏H5代码,想要抓取其Html代码,可以鼠标不动,使用快捷键去查看与复制。
↑↓:移动
←:收缩H5标签
→:展开H5标签
Enter:进入标签内
Esc:退出标签
Shift+方向键:字符串选择
Control+C:复制(也可以使用系统键-SystemRequire/PrintScreen)

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天道哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值