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

问题描述

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

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="loginCode"]"}

原因分析

在这里插入图片描述

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

解决方案

#定位到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 !!!在这里插入图片描述

#跳出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,两种写法都可以】

总结

#定位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()

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

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

诡途

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

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

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

打赏作者

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

抵扣说明:

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

余额充值