本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素
文章目录
场景描述
当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。
比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的
tag_name
,
class_name
,
id
或者
xpath
来定位
<iframe></iframe>
中的页面元素,会抛出
NoSuchElementException
异常。
解决方案
- 如果要定位iframe中的元素,需要在定位之前将web_driver切换到对应的iframe中,就像切换tab一样。
- 切换web_driver到iframe中,可以使用web_driver对应的
.switch_to.frame(frame_reference)
方法 - 同样的,如果已经切换到iframe之后,要定位iframe之外的页面元素,需要先切换回默认的页面内容,使用
.switch_to.default_content()
方法 .switch_to.frame(frame_reference)
传入的参数frame_reference
可以是代表目标iframe的id
或者``class的一个字符串或者是一个定位到的iframe(webelement.WebElement
对象),或者是一个数值,代表切换到当前页面中指定次序的iframe。switch_to.freame
的help文档如下:
"""
Help on method frame in module selenium.webdriver.remote.switch_to:
frame(frame_reference) method of selenium.webdriver.remote.switch_to.SwitchTo instance
Switches focus to the specified frame, by index, name, or webelement.
:Args:
- frame_reference: The name of the window to switch to, an integer representing the index,
or a webelement that is an (i)frame to switch to.
:Usage:
driver.switch_to.frame('frame_name')
driver.switch_to.frame(1)
driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
"""
具体代码
以CSDN的登录窗体为例,通过F12开发者模式可以看到如下页面结构:
<iframe width="410" height="520" name="passport_iframe"
src="https://passport.csdn.net/account/login?from=https%3A%2F%2Fblog.csdn.net%2F&iframe=true&newframe=true&version=loginv3"
style="border-radius: 8px;" frameborder="0" scrolling="no"></iframe>
我们看到这里的iframe有一个
passport_iframe
的
name
属性,于是可以使用如下代码切换到
iframe
中:
这里使用的selenium版本为3.141.0,新版本的selenium在创建web_driver对象和定位页面元素的API上有细微差异,可以参考官方文档
from selenium import webdriver
web_driver = webdriver.Chrome("D:/chromedriver.exe")
web_driver.get("https://blog.csdn.net/")
web_driver.find_element_by_class_name("toolbar-btn-loginfun").click()"""
登录窗体已弹出,
如果直接使用新版本API中的find_element()或者旧版本API中的find_element_by_XXXX()来定位窗体中的元素,
就会抛出NoSuchElementException
需要先切换到iframe中
"""
web_driver.switch_to_frame("passport_iframe")# selenium 4.x.x中被废弃, 需要使用.switch_to.frame("passport_iframe")
web_driver.find_element_by_class_name("login-box-tabs-items").find_elements_by_tag_name("span")[2].click()
**如果要定位原本页面的元素,记得先使用
.switch_to.default_content()
从iframe中切换出来**。
好书推荐:
- 流畅的python
- Python编程 从入门到实践 第2版
- Python数据结构与算法分析 第2版
好课推荐:
- 零基础学python
- python核心技术与实战
- python自动化办公实战
写文不易,如果对你有帮助的话,来一波点赞、收藏、关注吧~👇
版权归原作者 明仔的阳光午后 所有, 如有侵权,请联系我们删除。