当selenium爬虫遇到弹窗——iframe定位

2022-05-09 19:05:14 浏览数 (1)

目录

  • 问题描述
  • 原因分析
  • 解决方案
  • 总结

问题描述

如上图所示,为某数据网站,自动登录时,点击登录button会出现弹窗让你输入账号密码,此时定位输入框send_keys发送参数,报错信息如下:找不到元素(定位条件确认没写错)

代码语言:javascript复制
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="loginCode"]"}

原因分析

仔细分析页面源码发现,所要查找的元素处于一个iframe标签下(通常称为网页布局嵌套),而一般webdriver要操作页面元素需要在Top Window的状态下,当浏览器出现iframe时,用正常的元素定位是没有效果的,需要将页面装换到iframe下再对页面元素进行操作(大致可以理解为页中页,及一个页面里嵌套了一个页面,而selenium的操作网页的原理是依靠窗口句柄,当前句柄在外面窗口,定位元素在内部窗口,所以无法定位到元素关于selenium的句柄切换详见下一篇文章,还没写!后面整理下再写,跟本次所要讲的切换类似又有点儿差异,有兴趣的可以百度一下,有前辈们贡献过!

解决方案

代码语言:javascript复制
#定位到iframe
iframe=drive.find_element_by_tag_name("iframe")

#句柄切换进iframe
drive.switch_to_frame(iframe)

#输入用户名
drive.find_element_by_name("loginCode").send_keys(user_name) 
time.sleep(random.uniform(1,1.5))

!!!perfect !!!

代码语言:javascript复制
#跳出iframe
drive.switch_to_default_content()
#如果不跳出再次进入iframe也会报错,找不到元素,相当于在iframe里找一个iframe

如果driver.switch_to_frame()失效请改用新操作:driver.switch_to.frame()

同理,如果drive.switch_to_default_content()失效 请改用新操作:drive.switch_to.default_content()

【本文环境配置:selenium版本:3.141.0;chrome版本:76.0.3809,两种写法都可以】

总结

代码语言:javascript复制
#定位iframe
#也可以用其他属下定位同selenium常用定位方法,即iframe本身也是一个元素
iframe=drive.find_element_by_tag_name("iframe")

#跳进
drive.switch_to_frame(iframe)
#或
drive.switch_to.frame(iframe)

#跳出
drive.switch_to_default_content()
#或
drive.switch_to.default_content()

此种情况常遇见于初始页面登录的地方

0 人点赞