Selenium如何使用句柄方式切换窗口?
窗口切换
我们在使用浏览器打开链接时,通常会存在2种情况:
1. 在当前窗口打开,即覆盖。
2. 新建窗口打开,保留原有窗口。
示例:
·百度首页搜索:博客园。
· 打开博客园官网,获取当前页精华帖的标题。
· 回到百度输入框,并打印出 title。
代码如下:
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)
# 打开百度首页
driver.get('http://baidu.com')
# 输入 博客园 并点击 回车
driver.find_element_by_id('kw').send_keys('博客园\n')
# 找到博客园的官网,并点击;点击后会在新的窗口打开链接
driver.find_element_by_xpath("//h3//a[contains(.,'官网')]/../a[1]").click()
# 打印当前窗口的 title
print(driver.title)
# 打印当前窗口的 url
print(driver.current_url)
# 点击博客园的 精华 贴
driver.find_element_by_css_selector('a[title="编辑精选博文"]').click()
......
输出结果如下:
博客园_百度搜索
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%8D%9A%E5%AE%A2%E5%9B%AD&rsv_pq=fb7d28ae0001abcf&rsv_t=06598quU7hn3kFKgkuBxhCIOyMaWnFVVXEjwlgeJppBhRahvfl8rUTZcZVQ&rqlang=cn&rsv_enter=1&rsv_sug3=3&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&inputT=348&rsv_sug4=348
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"a[title="编辑精选博文"]"}
# 报错信息,未定位到该元素
浏览器实现结果
通过浏览器的实现结果,和代码的运行结果,可以判断出:即使web页面已跳转至新窗口,但是代码逻辑还在原有窗口。
为解决该问题,我们需要引入 句柄 的概念:窗口句柄 ,粗略的理解,每个窗口对应一个句柄,句柄可认为是一个唯一长字符串。
获取句柄的方法:
· 获取当前页面句柄:driver.current_window_handle
· 获取所有页面句柄:driver.window_handles
通过句柄,我们可以进行窗口的切换。
· 切换窗口:driver.switch_to.window()
示例:
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)
# 打开百度首页
driver.get('http://baidu.com')
# 输入 博客园 并点击 回车
driver.find_element_by_id('kw').send_keys('博客园\n')
# 找到博客园的官网,并点击;点击后会在新的窗口打开链接
driver.find_element_by_xpath("//h3//a[contains(.,'官网')]/../a[1]").click()
# 打印出所有的句柄信息
print(driver.window_handles)
driver.quit()
输出结果如下:
['CDwindow-998407BA3D6B34956871D337B6F377FE', 'CDwindow-844FF13AAEE0E14487AD368DEAA7A0AE']
# 从结果中我们可以看出:
# driver.window_handles的数据类型是一个 列表
让我们回到上面的需求:此时我们唯一要做的就是,打开新的窗口后,代码切换至新窗口,并输出结果。
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)
# 打开百度首页
driver.get('http://baidu.com')
# 输入 博客园 并点击 回车
driver.find_element_by_id('kw').send_keys('博客园\n')
# 找到博客园的官网,并点击;点击后会在新的窗口打开链接
driver.find_element_by_xpath("//h3//a[contains(.,'官网')]/../a[1]").click()
# 打印当前窗口的 title
print('切换前的title:',driver.title)
# 切换至新窗口
# 首先,我们要先获取到一个主句柄,作为灯塔,防止"迷路"
mainWindow = driver.current_window_handle
# 接着我们要获取所有的句柄信息,并赋值给 handles
handles = driver.window_handles
# 使用for循环,遍历所有的handles,以便判断
for handle in handles:
# 使用driver.switch_to.window()方法,切入句柄所在的窗口
driver.switch_to.window(handle)
# 判断 "代码" 是否在当前窗口的title中,如果在,跳出循环
if "代码" in driver.title:
break
# 让我们打印一下当前窗口的 title
print('切换后的title:',driver.title)
# 点击博客园的 精华 贴
driver.find_element_by_css_selector('a[title="编辑精选博文"]').click()
# 定位到标题的元素,并赋值给 items
items = driver.find_elements_by_css_selector('div[class="post_item"] h3>a')
for one in items:
print(one.text)
# 打印完成后,切回主窗口,并打印出当前窗口的 title
driver.switch_to.window(mainWindow)
print('切回主句柄的title:',driver.title)
输出结果如下:
切换前的title: 博客园_百度搜索
切换后的title: 博客园 - 代码改变世界
------------------2021-5-30 前20的精华帖-----------------------------
【面试】如果你这样回答“什么是线程安全”,面试官都会对你刮目相看
【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)
为啥程序会有bug?
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
ERP不规范,同事两行泪
只有程序员才能读懂的西游记
从软件工程的角度解读任正非的新年公开信
通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。
分布式系统关注点——99%的人都能看懂的「熔断」以及最佳实践
神经网络的基本工作原理
哎呀,我老大写Bug啦——记一次MessageQueue的优化
机器学习web服务化实战:一次吐血的服务化之路
Windbg分析高内存占用问题
我是怎么把一个项目带崩的
彼之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践
Linux的内存分页管理
通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
藏在正则表达式里的陷阱
你所不知道的日志异步落库
为什么说 Java 程序员到了必须掌握 Spring Boot 的时候?
Selenium如何使用句柄方式切换窗口?相关推荐
- selenium切换窗口
在做网页自动化测试的时候,难免会打开很多个网页,那么,如何在多个窗口之间切换呢? 获取窗口的唯一标识用句柄(handle)表示,因此只需要切换句柄,就可以灵活的在各窗口之间切换. 下面介绍几个方法 c ...
- python自动化测试selenium(四)切换页面、切换窗口
一.切换页面 如果定位元素失败(抛出NoSuchElementException),调查网页源代码,发现这个元素位于一个frame或iframe标记的元素下的子网页(html标记)里,那么此时需要切换 ...
- 【Selenium】切换/窗口切换
文章目录 1 frame切换 1.1 切换到frame 1.2 切回原来的主html 1.3 示例 2 窗口切换 2.1 切换新窗口 2.2 切回原来的窗口 2.3 示例 1 frame切换 1.1 ...
- python+selenium+new——窗口——网页——切换窗口——切换frame——alert弹窗
from selenium import webdriver driver = webdriver.Firefox() # 指定浏览器驱动 #对象实例化 ----------------------- ...
- python自动切换链接_python+selenium自动化(四)之selenium切换窗口
当我们点击某个链接时,切换换到另一个窗口,这时就需要跟随切换到新打开的页面,去定位元素. 1.获取当前页面句柄 current_window_handle importtimefrom seleni ...
- Web自动化测试Selenium(4)frame切换/窗口切换/选择框-2021-10-09
1. frame切换 1.1 问题描述 选择 class 属性值为 plant 的元素. elements = wb.find_element_by_css_selector('.plant') 表示 ...
- Python用selenium简单方法处理完子窗口切换到主窗口
百度是一个很好的例子 完成依次点击导航栏标签,前往次级页面进行处理完毕后再关闭并返回主界面的操作 最主要的就是掌握切换窗口 slenium是死的,不是说你看到哪个窗口它就帮你处理哪个窗口,需要让它切换 ...
- Python+selenium 自动化-切换窗口页签、切换iframe框架。确定页面是否包含iframe方法。
切换窗口页签: 0是左边第一个,-1是右边第一个. windows = driver.window_handles # 获得所有窗口的句柄 driver.switch_to.window(window ...
- selenium切换窗口 java_WebDriver(Selenium2) 根据新窗口title切换窗口
[在web自动化测试中点击一个链接然后弹出新窗口是比较司空见惯的事情.webdriver中处理弹出窗口跟处理frame差不多,以下面的html代码为例window.html Popup Wi ...
- Python+selenium 自动化-通过窗口名切换窗口,如何获取当前窗口的title窗口名
通过索引切换窗口 左边从0开始,-1是右边第一个窗口 windows = driver.window_handles driver.switch_to.window(windows[-1]) 通过窗口 ...
最新文章
- VTK:相互作用之ImageRegion
- MYSQL----myownstars(102)
- android读取excel文件_python里读写excel等数据文件的几种常用方式
- python 小海龟鼠标画图_Python小海龟画图
- 浅析数据库设计三范式
- CGAL学习记录——点云密度计算
- ByteBuf浅层复制的使用
- uniapp使用IPA苹果支付
- 3D游戏编程与设计5——与游戏世界交互
- Comparing Mongo DB and Couch DB
- LaTeX 参考文献的处理
- Python的exec
- sms 短信通平台 发送短信
- Parellel TSP
- js 点击按钮或者图片,实现图片上传并显示在页面上
- js 防抖是什么 JavaScript防抖怎么用
- 财务内部收益率用计算机怎么算,财务内部收益率的计算
- 牛客SQL 大厂面试真题 某滴打车 6套代码及解析
- 正则表达式八道练习题
- 计算机应用 pdf,计算机应用70546.pdf