[python][selenium] Web UI自动化页面切换iframe框架
简单说下:
第一点:iframe元素是用来在当前html里的其他元素中,再嵌套个html。
因为webdriver默认只能在一个页面上识别和操作元素,所以无法直接定位和操作主文档html和内嵌html,
要定位操作iframe内嵌页面的元素,就需要先切换到iframe。
第二点:通过查看源码,可以看到传id和name它里面是做了调用find_element方法,
也就是说方法最终需要的是iframe对象,然后把切换的操作封装成一个命令,而这个命令是json格式的。

下面我用网易云音乐首页来做demo,直接用代码+注释演示说明。
1、切换iframe的方法的4种入参
1.1、id
使用iframe元素的 id属性来传参。
from selenium import webdriver |
|
from selenium.webdriver.common.by import By |
|
from time import sleep |
|
driver = webdriver.Chrome() |
|
driver.maximize_window() |
|
driver.implicitly_wait(10) |
|
driver.get("https://music.163.com/") |
|
# 操作:从页面主文档切换到 id="g_iframe" 的iframe,定位网易云音乐轮播图右箭头按钮,用for循环点击30次 |
|
driver.switch_to.frame("g_iframe") |
|
ele = driver.find_element(By.CLASS_NAME, "btnr") |
|
for i in range(30): |
|
ele.click() |
|
sleep(0.1) |
|
sleep(3) |
|
driver.quit() |
1.2、name
使用iframe元素的 name属性来传参。
from selenium import webdriver |
|
from selenium.webdriver.common.by import By |
|
from time import sleep |
|
driver = webdriver.Chrome() |
|
driver.maximize_window() |
|
# driver.implicitly_wait(10) # 加了隐式等待后打开页面要等10秒左右才定位,不加就很快就定位了,原因还在研究中 |
|
driver.get("https://music.163.com/") |
|
# 操作:从页面主文档切换到 name="contentFrame" 的iframe,点击"用户登录"按钮 |
|
driver.switch_to.frame("contentFrame") |
|
driver.find_element(By.ID, "index-enter-default").click() |
|
sleep(3) |
|
driver.quit() |
1.3、index索引
使用索引进行传参,iframe在页面上是第几个就传第几,就算是嵌套了多层iframe也可以直接索引到。
from selenium import webdriver |
|
from selenium.webdriver.common.by import By |
|
from time import sleep |
|
driver = webdriver.Chrome() |
|
driver.maximize_window() |
|
driver.implicitly_wait(10) |
|
driver.get("https://music.163.com/") |
|
# 操作:从页面主文档切换到第1个iframe,点击热门推荐的"更多"按钮 |
|
driver.switch_to.frame(0) |
|
driver.find_element(By.CSS_SELECTOR, 'span > a[href="/discover/playlist/"]').click() |
|
sleep(3) |
|
driver.quit() |
1.4、iframe元素对象
传递一个iframe元素对象作为参数,需要先使用元素定位找到iframe。
from selenium import webdriver |
|
from selenium.webdriver.common.by import By |
|
from time import sleep |
|
driver = webdriver.Chrome() |
|
driver.maximize_window() |
|
driver.implicitly_wait(10) |
|
driver.get("https://music.163.com/") |
|
# 操作:定位到iframe元素,把元素传给switch_to.frame方法切换iframe,点击页面底部"音乐开放平台" |
|
iframe = driver.find_element(By.CSS_SELECTOR, "body > iframe") |
|
driver.switch_to.frame(iframe) |
|
driver.find_element(By.CSS_SELECTOR, 'a[href="https://developer.music.163.com/st/developer"]').click() |
|
sleep(3) |
|
driver.quit() |
2、返回主文档(最外层的页面)
如果iframe里面还有一个iframe,这时你不想操作上一层iframe,想直接回到主文档就可以使用这个方法。
from selenium import webdriver |
|
from selenium.webdriver.common.by import By |
|
from time import sleep |
|
driver = webdriver.Chrome() |
|
driver.maximize_window() |
|
driver.implicitly_wait(10) |
|
driver.get("https://music.163.com/") |
|
# 先切换iframe |
|
driver.switch_to.frame("g_iframe") |
|
# 切换回主文档(把这句注释掉,定位主文档元素就会报异常:NoSuchElementException) |
|
driver.switch_to.default_content() |
|
# 定位主文档的搜索框,输入内容 |
|
driver.find_element(By.ID, "srch").send_keys("空之轨迹") |
|
sleep(3) |
|
driver.quit() |
3、返回到上一级iframe
如果iframe里面还有一个iframe,这时你不想回到主文档,想操作上一层iframe就可以使用这个方法。
from selenium import webdriver |
|
from selenium.webdriver.common.by import By |
|
from time import sleep |
|
driver = webdriver.Chrome() |
|
driver.maximize_window() |
|
driver.implicitly_wait(10) |
|
driver.get("https://music.163.com/") |
|
# 先切换iframe (多层iframe的页面不好找,,将就下吧,原理一样的) |
|
driver.switch_to.frame("g_iframe") |
|
# 切换到上一级iframe(把这句注释掉,定位上一级iframe的元素就会报异常:NoSuchElementException) |
|
driver.switch_to.parent_frame() |
|
# 定位主文档的搜索框,输入内容 |
|
driver.find_element(By.ID, "srch").send_keys("空之轨迹") |
|
sleep(3) |
|
driver.quit() |
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

更多推荐

所有评论(0)