背景:组内同事最近在写脚本,使用复制的xpath始终定位不到元素,报错内容:selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"xpath","selector":"//table[text()='contentTable']/tbody/tr/td[16]/a[2]/i"}
解题思路:
- 由于提供的html截图信息,发现存在多层body消息体拼接成一个html页面的情况,所以推荐使用模糊查询的xpath定位元素,也就有了这个xpath:"//table[text()='contentTable']/tbody/tr/td[16]/a[2]/i"【如果不清楚模糊查询xpath怎么写,可以在评论区提问】
改了后,不好用,还是报错。
- 是不是等待没加?
不是,等待了10秒,肯定能够加载
- 当前元素父节点,是否存在iframe?:存在!!!
如果父节点存在图上这种iframe消息体就需要先跳转到iframe,才能够定位到元素:
跳转方式有很多,这里推荐使用:driver.switch_to.frame(0)
后面的0代表跳转到第一个iframe,如果页面有多个iframe,需要看看这个元素所在iframe是第几个,如果是第二个,就修改成1
问题解决。
问题升级:
就是这个页面,在进行后续操作的时候,又报错了,还是一样的!
也是一番错误的定位,最终定位到了这个html结构
通过这个html结构发现,需要定位的元素,不在iframe窗口下。如果之前已经跳转到了iframe,之后定位的元素也只能够定位到iframe窗口下的元素了。
这时:需要跳出之前进入的iframe页面: driver.switch_to.default_content()
总结:
1. 如果父节点存在iframe,需要先跳转到iframe才能够定位到元素
2. 如果之前跳转过iframe,当需要定位不在同iframe的脚本,需要先跳出之前的iframe窗口,才能够继续定位
3. 定位不到元素的原因,可以优先考虑iframe~
版权归原作者 Bierante 所有, 如有侵权,请联系我们删除。