前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >当selenium爬虫遇到弹窗——iframe定位

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

作者头像
诡途
发布2022-05-09 19:05:14
9500
发布2022-05-09 19:05:14
举报
文章被收录于专栏:诡途的python路

目录

问题描述

如上图所示,为某数据网站,自动登录时,点击登录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()

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 问题描述
  • 原因分析
  • 解决方案
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档