从0开始python学习-30.selenium frame子页面切换

目录

[1. frame切换逻辑](#1. frame切换逻辑)

[2. 多层子页面情况进行切换](#2. 多层子页面情况进行切换)

[3. 多个子页面相互切换](#3. 多个子页面相互切换)


1. frame切换逻辑

1.1. 子页面的类型一般分为两种

  • frame标签

  • iframe标签

1.2. 子页面里面的元素和主页面的元素是相互独立

  • 子页面元素需要进去切换才能操作

  • 如果已经进入子页面,那么无法操作主页面元素

  • 子页面和主页面以及其他子页面的切换操作一定要有始有终,进去了就要出来,才能操作其他元素

1.3. 注意查看需要定位的元素上层页面到底有几个,需要一层一层的切换进入子页面后才能进行操作

2. 多层子页面情况进行切换

以QQ邮箱登录页面为例:

根据F12元素定位查看【密码登录】元素往上层翻查可得知【密码登录】按钮上面有两个页面,需要逐步进入这两个页面中后才能正确查找到该元素,如果不在对应子页面中是无法获取到元素的。

python 复制代码
driver = webdriver.Chrome()
url =  "https://mail.qq.com/"
driver.get(url)
driver.maximize_window ()

driver.implicitly_wait(5)
# 进入到登录框子页面中
frame1 = driver.find_element(By.XPATH,'//*[@id="QQMailSdkTool_login_loginBox_qq"]/iframe')
driver.switch_to.frame(frame1)
# 进入到密码登录所在的子页面中
frame2 = driver.find_element(By.XPATH,'//*[@id="ptlogin_iframe"]')
driver.switch_to.frame(frame2)
# 操作密码登录按钮
element1 = driver.find_element(By.XPATH,'//*[@id="switcher_plogin"]').click()

sleep(5)
driver.quit()

3. 多个子页面相互切换

以页面中存在两个输入框为例:

由下图可知整个编辑页面是在一个【//*[@id="main-frame"]】中的,然后输入框1和输入框2分别需要进入到各自的子页面后才能进行内容的输入

python 复制代码
# 若之前就已经存在过切换子页面的操作,需要首先将页面切换到主页面
driver.switch_to.default_content()

# 切换到【编辑】的主页面
driver.implicitly_wait(5)
frame2 = driver.find_element(By.XPATH,'//*[@id="main-frame"]')
driver.switch_to.frame(frame2)

# 进入【输入框1】的子页面并写入内容
frame3 = driver.find_element(By.XPATH,'/html/body/div[2]/form/table[1]/tbody/tr[30]/td[2]/div/div/div[2]/iframe')
driver.switch_to.frame(frame3)
el3 = driver.find_element(By.XPATH,'/html/body').send_keys('输入内容')

# 操作其他动作之前需先切换到主页面,再切换整个新增子页面
driver.switch_to.default_content()
frame = driver.find_element(By.XPATH, '//*[@id="main-frame"]')
driver.switch_to.frame(frame)

# 切换到【输入框2】的子页面后再二次切换进入下一个子页面进行输入操作
frame4 = driver.find_element(By.XPATH,'/html/body/div[2]/form/table[1]/tbody/tr[32]/td[2]/div/div/div[2]/iframe')
driver.switch_to.frame(frame4)
el4 = driver.find_element(By.XPATH,'/html/body').send_keys('输入内容输入内容输入内容输入内容输入内容输入内容')

# 切记最后一定要找对页面层级进行最后的点击动作
driver.switch_to.default_content()
frame = driver.find_element(By.XPATH, '//*[@id="main-frame"]')
driver.switch_to.frame(frame)

实现效果为:

相关推荐
惜.己几秒前
使用python的读取xml文件,简单的处理成元组数组
xml·开发语言·python·测试工具
许白掰18 分钟前
Linux入门篇学习——借助 U 盘或 TF 卡拷贝程序到开发板上
linux·学习·借助 u 盘拷贝程序到开发板上·借助 tf卡拷贝程序到开发板上
倔强青铜三22 分钟前
苦练Python第23天:元组秘籍与妙用
人工智能·python·面试
apihz24 分钟前
域名WHOIS信息查询免费API使用指南
android·开发语言·数据库·网络协议·tcp/ip
coding随想37 分钟前
掌控网页的魔法之书:JavaScript DOM的奇幻之旅
开发语言·javascript·ecmascript
Norvyn_71 小时前
LeetCode|Day18|20. 有效的括号|Python刷题笔记
笔记·python·leetcode
爱吃烤鸡翅的酸菜鱼1 小时前
IDEA高效开发:Database Navigator插件安装与核心使用指南
java·开发语言·数据库·编辑器·intellij-idea·database
chao_7891 小时前
更灵活方便的初始化、清除方法——fixture【pytest】
服务器·自动化测试·python·pytest
心情好的小球藻2 小时前
Python应用进阶DAY9--类型注解Type Hinting
开发语言·python
都叫我大帅哥2 小时前
LangChain加载HTML内容全攻略:从入门到精通
python·langchain