[python][selenium] Web UI自动化切换iframe框架以及浏览器操作切换窗口和处理弹窗

news/2024/11/15 19:36:35/文章来源:https://www.cnblogs.com/laochang/p/18398952

分两部分:一、页面切换iframe框架
     二、浏览器操作:切换窗口、处理弹窗

 



一、页面切换iframe框架

3种iframe的切换方法:

1、切换iframe的方法:switch_to.frame
  入参有4种:
  1.1、id
  1.2、name
  1.3、index索引
  1.4、iframe元素对象

2、返回主文档(最外层的页面)的方法:switch_to.default_content()
3、返回到上一级iframe的方法:switch_to.parent_frame()

 


简单说下:
第一点: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 sleepdriver = 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 sleepdriver = 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 sleepdriver = 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()

传递一个iframe元素对象作为参数,需要先使用元素定位找到iframe。

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = 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 sleepdriver = 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 sleepdriver = 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()

 

 



二、浏览器操作:切换窗口、处理弹窗

一、操作浏览器弹窗:
弹窗一般分为两种:浏览器自带弹窗html的自定义弹窗。html的弹窗使用元素定位可以找到,浏览器弹窗就需要使用switch_to.alert的方法。
1、浏览器弹窗的3个种类:
告警框:alert,只有信息和一个确认按钮。
确认框:Confirm,有信息、确认和取消按钮。
提示框:Prompt,有输入框可以输入文本,有信息、确认和取消按钮。

2、switch_to.alert里面处理浏览器弹窗的4个方法:
switch_to.alert.accept():弹窗确认按钮
switch_to.alert.dismiss():弹窗取消按钮
switch_to.alert.send_keys():向弹窗输入框输入信息
switch_to.alert.text:获取弹窗上的信息内容
浏览器3种弹窗都是用这4种方法处理。

二、操作浏览器标签页:
1、current_window_handle:获取当前标签页的句柄。
2、window_handles:获取所有标签页的句柄。
3、switch_to.window(handle):切换到指定句柄的标签页。
4、close():关闭当前标签页。

直接用代码+注释演示说明
菜鸟教程网站里提供的在线编辑器可以用来做demo演示,但缺点是页面完全加载完比较慢,下面演示代码执行过程需要耐心等待下。

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.runoob.com/js/js-popup.html")# 点击按钮后,页面在新的标签页打开
print("切换前页面handle:" + driver.current_window_handle)
driver.find_element(By.CSS_SELECTOR, 'a[href="/try/try.php?filename=tryjs_prompt"]').click()# 获取到浏览器的所有标签页,以列表的类型返回
handles = driver.window_handles
print(handles)
# 在switch_to.window()方法,传入要切换的窗口的句柄,就能切换到这个标签页
driver.switch_to.window(handles[1])
# 切换后,打印当前标签页的handle、url、title信息来确认切换成功
print("切换后页面handle:" + driver.current_window_handle)
print("current_url:" + driver.current_url)
print("title:" + driver.title)# 切换到iframe里
driver.switch_to.frame(0)# 点击按钮后,弹出一个提示框
driver.find_element(By.XPATH, '//body/button').click()
# 获取提示框的信息内容并打印
print(driver.switch_to.alert.text)
sleep(3)
# 点击提示框的取消按钮
driver.switch_to.alert.dismiss()sleep(2)# 再次点击按钮,弹出提示框
driver.find_element(By.XPATH, '//body/button').click()
# 向提示框的输入框输入内容,输入信息不会显示在输入框
driver.switch_to.alert.send_keys("空之轨迹")
sleep(3)
# 点击提示框的确认按钮
driver.switch_to.alert.accept()
sleep(2)# 执行完毕,关闭当前标签页
driver.close()sleep(2)
# 关闭整个浏览器
driver.quit()

 


关联文章:Web UI自动化8种页面元素定位方式

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/795704.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js的常用类2

1.js的常用类DOM,将js,html中的各种文档,元素,标签等等封装成方法;和类

【openmediavault】更改端口后急救方案

首先,如果你手贱改了这个 导致你登陆不了的话,不要慌 找到你的控制台,我的是树莓派 将你的树莓派设置成root模式,如果服务器本身就是root就不用设置 树莓派设置root方法sudo su然后omv-firstaid 这个界面点ok即可,加载会有点慢是正常的现象#videoTogetherLoading { touch…

Git流程学习

初始化仓库特别要注意如果初始化仓库时勾选了图中第一个红框(即添加README仓库描述),它会给出下面红框的提示即将main作为默认分支,该部分的示例以此种方式初始化仓库。 注:2020年10月后GitHub宣布新建项目的默认分支将从master逐步改为main。以前一些教程给出的命令一般都…

.NET 9 RC1 正式发布

.NET 9 RC1 是 .NET 9 的第一个候选发布版本(Release Candidate),标志着该版本接近最终发布。根据Github 上相关的内容,我们可以总结出以下几点:新功能和改进:在 .NET 9 RC1 中,引入了许多新的功能和改进。例如,ASP.NET Core 在此版本中进行了多项更新,包括 SignalR 分…

监管动态| 网络空间协会首次发布合规常用APP清单,是否会有第二批?

9月10日中国网络空间安全协会官网发布公告,协会组织指导网上购物、地图导航、浏览器、新闻资讯、在线影音、电子图书、拍摄美化、云盘、短视频、演出票务共10类62款App运营方,对照《中华人民共和国网络安全法》《中华人民共和国个人信息保护法》《常见类型移动互联网应用程序…

时间embedding

左边的公式和 time_embedding(1) 的区别在于它们表示的维度不同。公式中的左边部分是一个概括性公式,用来说明如何为每个时间步 ( t ) 生成时间嵌入。而具体的 time_embedding(1) 展示的是当 ( t = 1 ) 时,如何生成一个更长维度的时间嵌入向量。 1. 左边公式的含义: 左边的公…

微信小程序开发系列8----页面配置--事件绑定

源码获取方式(免费):(1)登录-注册:http://resources.kittytiger.cn/(2)签到获取积分(3)搜索:6-wxmlevent事件绑定

LeetCode算法—滑动窗口

纵有疾风起;人生不言弃!一:滑动窗口 滑动窗口分为定长滑动窗口和非定长滑动窗口 定义:滑动窗口的题目一般都是非定长的;一般需要定义两个指针left,right;用来限制窗口的左边界和右边界;二:LeetCode 209 长度最小的数组 (1)题目:求连续最小的字串和大于目标值的最小长…

一文看懂什么是架构

对程序员来说,架构是一个常见词汇。如果想成为一名架构师,对架构概念的理解必须清晰。否则,在制定架构方案时,肯定会漏洞百出,问题频发,这将对你的面试、晋升和团队领导产生负面影响。 我们看下维基百科关于架构的定义:软件架构是抽象描述系统的一组结构,以及构建这些结…

【图论】Johnson全源最短路算法

2024-9-11 最后更新时间 2024-9-11 作者学会了一个叫做\(Johnson\)的算法,所以就有了这篇博客...... Johnson算法是一个高效处理全源最短路的算法 其实也很慢,但目前是最高效的 为了更加方便你们接下来的学习我希望你们已经掌握了基本的最短路算法(SPFA,Dijsktra,Bellman-…

更新mstsc

这次遇到的问题是系统远程程序mstsc故障,又不想重装系统, 于是通过挂载windows的ISO,想获取system32下的原版程序和相关文件, 挂载ISO后,sources文件夹下有一install.wim文件,通过以下命令提取所有系统安装文件至E盘临时目录temp下 dism /mount-wim /wimfile:"G:\so…