Selenium switch_to方法
在web应用自动化测试中,点击一个链接或者按钮会打开一个新的浏览器窗口,会出现多个窗口实例。默认情况下的焦点在主窗口(父窗口),如果要对子窗口进行操作,就需要首先切换到子窗口。
Selenium WebDriver给每个窗口指定了一个唯一的ID,Selenium通过这个唯一ID实现在多个窗口之间切换。常见的有iframe,弹出对话框alert,新窗口等。本文将介绍这几种窗口的切换。
iframe切换
在web自动化中,如果一个元素定位始终不到,如果locator没有写错,很大概率就是这个元素在iframe中。
什么是frame?
frame是html中的框架,通过使用frameset 标签将页面进行垂直或者水平分离。包含frameset、frame、 iframe三种标签。
演示代码:https://www.w3school.com.cn/tiy/t.asp?f=html_frame_cols
frame切换
切换到frame或者iframe后就可以进行操作,操作完成后需要切换回原来的框架:
driver.switch_to.frame() #根据元素id或 index切换
driver.switch_to.default_content() #切换到默认 frame
driver.switch_to.parent_frame() #切换到父级 frame
多 frame切换
测试页面:https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable
切换iframe,打印'请拖拽我'元素文本

def test_iframe(self):
self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
self.driver.switch_to.frame("iframeResult")
print(self.driver.find_element_by_id("draggable").text) # 打印'请拖拽我'
# self.driver.switch_to.parent_frame()
self.driver.switch_to.default_content()
print(self.driver.find_element_by_id("submitBTN").text) #点击运行
弹出对话框alert切换
在页面操作时会遇到 JavaScript所生成的alert、 confirm以及prompt弹框,需要对弹框操作后才能进行下一步。
操作alert常用的方法
- switch_to.alert():切换到当前页面上的警告框
- text:返回弹框文本信息
- accept():接受弹框,确认
- dismiss():取消弹框
- send_keys(keysToSend):发送文本至弹框
alert切换
测试页面还是上面的页面,拖拽后会出现一个弹框,我们打印弹框内容并点击确定。

python代码:
def test_alert(self):
self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
self.driver.switch_to.frame("iframeResult")
drag = self.driver.find_element_by_id("draggable")
drop = self.driver.find_element_by_id("droppable")
action = ActionChains(self.driver)
action.drag_and_drop(drag, drop).perform()
sleep(2)
alert = self.driver.switch_to.alert
print(alert.text)
alert.accept()
# self.driver.switch_to.alert.accept()
self.driver.switch_to.default_content()
self.driver.find_element_by_id("submitBTN").click()
sleep(3)
多窗口切换
有时候点击某些链接会打开一个新的窗口,需要先切换窗口才能在新页面上操作。selenium通过切换窗口句柄来进行多个窗口之间的切换。
处理流程
- 获取当前的窗口句柄(driver.current_window_handle)
- 获取当前会话下的所有窗口句柄(driver.window_handles)
- 切换窗口(driver.switch_to_window)
- 切回原窗口(driver.switch_to_window)
多窗口切换
1、打开百度,点击登录,进入注册界面,返回登录页
python代码:
def test_window(self):
self.driver.get("http://www.baidu.com")
self.driver.find_element_by_link_text("登录").click()
# print(self.driver.current_window_handle) # 当前的窗口句柄
self. driver.find_element_by_link_text("立即注册").click()
windows = self.driver.window_handles # 所有窗口句柄
# 切换到注册窗口
self.driver.switch_to.window(windows[-1])
self.driver.find_element_by_id("TANGRAM__PSP_4__userName").send_keys("username")
self.driver.find_element_by_id("TANGRAM__PSP_4__phone").send_keys("12345678")
sleep(2)
# 切换回登录窗口
self.driver.switch_to.window(windows[0])
self.driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click()
2、打开新窗口
def test_window2(self):
self.driver.get("http://www.baidu.com")
js = "window.open('http://www.sogou.com')"
self.driver.execute_script(js)
sleep(3)
windows = self.driver.window_handles
print(windows)
# 切换到新打开的窗口
self.driver.switch_to.window(windows[-1])
self.driver.find_element_by_id("query").send_keys("test sogou") # 搜狗搜索框
sleep(3)
self.driver.close() # 关闭新打开的窗口
# 切回窗口
self.driver.switch_to.window(windows[0])
self.driver.find_element_by_id("kw").send_keys("test baidu") # 百度搜索框
sleep(3)
获取当前焦点元素
switch_to还有一个方法叫switch_to.active_element,返回当前焦点的WebElement对象,用于判断当前焦点是否位于某个web元素。有时候需要测试打开一个网页,焦点是否在输入框,比如账号密码登录页面。
测试:打开https://www.baidu.com/,焦点在输入框
python代码:
def test_element_focus(self):
self.driver.get("https://www.baidu.com/")
baidu = self.driver.find_element_by_id("kw")
assert baidu == self.driver.switch_to.active_element
--THE END--
文章标题:Selenium switch_to方法
本文作者:hiyo
本文链接:https://hiyong.gitee.io/posts/selenium-switch_to/
欢迎关注公众号:「测试开发小记」及时接收最新技术文章!
Selenium switch_to方法的更多相关文章
- python+selenium安装方法
一.准备工具: 下载 python[python 开发环境] http://python.org/getit/ 下载 setuptools [python 的基础包工具] http://pypi.py ...
- Java&Selenium截图方法封装
Java&Selenium截图方法封装 package util; import org.apache.commons.io.FileUtils; import org.openqa.sele ...
- selenium定位方法实例
selenium定位方法实例 首先打开浏览器输入微博的网址,将网页最大化,等待3秒 from selenium import webdriver import time driver = webdri ...
- selenium定位方法(二)
selenium定位方法(二) 1.xpath定位:xpath是在XML中查找节点所在的路径的表达式 1)绝对路径的Xpath表达式 例:/html/body/div/div[1]/ul//li[3 ...
- selenium定位方法(一)
selenium定位方法-(一) 1.定位页面元素的方式(By类的方法) 1)id定位:通过页面元素的id属性值来定位一个页面元素 注意事项:如果每次刷新网页之后元素的id属性值都不同,说 ...
- selenium - switch_to.window() - 多窗口切换
在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作.WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换. 以百度首 ...
- selenium - switch_to.frame()- 内嵌表单的切换
表单嵌套frame/iframe webDriver只能在一个页面上对元素识别和定位,对于frame/iframe表单内嵌页面上的元素无法直接定位,此时就需要通过switch_to.frame()方法 ...
- Selenium使用方法整理
我采用的是Python来使用selenium库,同时java也可以使用,但不如python操作起来方便.下文都会以python的操作为例子,整理我学习selenium过程中收集到的方法. 一:安装 首 ...
- python环境安装selenium和手动下载安装selenium的方法
方法1:cmd环境下,用pip install selenium 可能会很慢 方法2:下载selenium安装包手动安装 下载地址:https://pypi.org/project/selenium/ ...
随机推荐
- [BUGCASE]前端码案概述
中医有医案之说,程序会出bug,因此想到将自己在项目中遇到的疑难bug记录下来的想法,出于以下目的: 沉淀经验 通过问题学习 训练解决问题的能力 训练文档写作能力 取名:码案(Bug Case). 医 ...
- 推荐:国产etl调度工具Taskctl web应用版,0元永久授权
写在前面 2020年疫情席卷全球,更是对整个市场经济造成了严重影响,年初疫情肆虐,西方世界单方面的科技.经济封锁,国际关系吃紧.....导致很多中小型企业业务链受阻,大型企业经费资金吃紧,轮班制导致公 ...
- odoo13之右上角弹出提示框
前言 在odoo中已经提供好了右上角弹出提示框的接口,我们只需要调用即可: 而提示框的实现又分为前端js实现和后段函数实现,前后端实现的效果相同. 实现效果图 前端实现提示框 在前端中显示提示框最常用 ...
- IdentityServer4系列 | 资源密码凭证模式
一.前言 从上一篇关于客户端凭证模式中,我们通过创建一个认证授权访问服务,定义一个API和要访问它的客户端,客户端通过IdentityServer上请求访问令牌,并使用它来控制访问API.其中,我们也 ...
- SpringBoot系列:六、集成Swagger文档
本篇开始介绍Api文档Swagger的集成 一.引入maven依赖 <dependency> <groupId>io.springfox</groupId> < ...
- xargs--冬天里的一丝暖意
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 你有批量kill作业吗?有因为删除文件夹的内容太多而报错吗?-bash: /bin/rm: ...
- Docker实战 | 第二篇:IDEA集成Docker插件实现一键自动打包部署微服务项目,一劳永逸的技术手段值得一试
一. 前言 大家在自己玩微服务项目的时候,动辄十几个服务,每次修改逐一部署繁琐不说也会浪费越来越多时间,所以本篇整理通过一次性配置实现一键部署微服务,实现真正所谓的一劳永逸. 二. 配置服务器 1. ...
- java并发编程实战《二十一》无锁工具类
不安全的累加代码,如下 1 public class Test { 2 long count = 0; 3 void add10K() { 4 int idx = 0; 5 while(idx++ & ...
- 通过Dbeaver创建表格的时候,设置主键
通过Dbeaver创建表格的时候,设置主键 Dbeaver介绍: 这是一个开源的数据库连接工具,你需要安装jre才可以使用这个软件 在使用Dbeaver创建表的时候,会发现,不能直观地设置主键 这 ...
- PyQt(Python+Qt)学习随笔:QMainWindow的tabifyDockWidget方法将QDockWidget两个停靠窗选项卡式排列
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 主窗口的tabifyDockWidget方法用于将主窗口的两个停靠窗口 ...