目录
- 问题描述
- 原因分析
- 解决方案
- 总结
问题描述
如上图所示,为某数据网站,自动登录时,点击登录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 !!!
#跳出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()
此种情况常遇见于初始页面登录的地方